From patchwork Fri Nov 3 19:53:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: auh@yoctoproject.org X-Patchwork-Id: 33953 Return-Path: Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 67D72C27C4B for ; Fri, 3 Nov 2023 19:53:06 +0000 (UTC) Received: from a27-192.smtp-out.us-west-2.amazonses.com (a27-192.smtp-out.us-west-2.amazonses.com [54.240.27.192]) by mx.groups.io with SMTP id smtpd.web10.63884.1699041169953094075 for ; Fri, 03 Nov 2023 12:53:02 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@yoctoproject.org header.s=lvjh2tk576v2ro5mi6k4dt3mc6wpqbky header.b=TAI9NAIf; dkim=pass header.i=@amazonses.com header.s=hsbnp7p3ensaochzwyq5wwmceodymuwv header.b=BYnOEAXm; spf=pass (domain: us-west-2.amazonses.com, ip: 54.240.27.192, mailfrom: 0101018b96bf0084-04b60bc0-1a95-4074-bb0a-ccfcb6833ea1-000000@us-west-2.amazonses.com) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple; s=lvjh2tk576v2ro5mi6k4dt3mc6wpqbky; d=yoctoproject.org; t=1699041182; h=Content-Type:MIME-Version:From:To:Cc:Subject:Message-Id:Date; bh=dadAKI45y+yR65SrcqDdyOVMzu/Mn0KeDm33SVH0CnQ=; b=TAI9NAIfy76JqZnQXJFfmSQyLt2POBfyAx1hfjamubKjxEAuAaXyGCjHSBsn/41R Dw6pFLxSdi7GjvZUst/qNAteU0VlCrwlQZcA6bUnYCs6G/ArIHftRUiTBjU4VZF06xk bxpiBJqgXNqFTQLAzMET1sU+qVJcBtR7YQHleOco= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple; s=hsbnp7p3ensaochzwyq5wwmceodymuwv; d=amazonses.com; t=1699041182; h=Content-Type:MIME-Version:From:To:Cc:Subject:Message-Id:Date:Feedback-ID; bh=dadAKI45y+yR65SrcqDdyOVMzu/Mn0KeDm33SVH0CnQ=; b=BYnOEAXm+0jD2BvTWuE87kqOUJGViCzKPp1ycMv4kdFwTGvP89tTLix7e3OXgG4N cB8KdMVLtFHpPPFJ/ZUmE8h5+10jIkoS5SrXmgGgjzSv1VdNRCcToOKtH/8trAzLHM/ khOrxO3SIONj5W4vl2F4iuogOug/o+OnvmieY9z0= MIME-Version: 1.0 From: auh@yoctoproject.org To: Forced@yoctoproject.org, maintainer@yoctoproject.org, for@yoctoproject.org, AUH@yoctoproject.org Cc: openembedded-devel@lists.openembedded.org Subject: [AUH] safec: upgrading to 31082020 FAILED Message-ID: <0101018b96bf0084-04b60bc0-1a95-4074-bb0a-ccfcb6833ea1-000000@us-west-2.amazonses.com> Date: Fri, 3 Nov 2023 19:53:01 +0000 Feedback-ID: 1.us-west-2.9np3MYPs3fEaOBysGKSlUD4KtcmPijcmS9Az2Hwf7iQ=:AmazonSES X-SES-Outgoing: 2023.11.03-54.240.27.192 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Fri, 03 Nov 2023 19:53:05 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-devel/message/106050 Hello, this email is a notification from the Auto Upgrade Helper that the automatic attempt to upgrade the recipe *safec* to *31082020* has Failed(do_compile). Detailed error information: do_compile failed Next steps: - apply the patch: git am 0001-safec-upgrade-3.7.1-31082020.patch - check the changes to upstream patches and summarize them in the commit message, - compile an image that contains the package - perform some basic sanity tests - amend the patch and sign it off: git commit -s --reset-author --amend - send it to the appropriate mailing list Alternatively, if you believe the recipe should not be upgraded at this time, you can fill RECIPE_NO_UPDATE_REASON in respective recipe file so that automatic upgrades would no longer be attempted. Please review the attached files for further information and build/update failures. Any problem please file a bug at https://bugzilla.yoctoproject.org/enter_bug.cgi?product=Automated%20Update%20Handler Regards, The Upgrade Helper -- >8 -- From 3d65cdd2681865eac05e205f9a40c233fe0f0bc5 Mon Sep 17 00:00:00 2001 From: Upgrade Helper Date: Fri, 3 Nov 2023 18:15:47 +0000 Subject: [PATCH] safec: upgrade 3.7.1 -> 31082020 --- ...an-improved-skip-_chk-add-public-API.patch | 2396 ++++ ...002-man-fix-various-doxygen-warnings.patch | 438 + .../safec/0003-v02092020-3.6.0-release.patch | 24 + ...004-drone-no-fedora-modular-on-arm32.patch | 34 + .../0005-document-new-CI-s-tested-archs.patch | 32 + .../0006-man-improved-s-n-printf_s.patch | 42 + ..._set-remove-duplicate-MEMORY_BARRIER.patch | 31 + ...d-mem_prim_set-test-without-MEMORY_B.patch | 101 + ..._memset_s-proper-timer-linearization.patch | 175 + ...t-perf-functions-into-perf_private.h.patch | 581 + .../safec/0011-.gitgnore-new-files.patch | 30 + ...-perf-fix-aarch64-and-add-more-archs.patch | 97 + .../0013-add-support-banner-and-link.patch | 2912 +++++ .../0014-add-rst-and-md-in-parallel.patch | 335 + .../safec/0015-generate-README.rst.patch | 917 ++ .../0016-travis-disable-unfree-osx.patch | 31 + ...e-NDEBUG-only-if-not-already-defined.patch | 24 + ...ic-versioning-3.7-change-PACKAGE-nam.patch | 254 + .../safec/0019-update-freebsd-smoker.patch | 28 + .../0020-fix-mingw-keyring-mess-again.patch | 44 + ...ll-wchar-manpages-with-disable-wchar.patch | 163 + .../0022-kernel-fix-for-time64_t-only.patch | 24 + ...23-configure-replace-obsolute-macros.patch | 82 + .../safec/safec/0024-add-GH-Actions.patch | 151 + ...25-avoid-macro-redefinition-warnings.patch | 60 + .../safec/safec/0026-add-stpcpy_s.patch | 585 + ...LOW-being-an-enum-value-rather-than-.patch | 31 + .../safec/safec/0028-stpcpy_s-doc-typo.patch | 22 + ...29-avoid-macro-redefinition-warnings.patch | 21 + ...0030-stpcpy_s-rename-err-arg-to-errp.patch | 145 + .../safec/safec/0031-add-stpncpy_s.patch | 665 + ...t-probe-for-wchar-with-disable-wchar.patch | 185 + .../safec/safec/0033-doxyfile-update.patch | 64 + ...std-c-11-already-defines-_GNU_SOURCE.patch | 154 + ...-mingw-fixes-disable-p_memset_s-test.patch | 89 + .../safec/0036-fixup-smoker-for-mingw.patch | 106 + .../0037-fix-sprintf_s-with-arg-GH-97.patch | 62 + .../0038-WIP-start-with-our-own-printf.patch | 1343 ++ ...printf_s-catch-s-ESNULLP-and-ESNOSPC.patch | 406 + .../safec/0040-new-safe-f-printf_s-also.patch | 270 + ...1-printf_s-catch-more-ESNOSPC-errors.patch | 142 + .../safec/0042-fix-all-printf_s-tests.patch | 420 + ...rename-_vsnprintf_s-to-__vsnprintf_s.patch | 76 + ...disable-fixup-some-io-for-the-kernel.patch | 37 + ...ntf_s-use-the-new-secure-vsnprintf_s.patch | 151 + ...0046-doc-fix-retval-doxygen-warnings.patch | 101 + .../0047-add-ESNOSPC-check-to-qsort_s.patch | 94 + ...-bsearch_s-error-messages-to-qsort_s.patch | 96 + ...-prefix-for-internal-printf-function.patch | 572 + ...-printf-add-name-of-failing-function.patch | 499 + ...tly-reject-illegal-format-specifiers.patch | 64 + ...rint-to-closed-stream-external-errno.patch | 365 + ...053-Add-Changelog-for-upcoming-3.7.0.patch | 31 + ..._vfprintf_s-test-more-fprintf-errors.patch | 223 + ...0055-fix-compilation-with-c-std-c-11.patch | 22 + .../safec/safec/0056-fix-t_vfprintf_s.patch | 287 + .../0057-update-coverages-smoke.sh.patch | 134 + ...configure-more-required-safec-CFLAGS.patch | 36 + ...gure.ac-add-disable-hardening-option.patch | 67 + .../safec/0060-ChangeLog-for-PR-107.patch | 23 + .../safec/0061-fixup-mingw-GH-action.patch | 57 + ...-clash-protection-on-macOS-clang-yet.patch | 30 + .../safec/safec/0063-minor-docs-m4.patch | 46 + ...-getenv_s-allow-dest-NULL-and-dmax-0.patch | 158 + .../safec/0065-fixup-header-includes.patch | 104 + .../safec/0066-fixup-test_towfc_s-a-bit.patch | 34 + ...7-export-SAFECLIB_UNICODE_VERSION-13.patch | 152 + .../safec/0068-update-to-Unicode-14.patch | 10124 ++++++++++++++++ ...t-stack-addresses-detected-by-gcc-12.patch | 41 + ...don-t-fail-some-tests-if-wget-failed.patch | 97 + .../safec/safec/0071-Release-3.7.patch | 207 + .../0072-post-release-fixups-vVERSION.patch | 30 + .../0073-appveyor-disable-failing-mingw.patch | 37 + .../safec/0074-drone-upgrade-a-bit.patch | 32 + .../safec/0075-powerpc-compilation-fix.patch | 23 + .../safec/safec/0076-Release-3.7.1.patch | 52 + .../{safec_3.7.1.bb => safec_31082020.bb} | 78 +- 77 files changed, 27895 insertions(+), 1 deletion(-) create mode 100644 meta-oe/recipes-core/safec/safec/0001-man-improved-skip-_chk-add-public-API.patch create mode 100644 meta-oe/recipes-core/safec/safec/0002-man-fix-various-doxygen-warnings.patch create mode 100644 meta-oe/recipes-core/safec/safec/0003-v02092020-3.6.0-release.patch create mode 100644 meta-oe/recipes-core/safec/safec/0004-drone-no-fedora-modular-on-arm32.patch create mode 100644 meta-oe/recipes-core/safec/safec/0005-document-new-CI-s-tested-archs.patch create mode 100644 meta-oe/recipes-core/safec/safec/0006-man-improved-s-n-printf_s.patch create mode 100644 meta-oe/recipes-core/safec/safec/0007-mem_prim_set-remove-duplicate-MEMORY_BARRIER.patch create mode 100644 meta-oe/recipes-core/safec/safec/0008-perf_memset_s-add-mem_prim_set-test-without-MEMORY_B.patch create mode 100644 meta-oe/recipes-core/safec/safec/0009-improve-perf_memset_s-proper-timer-linearization.patch create mode 100644 meta-oe/recipes-core/safec/safec/0010-extract-perf-functions-into-perf_private.h.patch create mode 100644 meta-oe/recipes-core/safec/safec/0011-.gitgnore-new-files.patch create mode 100644 meta-oe/recipes-core/safec/safec/0012-perf-fix-aarch64-and-add-more-archs.patch create mode 100644 meta-oe/recipes-core/safec/safec/0013-add-support-banner-and-link.patch create mode 100644 meta-oe/recipes-core/safec/safec/0014-add-rst-and-md-in-parallel.patch create mode 100644 meta-oe/recipes-core/safec/safec/0015-generate-README.rst.patch create mode 100644 meta-oe/recipes-core/safec/safec/0016-travis-disable-unfree-osx.patch create mode 100644 meta-oe/recipes-core/safec/safec/0017-Define-NDEBUG-only-if-not-already-defined.patch create mode 100644 meta-oe/recipes-core/safec/safec/0018-switch-to-semantic-versioning-3.7-change-PACKAGE-nam.patch create mode 100644 meta-oe/recipes-core/safec/safec/0019-update-freebsd-smoker.patch create mode 100644 meta-oe/recipes-core/safec/safec/0020-fix-mingw-keyring-mess-again.patch create mode 100644 meta-oe/recipes-core/safec/safec/0021-Dont-install-wchar-manpages-with-disable-wchar.patch create mode 100644 meta-oe/recipes-core/safec/safec/0022-kernel-fix-for-time64_t-only.patch create mode 100644 meta-oe/recipes-core/safec/safec/0023-configure-replace-obsolute-macros.patch create mode 100644 meta-oe/recipes-core/safec/safec/0024-add-GH-Actions.patch create mode 100644 meta-oe/recipes-core/safec/safec/0025-avoid-macro-redefinition-warnings.patch create mode 100644 meta-oe/recipes-core/safec/safec/0026-add-stpcpy_s.patch create mode 100644 meta-oe/recipes-core/safec/safec/0027-Cope-with-EOVERFLOW-being-an-enum-value-rather-than-.patch create mode 100644 meta-oe/recipes-core/safec/safec/0028-stpcpy_s-doc-typo.patch create mode 100644 meta-oe/recipes-core/safec/safec/0029-avoid-macro-redefinition-warnings.patch create mode 100644 meta-oe/recipes-core/safec/safec/0030-stpcpy_s-rename-err-arg-to-errp.patch create mode 100644 meta-oe/recipes-core/safec/safec/0031-add-stpncpy_s.patch create mode 100644 meta-oe/recipes-core/safec/safec/0032-configure-don-t-probe-for-wchar-with-disable-wchar.patch create mode 100644 meta-oe/recipes-core/safec/safec/0033-doxyfile-update.patch create mode 100644 meta-oe/recipes-core/safec/safec/0034-gcc-std-c-11-already-defines-_GNU_SOURCE.patch create mode 100644 meta-oe/recipes-core/safec/safec/0035-mingw-fixes-disable-p_memset_s-test.patch create mode 100644 meta-oe/recipes-core/safec/safec/0036-fixup-smoker-for-mingw.patch create mode 100644 meta-oe/recipes-core/safec/safec/0037-fix-sprintf_s-with-arg-GH-97.patch create mode 100644 meta-oe/recipes-core/safec/safec/0038-WIP-start-with-our-own-printf.patch create mode 100644 meta-oe/recipes-core/safec/safec/0039-vsnprintf_s-catch-s-ESNULLP-and-ESNOSPC.patch create mode 100644 meta-oe/recipes-core/safec/safec/0040-new-safe-f-printf_s-also.patch create mode 100644 meta-oe/recipes-core/safec/safec/0041-printf_s-catch-more-ESNOSPC-errors.patch create mode 100644 meta-oe/recipes-core/safec/safec/0042-fix-all-printf_s-tests.patch create mode 100644 meta-oe/recipes-core/safec/safec/0043-rename-_vsnprintf_s-to-__vsnprintf_s.patch create mode 100644 meta-oe/recipes-core/safec/safec/0044-disable-fixup-some-io-for-the-kernel.patch create mode 100644 meta-oe/recipes-core/safec/safec/0045-let-vfprintf_s-use-the-new-secure-vsnprintf_s.patch create mode 100644 meta-oe/recipes-core/safec/safec/0046-doc-fix-retval-doxygen-warnings.patch create mode 100644 meta-oe/recipes-core/safec/safec/0047-add-ESNOSPC-check-to-qsort_s.patch create mode 100644 meta-oe/recipes-core/safec/safec/0048-adjust-bsearch_s-error-messages-to-qsort_s.patch create mode 100644 meta-oe/recipes-core/safec/safec/0049-add-safec_-prefix-for-internal-printf-function.patch create mode 100644 meta-oe/recipes-core/safec/safec/0050-printf-add-name-of-failing-function.patch create mode 100644 meta-oe/recipes-core/safec/safec/0051-printf-correctly-reject-illegal-format-specifiers.patch create mode 100644 meta-oe/recipes-core/safec/safec/0052-printf-catch-print-to-closed-stream-external-errno.patch create mode 100644 meta-oe/recipes-core/safec/safec/0053-Add-Changelog-for-upcoming-3.7.0.patch create mode 100644 meta-oe/recipes-core/safec/safec/0054-WIP-test_vfprintf_s-test-more-fprintf-errors.patch create mode 100644 meta-oe/recipes-core/safec/safec/0055-fix-compilation-with-c-std-c-11.patch create mode 100644 meta-oe/recipes-core/safec/safec/0056-fix-t_vfprintf_s.patch create mode 100644 meta-oe/recipes-core/safec/safec/0057-update-coverages-smoke.sh.patch create mode 100644 meta-oe/recipes-core/safec/safec/0058-configure-more-required-safec-CFLAGS.patch create mode 100644 meta-oe/recipes-core/safec/safec/0059-configure.ac-add-disable-hardening-option.patch create mode 100644 meta-oe/recipes-core/safec/safec/0060-ChangeLog-for-PR-107.patch create mode 100644 meta-oe/recipes-core/safec/safec/0061-fixup-mingw-GH-action.patch create mode 100644 meta-oe/recipes-core/safec/safec/0062-no-stack-clash-protection-on-macOS-clang-yet.patch create mode 100644 meta-oe/recipes-core/safec/safec/0063-minor-docs-m4.patch create mode 100644 meta-oe/recipes-core/safec/safec/0064-getenv_s-allow-dest-NULL-and-dmax-0.patch create mode 100644 meta-oe/recipes-core/safec/safec/0065-fixup-header-includes.patch create mode 100644 meta-oe/recipes-core/safec/safec/0066-fixup-test_towfc_s-a-bit.patch create mode 100644 meta-oe/recipes-core/safec/safec/0067-export-SAFECLIB_UNICODE_VERSION-13.patch create mode 100644 meta-oe/recipes-core/safec/safec/0068-update-to-Unicode-14.patch create mode 100644 meta-oe/recipes-core/safec/safec/0069-fix-qsort-stack-addresses-detected-by-gcc-12.patch create mode 100644 meta-oe/recipes-core/safec/safec/0070-don-t-fail-some-tests-if-wget-failed.patch create mode 100644 meta-oe/recipes-core/safec/safec/0071-Release-3.7.patch create mode 100644 meta-oe/recipes-core/safec/safec/0072-post-release-fixups-vVERSION.patch create mode 100644 meta-oe/recipes-core/safec/safec/0073-appveyor-disable-failing-mingw.patch create mode 100644 meta-oe/recipes-core/safec/safec/0074-drone-upgrade-a-bit.patch create mode 100644 meta-oe/recipes-core/safec/safec/0075-powerpc-compilation-fix.patch create mode 100644 meta-oe/recipes-core/safec/safec/0076-Release-3.7.1.patch rename meta-oe/recipes-core/safec/{safec_3.7.1.bb => safec_31082020.bb} (10%) diff --git a/meta-oe/recipes-core/safec/safec/0001-man-improved-skip-_chk-add-public-API.patch b/meta-oe/recipes-core/safec/safec/0001-man-improved-skip-_chk-add-public-API.patch new file mode 100644 index 000000000..e3e3a272f --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0001-man-improved-skip-_chk-add-public-API.patch @@ -0,0 +1,2396 @@ +From d6bb3ff55d704d13e118675a1059c76ead12e636 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Tue, 1 Sep 2020 10:56:05 +0200 +Subject: [PATCH] man improved: skip _chk, add public API + +Skip the _chk functions, only document the public macro API. +See GH #33 +--- + Doxyfile.in | 6 ++--- + src/extmem/memccpy_s.c | 8 ++++++- + src/extmem/memchr_s.c | 8 ++++++- + src/extmem/memcmp16_s.c | 8 ++++++- + src/extmem/memcmp32_s.c | 8 ++++++- + src/extmem/memcmp_s.c | 8 ++++++- + src/extmem/memcpy16_s.c | 8 ++++++- + src/extmem/memcpy32_s.c | 8 ++++++- + src/extmem/memmove16_s.c | 7 +++++- + src/extmem/memmove32_s.c | 7 +++++- + src/extmem/memrchr_s.c | 8 ++++++- + src/extmem/memset16_s.c | 7 +++++- + src/extmem/memset32_s.c | 7 +++++- + src/extmem/memzero16_s.c | 7 +++++- + src/extmem/memzero32_s.c | 7 +++++- + src/extmem/memzero_s.c | 7 +++++- + src/extmem/timingsafe_bcmp.c | 7 +++++- + src/extmem/timingsafe_memcmp.c | 7 +++++- + src/extstr/strcasecmp_s.c | 8 ++++++- + src/extstr/strcasestr_s.c | 8 ++++++- + src/extstr/strchr_s.c | 8 ++++++- + src/extstr/strcmp_s.c | 8 ++++++- + src/extstr/strcmpfld_s.c | 8 ++++++- + src/extstr/strcoll_s.c | 8 ++++++- + src/extstr/strcpyfld_s.c | 7 +++++- + src/extstr/strcpyfldin_s.c | 7 +++++- + src/extstr/strcpyfldout_s.c | 7 +++++- + src/extstr/strcspn_s.c | 8 ++++++- + src/extstr/strfirstchar_s.c | 7 +++++- + src/extstr/strfirstdiff_s.c | 8 ++++++- + src/extstr/strfirstsame_s.c | 9 +++++++- + src/extstr/strisalphanumeric_s.c | 10 ++++++-- + src/extstr/strisascii_s.c | 7 +++++- + src/extstr/strisdigit_s.c | 7 +++++- + src/extstr/strishex_s.c | 7 +++++- + src/extstr/strislowercase_s.c | 7 +++++- + src/extstr/strismixedcase_s.c | 7 +++++- + src/extstr/strispassword_s.c | 7 +++++- + src/extstr/strisuppercase_s.c | 7 +++++- + src/extstr/strlastchar_s.c | 7 +++++- + src/extstr/strlastdiff_s.c | 8 ++++++- + src/extstr/strlastsame_s.c | 8 ++++++- + src/extstr/strljustify_s.c | 7 +++++- + src/extstr/strnatcmp_s.c | 8 ++++++- + src/extstr/strnset_s.c | 9 ++++++-- + src/extstr/strnterminate_s.c | 7 +++++- + src/extstr/strpbrk_s.c | 10 +++++--- + src/extstr/strprefix_s.c | 7 +++++- + src/extstr/strrchr_s.c | 7 +++++- + src/extstr/strremovews_s.c | 7 +++++- + src/extstr/strset_s.c | 7 +++++- + src/extstr/strspn_s.c | 8 ++++++- + src/extstr/strstr_s.c | 9 +++++++- + src/extstr/strtolowercase_s.c | 7 +++++- + src/extstr/strtouppercase_s.c | 7 +++++- + src/extstr/strzero_s.c | 8 ++++++- + src/extwchar/towfc_s.c | 9 ++++++-- + src/extwchar/wcscmp_s.c | 9 +++++++- + src/extwchar/wcscoll_s.c | 10 ++++++-- + src/extwchar/wcsfc_s.c | 9 ++++++-- + src/extwchar/wcsicmp_s.c | 9 +++++++- + src/extwchar/wcslwr_s.c | 8 +++++-- + src/extwchar/wcsnatcmp_s.c | 9 +++++++- + src/extwchar/wcsncmp_s.c | 10 ++++++-- + src/extwchar/wcsnorm_s.c | 39 ++++++++++++++++++++++++++++---- + src/extwchar/wcsnset_s.c | 9 ++++++-- + src/extwchar/wcsset_s.c | 9 ++++++-- + src/extwchar/wcsstr_s.c | 10 ++++++-- + src/extwchar/wcsupr_s.c | 8 +++++-- + src/extwchar/wmemcmp_s.c | 8 ++++++- + src/io/gets_s.c | 7 +++++- + src/io/tmpnam_s.c | 7 +++++- + src/mem/memcpy_s.c | 8 ++++++- + src/mem/memmove_s.c | 7 +++++- + src/mem/memset_s.c | 7 +++++- + src/misc/bsearch_s.c | 10 +++++++- + src/misc/qsort_s.c | 10 +++++++- + src/os/asctime_s.c | 7 +++++- + src/os/ctime_s.c | 7 +++++- + src/os/getenv_s.c | 8 ++++++- + src/os/gmtime_s.c | 4 ++-- + src/str/strcat_s.c | 9 +++++++- + src/str/strcpy_s.c | 7 +++++- + src/str/strerror_s.c | 8 +++++-- + src/str/strncat_s.c | 8 ++++++- + src/str/strncpy_s.c | 8 ++++++- + src/str/strnlen_s.c | 7 +++++- + src/str/strtok_s.c | 9 ++++++-- + src/str/vsnprintf_s.c | 9 ++++++-- + src/str/vsprintf_s.c | 8 ++++++- + src/wchar/mbsrtowcs_s.c | 11 +++++++-- + src/wchar/mbstowcs_s.c | 9 +++++++- + src/wchar/snwprintf_s.c | 6 +++-- + src/wchar/swprintf_s.c | 6 +++-- + src/wchar/vsnwprintf_s.c | 9 ++++++-- + src/wchar/vswprintf_s.c | 9 ++++++-- + src/wchar/wcrtomb_s.c | 9 ++++++-- + src/wchar/wcscat_s.c | 7 +++++- + src/wchar/wcscpy_s.c | 11 +++++---- + src/wchar/wcsncat_s.c | 9 ++++++-- + src/wchar/wcsncpy_s.c | 9 ++++++-- + src/wchar/wcsnlen_s.c | 8 +++++-- + src/wchar/wcsrtombs_s.c | 10 ++++++-- + src/wchar/wcstok_s.c | 9 ++++++-- + src/wchar/wcstombs_s.c | 9 +++++++- + src/wchar/wctomb_s.c | 8 ++++++- + src/wchar/wmemcpy_s.c | 8 +++++-- + src/wchar/wmemmove_s.c | 7 +++++- + 108 files changed, 743 insertions(+), 146 deletions(-) + +diff --git a/Doxyfile.in b/Doxyfile.in +index a93fee14..57220b52 100644 +--- a/Doxyfile.in ++++ b/Doxyfile.in +@@ -38,7 +38,7 @@ INHERIT_DOCS = YES + SEPARATE_MEMBER_PAGES = NO + TAB_SIZE = 4 + ALIASES = +-TCL_SUBST = ++#TCL_SUBST = + OPTIMIZE_OUTPUT_FOR_C = YES + OPTIMIZE_OUTPUT_JAVA = NO + OPTIMIZE_FOR_FORTRAN = NO +@@ -290,12 +290,12 @@ GENERATE_TAGFILE = + ALLEXTERNALS = NO + EXTERNAL_GROUPS = YES + EXTERNAL_PAGES = YES +-PERL_PATH = /usr/bin/perl ++#PERL_PATH = /usr/bin/perl + #--------------------------------------------------------------------------- + # Configuration options related to the dot tool + #--------------------------------------------------------------------------- + CLASS_DIAGRAMS = YES +-MSCGEN_PATH = ++#MSCGEN_PATH = + DIA_PATH = + HIDE_UNDOC_RELATIONS = YES + HAVE_DOT = YES +diff --git a/src/extmem/memccpy_s.c b/src/extmem/memccpy_s.c +index 4766c94c..32ef5b7c 100644 +--- a/src/extmem/memccpy_s.c ++++ b/src/extmem/memccpy_s.c +@@ -80,9 +80,15 @@ + * @see + * memcpy_s(), strncpy_s() + */ ++#ifdef FOR_DOXYGEN ++errno_t memccpy_s(void *restrict dest, rsize_t dmax, ++ const void *restrict src, int c, rsize_t n) ++#else + EXPORT errno_t _memccpy_s_chk(void *restrict dest, rsize_t dmax, + const void *restrict src, int c, rsize_t n, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + uint8_t *dp; + const uint8_t *sp; + rsize_t orig_dmax = dmax; +diff --git a/src/extmem/memchr_s.c b/src/extmem/memchr_s.c +index e353bc35..91b6265c 100644 +--- a/src/extmem/memchr_s.c ++++ b/src/extmem/memchr_s.c +@@ -66,9 +66,15 @@ + * strchr_s(), strspn_s(), strcspn_s(), strpbrk_s(), strstr_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t memchr_s(const void *restrict dest, rsize_t dmax, ++ const int ch, void **result) ++#else + EXPORT errno_t _memchr_s_chk(const void *restrict dest, rsize_t dmax, + const int ch, void **result, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + if (unlikely(result == NULL)) { + invoke_safe_mem_constraint_handler("memchr_s: result is null", + (void *)dest, ESNULLP); +diff --git a/src/extmem/memcmp16_s.c b/src/extmem/memcmp16_s.c +index 997a17fd..73385817 100644 +--- a/src/extmem/memcmp16_s.c ++++ b/src/extmem/memcmp16_s.c +@@ -80,9 +80,15 @@ + * + */ + ++#ifdef FOR_DOXYGEN ++errno_t memcmp16_s(const uint16_t *dest, rsize_t dlen, ++ const uint16_t *src, rsize_t slen, int *diff) ++#else + EXPORT errno_t _memcmp16_s_chk(const uint16_t *dest, rsize_t dlen, + const uint16_t *src, rsize_t slen, int *diff, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + size_t dmax; /* in bytes */ + size_t smax; /* in bytes */ + +diff --git a/src/extmem/memcmp32_s.c b/src/extmem/memcmp32_s.c +index 2cb3120b..69702625 100644 +--- a/src/extmem/memcmp32_s.c ++++ b/src/extmem/memcmp32_s.c +@@ -79,9 +79,15 @@ + * memcmp_s(), memcmp16_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t memcmp32_s(const uint32_t *dest, rsize_t dlen, ++ const uint32_t *src, rsize_t slen, int *diff) ++#else + EXPORT errno_t _memcmp32_s_chk(const uint32_t *dest, rsize_t dlen, + const uint32_t *src, rsize_t slen, int *diff, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + uint32_t smax; /* in bytes */ + uint32_t dmax; /* in bytes */ + +diff --git a/src/extmem/memcmp_s.c b/src/extmem/memcmp_s.c +index 18aa75c2..78fef348 100644 +--- a/src/extmem/memcmp_s.c ++++ b/src/extmem/memcmp_s.c +@@ -80,9 +80,15 @@ + * + */ + ++#ifdef FOR_DOXYGEN ++errno_t memcmp_s(const void *dest, rsize_t dmax, const void *src, ++ rsize_t slen, int *diff) ++#else + EXPORT errno_t _memcmp_s_chk(const void *dest, rsize_t dmax, const void *src, + rsize_t slen, int *diff, const size_t destbos, +- const size_t srcbos) { ++ const size_t srcbos) ++#endif ++{ + const uint8_t *dp; + const uint8_t *sp; + +diff --git a/src/extmem/memcpy16_s.c b/src/extmem/memcpy16_s.c +index 2d383b3c..6aefffbb 100644 +--- a/src/extmem/memcpy16_s.c ++++ b/src/extmem/memcpy16_s.c +@@ -81,9 +81,15 @@ + * wmemcpy_s(), memcpy_s(), memcpy32_s(), wmemmove_s(), memmove16_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t memcpy16_s(uint16_t *dest, rsize_t dmax, ++ const uint16_t *src, rsize_t slen) ++#else + EXPORT errno_t _memcpy16_s_chk(uint16_t *dest, rsize_t dmax, + const uint16_t *src, rsize_t slen, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + size_t smax; /* in bytes */ + + if (unlikely(slen == 0)) { /* Since C11 slen=0 is allowed */ +diff --git a/src/extmem/memcpy32_s.c b/src/extmem/memcpy32_s.c +index b87230a5..4c6ebcad 100644 +--- a/src/extmem/memcpy32_s.c ++++ b/src/extmem/memcpy32_s.c +@@ -81,9 +81,15 @@ + * memcpy_s(), memcpy16_s(), memmove_s(), memmove16_s(), memmove32_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t memcpy32_s(uint32_t *dest, rsize_t dmax, ++ const uint32_t *src, rsize_t slen) ++#else + EXPORT errno_t _memcpy32_s_chk(uint32_t *dest, rsize_t dmax, + const uint32_t *src, rsize_t slen, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + size_t smax; /* in bytes */ + + if (unlikely(slen == 0)) { /* Since C11 slen=0 is allowed */ +diff --git a/src/extmem/memmove16_s.c b/src/extmem/memmove16_s.c +index d7bba397..c2a3449e 100644 +--- a/src/extmem/memmove16_s.c ++++ b/src/extmem/memmove16_s.c +@@ -82,9 +82,14 @@ + * memmove_s(), memmove32_s(), memcpy_s(), memcpy16_s() memcpy32_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t memmove16_s(uint16_t *dest, rsize_t dmax, const uint16_t *src, rsize_t slen) ++#else + EXPORT errno_t _memmove16_s_chk(uint16_t *dest, rsize_t dmax, + const uint16_t *src, rsize_t slen, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + size_t smax; /* in bytes */ + + if (unlikely(slen == 0)) { /* Since C11 slen=0 is allowed */ +diff --git a/src/extmem/memmove32_s.c b/src/extmem/memmove32_s.c +index f7f7981f..2cc60c94 100644 +--- a/src/extmem/memmove32_s.c ++++ b/src/extmem/memmove32_s.c +@@ -84,9 +84,14 @@ + * memmove_s(), memmove16_s(), memcpy_s(), memcpy16_s() memcpy32_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t memmove32_s(uint32_t *dest, rsize_t dmax, const uint32_t *src, rsize_t slen) ++#else + EXPORT errno_t _memmove32_s_chk(uint32_t *dest, rsize_t dmax, + const uint32_t *src, rsize_t slen, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + size_t smax; /* in bytes */ + + if (unlikely(slen == 0)) { /* Since C11 slen=0 is allowed */ +diff --git a/src/extmem/memrchr_s.c b/src/extmem/memrchr_s.c +index 8d10a7b9..2ffeabaa 100644 +--- a/src/extmem/memrchr_s.c ++++ b/src/extmem/memrchr_s.c +@@ -76,9 +76,15 @@ extern void *memrchr(const void *, int, size_t); + * memrchr_s(), strchr_s(), memchr_s(), strspn_s(), strstr_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t memrchr_s(const void *restrict dest, rsize_t dmax, ++ const int ch, void **result) ++#else + EXPORT errno_t _memrchr_s_chk(const void *restrict dest, rsize_t dmax, + const int ch, void **result, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + if (unlikely(result == NULL)) { + invoke_safe_str_constraint_handler("memrchr_s: result is null", NULL, + ESNULLP); +diff --git a/src/extmem/memset16_s.c b/src/extmem/memset16_s.c +index 0437310a..1da0082b 100644 +--- a/src/extmem/memset16_s.c ++++ b/src/extmem/memset16_s.c +@@ -76,8 +76,13 @@ + * memset_s(), memset32_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t memset16_s(uint16_t *dest, rsize_t dmax, uint16_t value, rsize_t n) ++#else + EXPORT errno_t _memset16_s_chk(uint16_t *dest, rsize_t dmax, uint16_t value, +- rsize_t n, const size_t destbos) { ++ rsize_t n, const size_t destbos) ++#endif ++{ + errno_t err; + + CHK_DEST_MEM_NULL("memset16_s") +diff --git a/src/extmem/memset32_s.c b/src/extmem/memset32_s.c +index f32e201f..11733cb2 100644 +--- a/src/extmem/memset32_s.c ++++ b/src/extmem/memset32_s.c +@@ -76,8 +76,13 @@ + * memset_s(), memset16_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t memset32_s(uint32_t *dest, rsize_t dmax, uint32_t value, rsize_t n) ++#else + EXPORT errno_t _memset32_s_chk(uint32_t *dest, rsize_t dmax, uint32_t value, +- rsize_t n, const size_t destbos) { ++ rsize_t n, const size_t destbos) ++#endif ++{ + errno_t err; + + CHK_DEST_MEM_NULL("memset32_s") +diff --git a/src/extmem/memzero16_s.c b/src/extmem/memzero16_s.c +index a1d1ce42..3cf84097 100644 +--- a/src/extmem/memzero16_s.c ++++ b/src/extmem/memzero16_s.c +@@ -66,8 +66,13 @@ + * memzero_s(), memzero32_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t memzero16_s(uint16_t *dest, rsize_t len) ++#else + EXPORT errno_t _memzero16_s_chk(uint16_t *dest, rsize_t len, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + rsize_t dmax = len * 2; + CHK_DEST_MEM_NULL("memzero16_s") + CHK_DMAX_MEM_ZERO("memzero16_s") +diff --git a/src/extmem/memzero32_s.c b/src/extmem/memzero32_s.c +index 2a31a33e..7518412d 100644 +--- a/src/extmem/memzero32_s.c ++++ b/src/extmem/memzero32_s.c +@@ -65,8 +65,13 @@ + * memzero_s(), memzero16_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t memzero32_s(uint32_t *dest, rsize_t len) ++#else + EXPORT errno_t _memzero32_s_chk(uint32_t *dest, rsize_t len, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + + rsize_t dmax = len * 4; + CHK_DEST_MEM_NULL("memzero32_s") +diff --git a/src/extmem/memzero_s.c b/src/extmem/memzero_s.c +index 20cb2784..b4b03ef8 100644 +--- a/src/extmem/memzero_s.c ++++ b/src/extmem/memzero_s.c +@@ -73,7 +73,12 @@ + * memzero16_s(), memzero32_s() + * + */ +-EXPORT errno_t _memzero_s_chk(void *dest, rsize_t len, const size_t destbos) { ++#ifdef FOR_DOXYGEN ++errno_t memzero_s(void *dest, rsize_t len) ++#else ++EXPORT errno_t _memzero_s_chk(void *dest, rsize_t len, const size_t destbos) ++#endif ++{ + rsize_t dmax = len; + CHK_DEST_MEM_NULL("memzero_s") + CHK_DMAX_MEM_ZERO("memzero_s") +diff --git a/src/extmem/timingsafe_bcmp.c b/src/extmem/timingsafe_bcmp.c +index b84cb377..15a8fd59 100644 +--- a/src/extmem/timingsafe_bcmp.c ++++ b/src/extmem/timingsafe_bcmp.c +@@ -51,8 +51,13 @@ + * + */ + ++#ifdef FOR_DOXYGEN ++int timingsafe_bcmp(const void *b1, const void *b2, size_t n) ++#else + EXPORT int _timingsafe_bcmp_chk(const void *b1, const void *b2, size_t n, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + const unsigned char *p1 = (const unsigned char *)b1, + *p2 = (const unsigned char *)b2; + int ret = 0; +diff --git a/src/extmem/timingsafe_memcmp.c b/src/extmem/timingsafe_memcmp.c +index 90c88937..dc1b8ee2 100644 +--- a/src/extmem/timingsafe_memcmp.c ++++ b/src/extmem/timingsafe_memcmp.c +@@ -50,8 +50,13 @@ + * memcmp_s(), timingsafe_bcmp() + */ + ++#ifdef FOR_DOXYGEN ++int timingsafe_memcmp(const void *b1, const void *b2, size_t len) ++#else + EXPORT int _timingsafe_memcmp_chk(const void *b1, const void *b2, size_t len, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + const unsigned char *p1 = (const unsigned char *)b1, + *p2 = (const unsigned char *)b2; + size_t i; +diff --git a/src/extstr/strcasecmp_s.c b/src/extstr/strcasecmp_s.c +index 24061c6e..02c5a531 100644 +--- a/src/extstr/strcasecmp_s.c ++++ b/src/extstr/strcasecmp_s.c +@@ -75,9 +75,15 @@ + * strcmp_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t strcasecmp_s(const char *dest, rsize_t dmax, ++ const char *src, int *resultp) ++#else + EXPORT errno_t _strcasecmp_s_chk(const char *dest, rsize_t dmax, + const char *src, int *resultp, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + const unsigned char *udest = (const unsigned char *)dest; + const unsigned char *usrc = (const unsigned char *)src; + int result = 0; +diff --git a/src/extstr/strcasestr_s.c b/src/extstr/strcasestr_s.c +index b26bf6ed..705d85f3 100644 +--- a/src/extstr/strcasestr_s.c ++++ b/src/extstr/strcasestr_s.c +@@ -72,9 +72,15 @@ + * strstr_s(), strprefix_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t strcasestr_s(char *dest, rsize_t dmax, const char *src, ++ rsize_t slen, char **substring) ++#else + EXPORT errno_t _strcasestr_s_chk(char *dest, rsize_t dmax, const char *src, + rsize_t slen, char **substring, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + rsize_t len; + rsize_t dlen; + int i; +diff --git a/src/extstr/strchr_s.c b/src/extstr/strchr_s.c +index 9548ba02..2229d2a2 100644 +--- a/src/extstr/strchr_s.c ++++ b/src/extstr/strchr_s.c +@@ -70,9 +70,15 @@ + * memchr_s(), strspn_s(), strcspn_s(), strpbrk_s(), strstr_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t strchr_s(const char *restrict dest, rsize_t dmax, ++ const int ch, char **restrict resultp) ++#else + EXPORT errno_t _strchr_s_chk(const char *restrict dest, rsize_t dmax, + const int ch, char **restrict resultp, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + CHK_SRC_NULL("strchr_s", resultp) + *resultp = NULL; + +diff --git a/src/extstr/strcmp_s.c b/src/extstr/strcmp_s.c +index b87ca74b..f07659c8 100644 +--- a/src/extstr/strcmp_s.c ++++ b/src/extstr/strcmp_s.c +@@ -74,9 +74,15 @@ + * strcasecmp_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t strcmp_s(const char *dest, rsize_t dmax, const char *src, ++ int *resultp) ++#else + EXPORT errno_t _strcmp_s_chk(const char *dest, rsize_t dmax, const char *src, + int *resultp, const size_t destbos, +- size_t srcbos) { ++ size_t srcbos) ++#endif ++{ + size_t slen; + CHK_SRC_NULL("strcmp_s", resultp) + *resultp = 0; +diff --git a/src/extstr/strcmpfld_s.c b/src/extstr/strcmpfld_s.c +index 5e81cf36..10bfe911 100644 +--- a/src/extstr/strcmpfld_s.c ++++ b/src/extstr/strcmpfld_s.c +@@ -75,8 +75,14 @@ + * strcpyfld_s(), strcpyfldin_s(), strcpyfldout_s() + */ + ++#ifdef FOR_DOXYGEN ++errno_t strcmpfld_s(const char *dest, rsize_t dmax, const char *src, ++ int *resultp) ++#else + EXPORT errno_t _strcmpfld_s_chk(const char *dest, rsize_t dmax, const char *src, +- int *resultp, const size_t destbos) { ++ int *resultp, const size_t destbos) ++#endif ++{ + CHK_SRC_NULL("strcmpfld_s", resultp) + *resultp = 0; + +diff --git a/src/extstr/strcoll_s.c b/src/extstr/strcoll_s.c +index b9382d1a..2d0f713c 100644 +--- a/src/extstr/strcoll_s.c ++++ b/src/extstr/strcoll_s.c +@@ -85,9 +85,15 @@ + * wcscoll_s(), strcmp_s(), strcasecmp_s() + */ + ++#ifdef FOR_DOXYGEN ++errno_t strcoll_s(const char *restrict dest, rsize_t dmax, ++ const char *restrict src, int *resultp) ++#else + EXPORT errno_t _strcoll_s_chk(const char *restrict dest, rsize_t dmax, + const char *restrict src, int *resultp, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + CHK_SRC_NULL("strcoll_s", resultp) + *resultp = 0; + +diff --git a/src/extstr/strcpyfld_s.c b/src/extstr/strcpyfld_s.c +index 0500002b..c6983eb7 100644 +--- a/src/extstr/strcpyfld_s.c ++++ b/src/extstr/strcpyfld_s.c +@@ -75,8 +75,13 @@ + * strcpyfldin_s(), strcpyfldout_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t strcpyfld_s(char *dest, rsize_t dmax, const char *src, rsize_t slen) ++#else + EXPORT errno_t _strcpyfld_s_chk(char *dest, rsize_t dmax, const char *src, +- rsize_t slen, const size_t destbos) { ++ rsize_t slen, const size_t destbos) ++#endif ++{ + rsize_t orig_dmax; + char *orig_dest; + const char *overlap_bumper; +diff --git a/src/extstr/strcpyfldin_s.c b/src/extstr/strcpyfldin_s.c +index de133fec..a6ea735c 100644 +--- a/src/extstr/strcpyfldin_s.c ++++ b/src/extstr/strcpyfldin_s.c +@@ -80,8 +80,13 @@ + * strcpyfld_s(), strcpyfldout_s(), + * + */ ++#ifdef FOR_DOXYGEN ++errno_t strcpyfldin_s(char *dest, rsize_t dmax, const char *src, rsize_t slen) ++#else + EXPORT errno_t _strcpyfldin_s_chk(char *dest, rsize_t dmax, const char *src, +- rsize_t slen, const size_t destbos) { ++ rsize_t slen, const size_t destbos) ++#endif ++{ + rsize_t orig_dmax; + char *orig_dest; + const char *overlap_bumper; +diff --git a/src/extstr/strcpyfldout_s.c b/src/extstr/strcpyfldout_s.c +index 3cbf8038..0e6a6c68 100644 +--- a/src/extstr/strcpyfldout_s.c ++++ b/src/extstr/strcpyfldout_s.c +@@ -80,8 +80,13 @@ + * strcpyfld_s(), strcpyfldin_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t strcpyfldout_s(char *dest, rsize_t dmax, const char *src, rsize_t slen) ++#else + EXPORT errno_t _strcpyfldout_s_chk(char *dest, rsize_t dmax, const char *src, +- rsize_t slen, const size_t destbos) { ++ rsize_t slen, const size_t destbos) ++#endif ++{ + rsize_t orig_dmax; + char *orig_dest; + const char *overlap_bumper; +diff --git a/src/extstr/strcspn_s.c b/src/extstr/strcspn_s.c +index bdbfceb9..5c139198 100644 +--- a/src/extstr/strcspn_s.c ++++ b/src/extstr/strcspn_s.c +@@ -74,9 +74,15 @@ + * strspn_s(), strpbrk_s(), strstr_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t strcspn_s(const char *dest, rsize_t dmax, const char *src, ++ rsize_t slen, rsize_t *countp) ++#else + EXPORT errno_t _strcspn_s_chk(const char *dest, rsize_t dmax, const char *src, + rsize_t slen, rsize_t *countp, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + const char *scan2; + rsize_t smax; + +diff --git a/src/extstr/strfirstchar_s.c b/src/extstr/strfirstchar_s.c +index 78eebc5a..89b47d0c 100644 +--- a/src/extstr/strfirstchar_s.c ++++ b/src/extstr/strfirstchar_s.c +@@ -70,8 +70,13 @@ + * strlastdiff_s(), strlastsame_s(), + */ + ++#ifdef FOR_DOXYGEN ++errno_t strfirstchar_s(char *dest, rsize_t dmax, char c, char **firstp) ++#else + EXPORT errno_t _strfirstchar_s_chk(char *dest, rsize_t dmax, char c, +- char **firstp, const size_t destbos) { ++ char **firstp, const size_t destbos) ++#endif ++{ + CHK_SRC_NULL("strfirstchar_s", firstp) + *firstp = NULL; + +diff --git a/src/extstr/strfirstdiff_s.c b/src/extstr/strfirstdiff_s.c +index 841c72bc..af588a34 100644 +--- a/src/extstr/strfirstdiff_s.c ++++ b/src/extstr/strfirstdiff_s.c +@@ -73,9 +73,15 @@ + * strlastdiff_s(), strlastsame_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t strfirstdiff_s(const char *dest, rsize_t dmax, ++ const char *src, rsize_t *resultp) ++#else + EXPORT errno_t _strfirstdiff_s_chk(const char *dest, rsize_t dmax, + const char *src, rsize_t *resultp, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + const char *rp; + + CHK_SRC_NULL("strfirstdiff_s", resultp) +diff --git a/src/extstr/strfirstsame_s.c b/src/extstr/strfirstsame_s.c +index 3648e7fe..bbb760ae 100644 +--- a/src/extstr/strfirstsame_s.c ++++ b/src/extstr/strfirstsame_s.c +@@ -72,9 +72,16 @@ + * strlastdiff_s(), strlastsame_s() + * + */ ++ ++#ifdef FOR_DOXYGEN ++errno_t strfirstsame_s(const char *dest, rsize_t dmax, ++ const char *src, rsize_t *resultp) ++#else + EXPORT errno_t _strfirstsame_s_chk(const char *dest, rsize_t dmax, + const char *src, rsize_t *resultp, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + const char *rp = 0; + + CHK_SRC_NULL("strfirstsame_s", resultp) +diff --git a/src/extstr/strisalphanumeric_s.c b/src/extstr/strisalphanumeric_s.c +index dbf6389b..ca129cd0 100644 +--- a/src/extstr/strisalphanumeric_s.c ++++ b/src/extstr/strisalphanumeric_s.c +@@ -62,8 +62,14 @@ + * strismixedcase_s(), strisuppercase_s() + * + */ +-bool _strisalphanumeric_s_chk(const char *dest, rsize_t dmax, +- const size_t destbos) { ++ ++#ifdef FOR_DOXYGEN ++bool strisalphanumeric_s(const char *dest, rsize_t dmax) ++#else ++EXPORT bool _strisalphanumeric_s_chk(const char *dest, rsize_t dmax, ++ const size_t destbos) ++#endif ++{ + CHK_DEST_DMAX_BOOL("strisalphanumeric_s", RSIZE_MAX_STR) + + if (unlikely(*dest == '\0')) { +diff --git a/src/extstr/strisascii_s.c b/src/extstr/strisascii_s.c +index b83f924b..ec41bcc3 100644 +--- a/src/extstr/strisascii_s.c ++++ b/src/extstr/strisascii_s.c +@@ -64,8 +64,13 @@ + * strislowercase_s(), strismixedcase_s(), strisuppercase_s() + */ + ++#ifdef FOR_DOXYGEN ++bool strisascii_s(const char *dest, rsize_t dmax) ++#else + EXPORT bool _strisascii_s_chk(const char *dest, rsize_t dmax, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + CHK_DEST_DMAX_BOOL("strisascii_s", RSIZE_MAX_STR) + + while (*dest && dmax) { +diff --git a/src/extstr/strisdigit_s.c b/src/extstr/strisdigit_s.c +index 35eaa1d4..762e3d10 100644 +--- a/src/extstr/strisdigit_s.c ++++ b/src/extstr/strisdigit_s.c +@@ -62,8 +62,13 @@ + * strislowercase_s(), strismixedcase_s(), strisuppercase_s() + */ + ++#ifdef FOR_DOXYGEN ++bool strisdigit_s(const char *dest, rsize_t dmax) ++#else + EXPORT bool _strisdigit_s_chk(const char *dest, rsize_t dmax, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + CHK_DEST_DMAX_BOOL("strisdigit_s", RSIZE_MAX_STR) + + if (unlikely(*dest == '\0')) { +diff --git a/src/extstr/strishex_s.c b/src/extstr/strishex_s.c +index ed0d6395..7e654233 100644 +--- a/src/extstr/strishex_s.c ++++ b/src/extstr/strishex_s.c +@@ -64,8 +64,13 @@ + * strisuppercase_s() + */ + ++#ifdef FOR_DOXYGEN ++bool strishex_s(const char *dest, rsize_t dmax) ++#else + EXPORT bool _strishex_s_chk(const char *dest, rsize_t dmax, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + CHK_DEST_DMAX_BOOL("strishex_s", RSIZE_MAX_STR) + + if (unlikely(*dest == '\0')) { +diff --git a/src/extstr/strislowercase_s.c b/src/extstr/strislowercase_s.c +index b2ecc085..15c3936e 100644 +--- a/src/extstr/strislowercase_s.c ++++ b/src/extstr/strislowercase_s.c +@@ -64,8 +64,13 @@ + * strisuppercase_s() + */ + ++#ifdef FOR_DOXYGEN ++errno_t strislowercase_s(const char *dest, rsize_t dmax) ++#else + EXPORT bool _strislowercase_s_chk(const char *dest, rsize_t dmax, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + CHK_DEST_DMAX_BOOL("strislowercase_s", RSIZE_MAX_STR) + + if (unlikely(*dest == '\0')) { +diff --git a/src/extstr/strismixedcase_s.c b/src/extstr/strismixedcase_s.c +index dab40723..8b36d1a7 100644 +--- a/src/extstr/strismixedcase_s.c ++++ b/src/extstr/strismixedcase_s.c +@@ -63,8 +63,13 @@ + * strisuppercase_s() + */ + ++#ifdef FOR_DOXYGEN ++errno_t strismixedcase_s(const char *dest, rsize_t dmax) ++#else + EXPORT bool _strismixedcase_s_chk(const char *dest, rsize_t dmax, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + CHK_DEST_DMAX_BOOL("strismixedcase_s", RSIZE_MAX_STR) + + if (unlikely(*dest == '\0')) { +diff --git a/src/extstr/strispassword_s.c b/src/extstr/strispassword_s.c +index 251e19e9..7b388178 100644 +--- a/src/extstr/strispassword_s.c ++++ b/src/extstr/strispassword_s.c +@@ -66,8 +66,13 @@ + * @see + * strzero_s() + */ ++#ifdef FOR_DOXYGEN ++bool strispassword_s(const char *dest, rsize_t dmax) ++#else + EXPORT bool _strispassword_s_chk(const char *dest, rsize_t dmax, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + uint32_t cnt_all; + uint32_t cnt_lowercase; + uint32_t cnt_uppercase; +diff --git a/src/extstr/strisuppercase_s.c b/src/extstr/strisuppercase_s.c +index 79a69844..563a1da5 100644 +--- a/src/extstr/strisuppercase_s.c ++++ b/src/extstr/strisuppercase_s.c +@@ -62,8 +62,13 @@ + * strishex_s(), strislowercase_s(), strismixedcase_s(), + */ + ++#ifdef FOR_DOXYGEN ++bool strisuppercase_s(const char *dest, rsize_t dmax) ++#else + EXPORT bool _strisuppercase_s_chk(const char *dest, rsize_t dmax, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + CHK_DEST_DMAX_BOOL("strisuppercase_s", RSIZE_MAX_STR) + + if (unlikely(*dest == '\0')) { +diff --git a/src/extstr/strlastchar_s.c b/src/extstr/strlastchar_s.c +index a3920f81..199f8e50 100644 +--- a/src/extstr/strlastchar_s.c ++++ b/src/extstr/strlastchar_s.c +@@ -70,8 +70,13 @@ + * strlastdiff_s(), strlastsame_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t strlastchar_s(char *dest, rsize_t dmax, char c, char **lastp) ++#else + EXPORT errno_t _strlastchar_s_chk(char *dest, rsize_t dmax, char c, +- char **lastp, const size_t destbos) { ++ char **lastp, const size_t destbos) ++#endif ++{ + CHK_SRC_NULL("strlastchar_s", lastp) + *lastp = NULL; + +diff --git a/src/extstr/strlastdiff_s.c b/src/extstr/strlastdiff_s.c +index c8d5be80..3d5db10f 100644 +--- a/src/extstr/strlastdiff_s.c ++++ b/src/extstr/strlastdiff_s.c +@@ -72,9 +72,15 @@ + * strlastchar_s(), strlastsame_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t strlastdiff_s(const char *dest, rsize_t dmax, ++ const char *src, rsize_t *resultp) ++#else + EXPORT errno_t _strlastdiff_s_chk(const char *dest, rsize_t dmax, + const char *src, rsize_t *resultp, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + const char *rp; + bool there_is_a_diff = false; + +diff --git a/src/extstr/strlastsame_s.c b/src/extstr/strlastsame_s.c +index ef3a57dd..19308409 100644 +--- a/src/extstr/strlastsame_s.c ++++ b/src/extstr/strlastsame_s.c +@@ -72,9 +72,15 @@ + * strlastchar_s(), strlastdiff_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t strlastsame_s(const char *dest, rsize_t dmax, ++ const char *src, rsize_t *resultp) ++#else + EXPORT errno_t _strlastsame_s_chk(const char *dest, rsize_t dmax, + const char *src, rsize_t *resultp, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + const char *rp; + bool found; + +diff --git a/src/extstr/strljustify_s.c b/src/extstr/strljustify_s.c +index 719f35f3..d19a19f2 100644 +--- a/src/extstr/strljustify_s.c ++++ b/src/extstr/strljustify_s.c +@@ -72,8 +72,13 @@ + * strremovews_s(), + * + */ ++#ifdef FOR_DOXYGEN ++errno_t strljustify_s(char *dest, rsize_t dmax) ++#else + EXPORT errno_t _strljustify_s_chk(char *dest, rsize_t dmax, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + char *orig_dest; + rsize_t orig_dmax; + +diff --git a/src/extstr/strnatcmp_s.c b/src/extstr/strnatcmp_s.c +index 6283ff32..0289e3b7 100644 +--- a/src/extstr/strnatcmp_s.c ++++ b/src/extstr/strnatcmp_s.c +@@ -118,9 +118,15 @@ static int compare_left(char const *a, char const *b) { + return 0; + } + ++#ifdef FOR_DOXYGEN ++errno_t strnatcmp_s(const char *dest, rsize_t dmax, const char *src, ++ const int fold_case, int *resultp) ++#else + EXPORT errno_t _strnatcmp_s_chk(const char *dest, rsize_t dmax, const char *src, + const int fold_case, int *resultp, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + size_t ai, bi; + char ca, cb; + int fractional; +diff --git a/src/extstr/strnset_s.c b/src/extstr/strnset_s.c +index 8bae92d5..99f36109 100644 +--- a/src/extstr/strnset_s.c ++++ b/src/extstr/strnset_s.c +@@ -75,8 +75,13 @@ + * strzero_s(), strset_s(), wcsnset_s(), strispassword_s() + */ + +-EXPORT errno_t _strnset_s_chk(char *restrict dest, rsize_t dmax, int value, +- rsize_t n, const size_t destbos) { ++#ifdef FOR_DOXYGEN ++errno_t strnset_s(char *restrict dest, rsize_t dmax, int value, rsize_t n) ++#else ++EXPORT errno_t _strnset_s_chk(char *restrict dest, rsize_t dmax, int value, rsize_t n, ++ const size_t destbos) ++#endif ++{ + #ifdef SAFECLIB_STR_NULL_SLACK + char *orig_dest; + #endif +diff --git a/src/extstr/strnterminate_s.c b/src/extstr/strnterminate_s.c +index a87c465b..afa6fdbc 100644 +--- a/src/extstr/strnterminate_s.c ++++ b/src/extstr/strnterminate_s.c +@@ -63,8 +63,13 @@ + * strnlen_s() + * + */ ++#ifdef FOR_DOXYGEN ++rsize_t strnterminate_s(char *dest, rsize_t dmax) ++#else + EXPORT rsize_t _strnterminate_s_chk(char *dest, rsize_t dmax, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + rsize_t count; + + if (unlikely(dest == NULL)) { +diff --git a/src/extstr/strpbrk_s.c b/src/extstr/strpbrk_s.c +index a19832cd..5bb7a0f8 100644 +--- a/src/extstr/strpbrk_s.c ++++ b/src/extstr/strpbrk_s.c +@@ -71,9 +71,13 @@ + * strfirstsame_s(), strlastdiff_s(), strlastsame_s() + * + */ +-EXPORT errno_t _strpbrk_s_chk(char *dest, rsize_t dmax, char *src, rsize_t slen, +- char **firstp, const size_t destbos, +- const size_t srcbos) { ++#ifdef FOR_DOXYGEN ++errno_t strpbrk_s(char *dest, rsize_t dmax, char *src, rsize_t slen, char **firstp) ++#else ++EXPORT errno_t _strpbrk_s_chk(char *dest, rsize_t dmax, char *src, rsize_t slen, char **firstp, ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + char *ps; + rsize_t len; + +diff --git a/src/extstr/strprefix_s.c b/src/extstr/strprefix_s.c +index f3dc7061..1717f8c3 100644 +--- a/src/extstr/strprefix_s.c ++++ b/src/extstr/strprefix_s.c +@@ -70,8 +70,13 @@ + * strspn_s(), strcspn_s(), strpbrk_s(), strstr_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t strprefix_s(const char *dest, rsize_t dmax, const char *src) ++#else + EXPORT errno_t _strprefix_s_chk(const char *dest, rsize_t dmax, const char *src, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + CHK_DEST_NULL("strprefix_s") + CHK_SRC_NULL("strprefix_s", src) + CHK_DMAX_ZERO("strprefix_s") +diff --git a/src/extstr/strrchr_s.c b/src/extstr/strrchr_s.c +index c94a7d9f..3e056ca6 100644 +--- a/src/extstr/strrchr_s.c ++++ b/src/extstr/strrchr_s.c +@@ -71,9 +71,14 @@ + * memrchr_s(), strchr_s(), memchr_s(), strspn_s(), strstr_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t strrchr_s(const char *restrict dest, rsize_t dmax, const int ch, char **resultp) ++#else + EXPORT errno_t _strrchr_s_chk(const char *restrict dest, rsize_t dmax, + const int ch, char **resultp, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + rsize_t len; + + CHK_SRC_NULL("strrchr_s", resultp) +diff --git a/src/extstr/strremovews_s.c b/src/extstr/strremovews_s.c +index 0b87ceca..45cb111e 100644 +--- a/src/extstr/strremovews_s.c ++++ b/src/extstr/strremovews_s.c +@@ -73,8 +73,13 @@ + * strljustify_s(), + * + */ ++#ifdef FOR_DOXYGEN ++errno_t strremovews_s(char *dest, rsize_t dmax) ++#else + EXPORT errno_t _strremovews_s_chk(char *dest, rsize_t dmax, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + char *orig_dest; + char *orig_end; + rsize_t orig_dmax; +diff --git a/src/extstr/strset_s.c b/src/extstr/strset_s.c +index a091da1e..99ec7cdd 100644 +--- a/src/extstr/strset_s.c ++++ b/src/extstr/strset_s.c +@@ -72,8 +72,13 @@ + * strzero_s(), strnset_s(), strispassword_s() + */ + ++#ifdef FOR_DOXYGEN ++errno_t strset_s(char *restrict dest, rsize_t dmax, int value) ++#else + EXPORT errno_t _strset_s_chk(char *restrict dest, rsize_t dmax, int value, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + CHK_DEST_NULL("strset_s") + CHK_DMAX_ZERO("strset_s") + if (destbos == BOS_UNKNOWN) { +diff --git a/src/extstr/strspn_s.c b/src/extstr/strspn_s.c +index 386e6b1e..3bf96695 100644 +--- a/src/extstr/strspn_s.c ++++ b/src/extstr/strspn_s.c +@@ -71,9 +71,15 @@ + * strcspn_s(), strpbrk_s(), strstr_s(), strprefix_s() + */ + ++#ifdef FOR_DOXYGEN ++errno_t strspn_s(const char *dest, rsize_t dmax, const char *src, ++ rsize_t slen, rsize_t *countp) ++#else + EXPORT errno_t _strspn_s_chk(const char *dest, rsize_t dmax, const char *src, + rsize_t slen, rsize_t *countp, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + const char *scan2; + rsize_t smax; + bool match_found; +diff --git a/src/extstr/strstr_s.c b/src/extstr/strstr_s.c +index 6a376f08..f315c580 100644 +--- a/src/extstr/strstr_s.c ++++ b/src/extstr/strstr_s.c +@@ -72,9 +72,16 @@ + * strprefix_s(), strspn_s(), strcspn_s(), strpbrk_s() + * + */ ++ ++#ifdef FOR_DOXYGEN ++errno_t strstr_s(char *dest, rsize_t dmax, const char *src, ++ rsize_t slen, char **substringp) ++#else + EXPORT errno_t _strstr_s_chk(char *dest, rsize_t dmax, const char *src, + rsize_t slen, char **substringp, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + rsize_t len; + rsize_t dlen; + int i; +diff --git a/src/extstr/strtolowercase_s.c b/src/extstr/strtolowercase_s.c +index ecb14413..f0922a81 100644 +--- a/src/extstr/strtolowercase_s.c ++++ b/src/extstr/strtolowercase_s.c +@@ -67,8 +67,13 @@ + * strtouppercase_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t strtolowercase_s(char *restrict dest, rsize_t dmax) ++#else + EXPORT errno_t _strtolowercase_s_chk(char *restrict dest, rsize_t dmax, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + CHK_DEST_NULL("strtolowercase_s") + CHK_DMAX_ZERO("strtolowercase_s") + if (destbos == BOS_UNKNOWN) { +diff --git a/src/extstr/strtouppercase_s.c b/src/extstr/strtouppercase_s.c +index 35865f28..2c2c0444 100644 +--- a/src/extstr/strtouppercase_s.c ++++ b/src/extstr/strtouppercase_s.c +@@ -67,8 +67,13 @@ + * strtolowercase_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t strtouppercase_s(char *dest, rsize_t dmax) ++#else + EXPORT errno_t _strtouppercase_s_chk(char *dest, rsize_t dmax, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + CHK_DEST_NULL("strtouppercase_s") + CHK_DMAX_ZERO("strtouppercase_s") + if (destbos == BOS_UNKNOWN) { +diff --git a/src/extstr/strzero_s.c b/src/extstr/strzero_s.c +index bb3e5d5e..4a43cd40 100644 +--- a/src/extstr/strzero_s.c ++++ b/src/extstr/strzero_s.c +@@ -64,7 +64,13 @@ + * strispassword_s() + */ + +-EXPORT errno_t _strzero_s_chk(char *dest, rsize_t dmax, const size_t destbos) { ++#ifdef FOR_DOXYGEN ++errno_t strzero_s(char *dest, rsize_t dmax) ++#else ++EXPORT errno_t _strzero_s_chk(char *dest, rsize_t dmax, ++ const size_t destbos) ++#endif ++{ + CHK_DEST_NULL("strzero_s") + CHK_DMAX_ZERO("strzero_s") + if (destbos == BOS_UNKNOWN) { +diff --git a/src/extwchar/towfc_s.c b/src/extwchar/towfc_s.c +index d915eca5..baabde42 100644 +--- a/src/extwchar/towfc_s.c ++++ b/src/extwchar/towfc_s.c +@@ -513,8 +513,13 @@ single: + Returns the number of replaced wide characters, or -ESNOTFND if not + replaced. + */ +-EXPORT int _towfc_s_chk(wchar_t *restrict dest, rsize_t dmax, +- const uint32_t src, const size_t destbos) { ++#ifdef FOR_DOXYGEN ++int towfc_s(wchar_t *restrict dest, rsize_t dmax, const uint32_t src) ++#else ++EXPORT int _towfc_s_chk(wchar_t *restrict dest, rsize_t dmax, const uint32_t src, ++ const size_t destbos) ++#endif ++{ + int i; + const size_t destsz = dmax * sizeof(wchar_t); + +diff --git a/src/extwchar/wcscmp_s.c b/src/extwchar/wcscmp_s.c +index 28bdd5f2..d0c4c3bc 100644 +--- a/src/extwchar/wcscmp_s.c ++++ b/src/extwchar/wcscmp_s.c +@@ -76,10 +76,17 @@ + * strcmp_s(), wcsncmp_s(), wcsicmp_s() + */ + ++#ifdef FOR_DOXYGEN ++errno_t wcscmp_s(const wchar_t *restrict dest, rsize_t dmax, ++ const wchar_t *restrict src, rsize_t smax, ++ int *resultp) ++#else + EXPORT errno_t _wcscmp_s_chk(const wchar_t *restrict dest, rsize_t dmax, + const wchar_t *restrict src, rsize_t smax, + int *resultp, const size_t destbos, +- const size_t srcbos) { ++ const size_t srcbos) ++#endif ++{ + const size_t destsz = dmax * sizeof(wchar_t); + const size_t srcsz = smax * sizeof(wchar_t); + +diff --git a/src/extwchar/wcscoll_s.c b/src/extwchar/wcscoll_s.c +index f9bab099..b6e1ec45 100644 +--- a/src/extwchar/wcscoll_s.c ++++ b/src/extwchar/wcscoll_s.c +@@ -87,11 +87,17 @@ + * @see + * wcscmp_s(), strcoll_s(), strcasecmp_s() + */ +- ++#ifdef FOR_DOXYGEN ++errno_t wcscoll_s(const wchar_t *restrict dest, rsize_t dmax, ++ const wchar_t *restrict src, rsize_t smax, ++ int *resultp) ++#else + EXPORT errno_t _wcscoll_s_chk(const wchar_t *restrict dest, rsize_t dmax, + const wchar_t *restrict src, rsize_t smax, + int *resultp, const size_t destbos, +- const size_t srcbos) { ++ const size_t srcbos) ++#endif ++{ + const size_t destsz = dmax * sizeof(wchar_t); + const size_t srcsz = smax * sizeof(wchar_t); + +diff --git a/src/extwchar/wcsfc_s.c b/src/extwchar/wcsfc_s.c +index 9c4f3aea..11a4204b 100644 +--- a/src/extwchar/wcsfc_s.c ++++ b/src/extwchar/wcsfc_s.c +@@ -110,10 +110,15 @@ static inline int _is_lt_accented(uint32_t wc) { + * iswfc(), towfc_s(), towupper(), wcslwr_s(), wcsupr_s() + * + */ +- ++#ifdef FOR_DOXYGEN ++errno_t wcsfc_s(wchar_t *restrict dest, rsize_t dmax, ++ const wchar_t *restrict src, rsize_t *restrict lenp) ++#else + EXPORT errno_t _wcsfc_s_chk(wchar_t *restrict dest, rsize_t dmax, + const wchar_t *restrict src, rsize_t *restrict lenp, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + wchar_t *orig_dest; + rsize_t orig_dmax; + int is_lithuanian = 0; +diff --git a/src/extwchar/wcsicmp_s.c b/src/extwchar/wcsicmp_s.c +index a6869e47..54e6667a 100644 +--- a/src/extwchar/wcsicmp_s.c ++++ b/src/extwchar/wcsicmp_s.c +@@ -73,10 +73,17 @@ + * strcmp_s(), wcscmp_s(), wcsncmp_s(), wcsfc_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t wcsicmp_s(const wchar_t *restrict dest, rsize_t dmax, ++ const wchar_t *restrict src, rsize_t smax, ++ int *resultp) ++#else + EXPORT errno_t _wcsicmp_s_chk(const wchar_t *restrict dest, rsize_t dmax, + const wchar_t *restrict src, rsize_t smax, + int *resultp, const size_t destbos, +- const size_t srcbos) { ++ const size_t srcbos) ++#endif ++{ + errno_t rc; + wchar_t *d1, *d2; + rsize_t l1, l2; +diff --git a/src/extwchar/wcslwr_s.c b/src/extwchar/wcslwr_s.c +index 0c623d69..df49fa6b 100644 +--- a/src/extwchar/wcslwr_s.c ++++ b/src/extwchar/wcslwr_s.c +@@ -75,9 +75,13 @@ EXTERN wint_t towlower(wint_t wc); + * @see + * wcsfc_s(), strtolowercase_s(), strlwr_s(), wcsupr_s() + */ +- ++#ifdef FOR_DOXYGEN ++errno_t wcslwr_s(wchar_t *restrict src, rsize_t slen) ++#else + EXPORT errno_t _wcslwr_s_chk(wchar_t *restrict src, rsize_t slen, +- const size_t srcbos) { ++ const size_t srcbos) ++#endif ++{ + const size_t srcsz = slen * sizeof(wchar_t); + + if (unlikely(slen == 0)) { /* Since C11 slen=0 is allowed */ +diff --git a/src/extwchar/wcsnatcmp_s.c b/src/extwchar/wcsnatcmp_s.c +index b0355d12..f27b8f3d 100644 +--- a/src/extwchar/wcsnatcmp_s.c ++++ b/src/extwchar/wcsnatcmp_s.c +@@ -131,10 +131,17 @@ static int compare_left(wchar_t const *a, wchar_t const *b) { + return 0; + } + ++#ifdef FOR_DOXYGEN ++errno_t wcsnatcmp_s(const wchar_t *dest, rsize_t dmax, ++ const wchar_t *src, rsize_t smax, ++ const int fold_case, int *resultp) ++#else + EXPORT errno_t _wcsnatcmp_s_chk(const wchar_t *dest, rsize_t dmax, + const wchar_t *src, rsize_t smax, + const int fold_case, int *resultp, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + wchar_t *d1 = NULL, *d2 = NULL; + size_t ai, bi; + const size_t destsz = dmax * sizeof(wchar_t); +diff --git a/src/extwchar/wcsncmp_s.c b/src/extwchar/wcsncmp_s.c +index 3f3cd7e3..9761e68d 100644 +--- a/src/extwchar/wcsncmp_s.c ++++ b/src/extwchar/wcsncmp_s.c +@@ -77,11 +77,17 @@ + * @see + * strcmp_s(), wcscmp_s() + */ +- ++#ifdef FOR_DOXYGEN ++errno_t wcsncmp_s(const wchar_t *restrict dest, rsize_t dmax, ++ const wchar_t *restrict src, rsize_t smax, ++ rsize_t count, int *resultp) ++#else + EXPORT errno_t _wcsncmp_s_chk(const wchar_t *restrict dest, rsize_t dmax, + const wchar_t *restrict src, rsize_t smax, + rsize_t count, int *resultp, const size_t destbos, +- const size_t srcbos) { ++ const size_t srcbos) ++#endif ++{ + const size_t destsz = dmax * sizeof(wchar_t); + const size_t srcsz = smax * sizeof(wchar_t); + +diff --git a/src/extwchar/wcsnorm_s.c b/src/extwchar/wcsnorm_s.c +index 726decb5..536680dc 100644 +--- a/src/extwchar/wcsnorm_s.c ++++ b/src/extwchar/wcsnorm_s.c +@@ -502,11 +502,19 @@ static uint8_t _combin_class(uint32_t cp) { + */ + + /* create an unordered decomposed wide string */ ++#ifdef FOR_DOXYGEN ++errno_t wcsnorm_decompose_s(wchar_t *restrict dest, rsize_t dmax, ++ const wchar_t *restrict src, ++ rsize_t *restrict lenp, ++ const bool iscompat) ++#else + EXPORT errno_t _wcsnorm_decompose_s_chk(wchar_t *restrict dest, rsize_t dmax, + const wchar_t *restrict src, + rsize_t *restrict lenp, + const bool iscompat, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + rsize_t orig_dmax; + wchar_t *orig_dest; + const wchar_t *overlap_bumper; +@@ -733,9 +741,15 @@ done: + */ + + /* reorder decomposed sequence to NFD */ ++#ifdef FOR_DOXYGEN ++errno_t wcsnorm_reorder_s(wchar_t *restrict dest, rsize_t dmax, const wchar_t *restrict src, ++ const rsize_t len) ++#else + EXPORT errno_t _wcsnorm_reorder_s_chk(wchar_t *restrict dest, rsize_t dmax, +- const wchar_t *restrict src, +- const rsize_t len, const size_t destbos) { ++ const wchar_t *restrict src, const rsize_t len, ++ const size_t destbos) ++#endif ++{ + UNWIF_cc seq_ary[CC_SEQ_SIZE]; + UNWIF_cc *seq_ptr = (UNWIF_cc *)seq_ary; /* start with stack */ + UNWIF_cc *seq_ext = NULL; /* heap when needed */ +@@ -862,11 +876,19 @@ EXPORT errno_t _wcsnorm_reorder_s_chk(wchar_t *restrict dest, rsize_t dmax, + + /* combine decomposed sequences to NFC. */ + /* iscontig = false; composeContiguous? FCC if true */ ++#ifdef FOR_DOXYGEN ++errno_t wcsnorm_compose_s(wchar_t *restrict dest, rsize_t dmax, ++ const wchar_t *restrict src, ++ rsize_t *restrict lenp, ++ const bool iscontig) ++#else + EXPORT errno_t _wcsnorm_compose_s_chk(wchar_t *restrict dest, rsize_t dmax, + const wchar_t *restrict src, + rsize_t *restrict lenp, + const bool iscontig, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + wchar_t *p = (wchar_t *)src; + const wchar_t *e = p + *lenp; + uint32_t cpS = 0; /* starter code point */ +@@ -1067,10 +1089,17 @@ EXPORT errno_t _wcsnorm_compose_s_chk(wchar_t *restrict dest, rsize_t dmax, + + /* Normalize to NFC, NFD, FCC, FCD (fastest, used in wcsfc_s), and optionally + * NFKD, NFKC */ ++#ifdef FOR_DOXYGEN ++errno_t wcsnorm_s(wchar_t *restrict dest, rsize_t dmax, ++ const wchar_t *restrict src, ++ const wcsnorm_mode_t mode, rsize_t *restrict lenp) ++#else + EXPORT errno_t _wcsnorm_s_chk(wchar_t *restrict dest, rsize_t dmax, + const wchar_t *restrict src, + const wcsnorm_mode_t mode, rsize_t *restrict lenp, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + wchar_t tmp_stack[128]; + wchar_t *tmp_ptr; + wchar_t *tmp = NULL; +diff --git a/src/extwchar/wcsnset_s.c b/src/extwchar/wcsnset_s.c +index b56479c8..6d648695 100644 +--- a/src/extwchar/wcsnset_s.c ++++ b/src/extwchar/wcsnset_s.c +@@ -74,8 +74,13 @@ + * wcsset_s(), wmemset_s(), strzero_s(), strnset_s(), strispassword_s() + * + */ +-EXPORT errno_t _wcsnset_s_chk(wchar_t *restrict dest, rsize_t dmax, +- wchar_t value, rsize_t n, const size_t destbos) { ++#ifdef FOR_DOXYGEN ++errno_t wcsnset_s(wchar_t *restrict dest, rsize_t dmax, wchar_t value, rsize_t n) ++#else ++EXPORT errno_t _wcsnset_s_chk(wchar_t *restrict dest, rsize_t dmax, wchar_t value, rsize_t n, ++ const size_t destbos) ++#endif ++{ + #ifdef SAFECLIB_STR_NULL_SLACK + wchar_t *orig_dest; + #endif +diff --git a/src/extwchar/wcsset_s.c b/src/extwchar/wcsset_s.c +index 99652f01..8008dcaa 100644 +--- a/src/extwchar/wcsset_s.c ++++ b/src/extwchar/wcsset_s.c +@@ -71,8 +71,13 @@ + * wcsnset_s(), wmemset_s(), strzero_s(), strnset_s(), strispassword_s() + * + */ +-EXPORT errno_t _wcsset_s_chk(wchar_t *restrict dest, rsize_t dmax, +- const wchar_t value, const size_t destbos) { ++#ifdef FOR_DOXYGEN ++errno_t wcsset_s(wchar_t *restrict dest, rsize_t dmax, const wchar_t value) ++#else ++EXPORT errno_t _wcsset_s_chk(wchar_t *restrict dest, rsize_t dmax, const wchar_t value, ++ const size_t destbos) ++#endif ++{ + const size_t destsz = dmax * sizeof(wchar_t); + + CHK_DEST_NULL("wcsset_s") +diff --git a/src/extwchar/wcsstr_s.c b/src/extwchar/wcsstr_s.c +index 6d84f0b3..592934e2 100644 +--- a/src/extwchar/wcsstr_s.c ++++ b/src/extwchar/wcsstr_s.c +@@ -72,11 +72,17 @@ + * @see + * wcsstr(), strstr_s(), memcmp32_s() + */ +- ++#ifdef FOR_DOXYGEN ++errno_t wcsstr_s(wchar_t *restrict dest, rsize_t dmax, ++ const wchar_t *restrict src, rsize_t slen, ++ wchar_t **restrict substringp) ++#else + EXPORT errno_t _wcsstr_s_chk(wchar_t *restrict dest, rsize_t dmax, + const wchar_t *restrict src, rsize_t slen, + wchar_t **restrict substringp, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + rsize_t len; + rsize_t dlen; + const size_t destsz = dmax * sizeof(wchar_t); +diff --git a/src/extwchar/wcsupr_s.c b/src/extwchar/wcsupr_s.c +index ec16199d..3b7675ce 100644 +--- a/src/extwchar/wcsupr_s.c ++++ b/src/extwchar/wcsupr_s.c +@@ -71,9 +71,13 @@ + * @see + * strtouppercase_s(), strlwr_s(), wcslwr_s() + */ +- ++#ifdef FOR_DOXYGEN ++errno_t wcsupr_s(wchar_t *restrict src, rsize_t slen) ++#else + EXPORT errno_t _wcsupr_s_chk(wchar_t *restrict src, rsize_t slen, +- const size_t srcbos) { ++ const size_t srcbos) ++#endif ++{ + const size_t srcsz = slen * sizeof(wchar_t); + + if (unlikely(slen == 0)) { /* Since C11 slen=0 is allowed */ +diff --git a/src/extwchar/wmemcmp_s.c b/src/extwchar/wmemcmp_s.c +index abf8b843..1104d430 100644 +--- a/src/extwchar/wmemcmp_s.c ++++ b/src/extwchar/wmemcmp_s.c +@@ -77,9 +77,15 @@ + * + */ + ++#ifdef FOR_DOXYGEN ++errno_t wmemcmp_s(const wchar_t *dest, rsize_t dlen, ++ const wchar_t *src, rsize_t slen, int *diff) ++#else + EXPORT errno_t _wmemcmp_s_chk(const wchar_t *dest, rsize_t dlen, + const wchar_t *src, rsize_t slen, int *diff, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + const rsize_t dmax = dlen * SIZEOF_WCHAR_T; + const rsize_t smax = slen * SIZEOF_WCHAR_T; + const wchar_t *dp; +diff --git a/src/io/gets_s.c b/src/io/gets_s.c +index be875a1c..382945d0 100644 +--- a/src/io/gets_s.c ++++ b/src/io/gets_s.c +@@ -99,8 +99,13 @@ + * scanf_s() + */ + ++#ifdef FOR_DOXYGEN ++char *gets_s(char *restrict dest, rsize_t dmax) ++#else + EXPORT char *_gets_s_chk(char *restrict dest, rsize_t dmax, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + char *ret; + + if (unlikely(dest == NULL)) { +diff --git a/src/io/tmpnam_s.c b/src/io/tmpnam_s.c +index 52819392..96d3dc1f 100644 +--- a/src/io/tmpnam_s.c ++++ b/src/io/tmpnam_s.c +@@ -91,8 +91,13 @@ + * to the optionally defined macro P_tmpdir). + */ + ++#ifdef FOR_DOXYGEN ++errno_t tmpnam_s(const char *dest, rsize_t dmax) ++#else + EXPORT errno_t _tmpnam_s_chk(const char *dest, rsize_t dmax, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + static int count = 0; + char *result = NULL; + char *dp = (char *)dest; +diff --git a/src/mem/memcpy_s.c b/src/mem/memcpy_s.c +index ba879b1e..742070cb 100644 +--- a/src/mem/memcpy_s.c ++++ b/src/mem/memcpy_s.c +@@ -88,9 +88,15 @@ + * memcpy16_s(), memcpy32_s(), memmove_s(), memmove16_s(), memmove32_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t memcpy_s(void *restrict dest, rsize_t dmax, ++ const void *restrict src, rsize_t slen) ++#else + EXPORT errno_t _memcpy_s_chk(void *restrict dest, rsize_t dmax, + const void *restrict src, rsize_t slen, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + uint8_t *dp; + const uint8_t *sp; + +diff --git a/src/mem/memmove_s.c b/src/mem/memmove_s.c +index 69053591..2d844497 100644 +--- a/src/mem/memmove_s.c ++++ b/src/mem/memmove_s.c +@@ -92,9 +92,14 @@ + * + */ + ++#ifdef FOR_DOXYGEN ++errno_t memmove_s(void *dest, rsize_t dmax, const void *src, rsize_t slen) ++#else + EXPORT errno_t _memmove_s_chk(void *dest, rsize_t dmax, const void *src, + rsize_t slen, const size_t destbos, +- const size_t srcbos) { ++ const size_t srcbos) ++#endif ++{ + uint8_t *dp; + const uint8_t *sp; + +diff --git a/src/mem/memset_s.c b/src/mem/memset_s.c +index fb37007c..3f6e0f5d 100644 +--- a/src/mem/memset_s.c ++++ b/src/mem/memset_s.c +@@ -92,8 +92,13 @@ + * memset16_s(), memset32_s() + */ + ++#ifdef FOR_DOXYGEN ++errno_t memset_s(void *dest, rsize_t dmax, int value, rsize_t n) ++#else + EXPORT errno_t _memset_s_chk(void *dest, rsize_t dmax, int value, rsize_t n, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + errno_t err; + + CHK_DEST_MEM_NULL("memset_s") +diff --git a/src/misc/bsearch_s.c b/src/misc/bsearch_s.c +index 42f8f5a4..e40b908c 100644 +--- a/src/misc/bsearch_s.c ++++ b/src/misc/bsearch_s.c +@@ -105,10 +105,18 @@ + * qsort_s() + */ + ++#ifdef FOR_DOXYGEN ++void * ++bsearch_s(const void *key, const void *base, rsize_t nmemb, rsize_t size, ++ int (*compar)(const void *k, const void *y, void *context), ++ void *context) ++#else + EXPORT void * + _bsearch_s_chk(const void *key, const void *base, rsize_t nmemb, rsize_t size, + int (*compar)(const void *k, const void *y, void *context), +- void *context, const size_t basebos) { ++ void *context, const size_t basebos) ++#endif ++{ + if (likely(nmemb != 0)) { + if (unlikely(key == NULL || base == NULL || compar == NULL)) { + invoke_safe_mem_constraint_handler( +diff --git a/src/misc/qsort_s.c b/src/misc/qsort_s.c +index 8327f919..688b468b 100644 +--- a/src/misc/qsort_s.c ++++ b/src/misc/qsort_s.c +@@ -342,10 +342,18 @@ static void qsort_musl(void *base, size_t nel, size_t width, cmpfun cmp, + } + } + ++#ifdef FOR_DOXYGEN ++errno_t qsort_s(void *base, rsize_t nmemb, rsize_t size, ++ int (*compar)(const void *k, const void *y, ++ void *context), ++ void *context) ++#else + EXPORT errno_t _qsort_s_chk(void *base, rsize_t nmemb, rsize_t size, + int (*compar)(const void *k, const void *y, + void *context), +- void *context, const size_t destbos) { ++ void *context, const size_t destbos) ++#endif ++{ + if (likely(nmemb != 0)) { + if (unlikely(base == NULL || compar == NULL)) { + invoke_safe_str_constraint_handler("qsort_s: base/compar is null", +diff --git a/src/os/asctime_s.c b/src/os/asctime_s.c +index 01cefd8f..9976c4aa 100644 +--- a/src/os/asctime_s.c ++++ b/src/os/asctime_s.c +@@ -106,8 +106,13 @@ char *asctime_r(const struct tm * __restrict, char * __restrict); + * ctime_s() + */ + ++#ifdef FOR_DOXYGEN ++errno_t asctime_s(char *dest, rsize_t dmax, const struct tm *tm) ++#else + EXPORT errno_t _asctime_s_chk(char *dest, rsize_t dmax, const struct tm *tm, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + const char *buf; + size_t len; + +diff --git a/src/os/ctime_s.c b/src/os/ctime_s.c +index 7a1a138c..e50b5fab 100644 +--- a/src/os/ctime_s.c ++++ b/src/os/ctime_s.c +@@ -104,8 +104,13 @@ char *ctime_r(const time_t *, char *); + * asctime_s() + */ + ++#ifdef FOR_DOXYGEN ++errno_t ctime_s(char *dest, rsize_t dmax, const time_t *timer) ++#else + EXPORT errno_t _ctime_s_chk(char *dest, rsize_t dmax, const time_t *timer, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + const char *buf; + size_t len; + +diff --git a/src/os/getenv_s.c b/src/os/getenv_s.c +index 5f9a0642..2d2158cb 100644 +--- a/src/os/getenv_s.c ++++ b/src/os/getenv_s.c +@@ -88,9 +88,15 @@ + * @retval -1 when not found + */ + ++#ifdef FOR_DOXYGEN ++errno_t getenv_s(size_t *restrict len, char *restrict dest, ++ rsize_t dmax, const char *restrict name) ++#else + EXPORT errno_t _getenv_s_chk(size_t *restrict len, char *restrict dest, + rsize_t dmax, const char *restrict name, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + const char *buf; + int len1; + +diff --git a/src/os/gmtime_s.c b/src/os/gmtime_s.c +index cd8f064f..0ef4418f 100644 +--- a/src/os/gmtime_s.c ++++ b/src/os/gmtime_s.c +@@ -88,8 +88,8 @@ struct tm *gmtime_r(const time_t * __restrict, struct tm * __restrict); + * localtime_s(), ctime_s() + */ + +-EXPORT struct tm *gmtime_s(const time_t *restrict timer, +- struct tm *restrict dest) { ++EXPORT struct tm *gmtime_s(const time_t *restrict timer, struct tm *restrict dest) ++{ + + if (unlikely(dest == NULL)) { + invoke_safe_str_constraint_handler("gmtime_s: dest is null", NULL, +diff --git a/src/str/strcat_s.c b/src/str/strcat_s.c +index a38b43f0..117ad954 100644 +--- a/src/str/strcat_s.c ++++ b/src/str/strcat_s.c +@@ -106,8 +106,15 @@ + * strncat_s(), strcpy_s(), strncpy_s() + * + */ ++ ++#ifdef FOR_DOXYGEN ++errno_t strcat_s(char *restrict dest, rsize_t dmax, ++ const char *restrict src) ++#else + EXPORT errno_t _strcat_s_chk(char *restrict dest, rsize_t dmax, +- const char *restrict src, size_t destbos) { ++ const char *restrict src, size_t destbos) ++#endif ++{ + rsize_t orig_dmax; + char *orig_dest; + const char *overlap_bumper; +diff --git a/src/str/strcpy_s.c b/src/str/strcpy_s.c +index f5d6c73f..8ddc2674 100644 +--- a/src/str/strcpy_s.c ++++ b/src/str/strcpy_s.c +@@ -99,8 +99,13 @@ + * strcat_s(), strncat_s(), strncpy_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t strcpy_s(char *restrict dest, rsize_t dmax, const char *restrict src) ++#else + EXPORT errno_t _strcpy_s_chk(char *restrict dest, rsize_t dmax, +- const char *restrict src, const size_t destbos) { ++ const char *restrict src, const size_t destbos) ++#endif ++{ + rsize_t orig_dmax; + char *orig_dest; + const char *overlap_bumper; +diff --git a/src/str/strerror_s.c b/src/str/strerror_s.c +index 8b4a0b26..bc4454af 100644 +--- a/src/str/strerror_s.c ++++ b/src/str/strerror_s.c +@@ -86,9 +86,13 @@ + * @see + * strerrorlen_s() + */ +- ++#ifdef FOR_DOXYGEN ++errno_t strerror_s(char *dest, rsize_t dmax, errno_t errnum) ++#else + EXPORT errno_t _strerror_s_chk(char *dest, rsize_t dmax, errno_t errnum, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + size_t len; + + CHK_DEST_NULL("strerror_s") +diff --git a/src/str/strncat_s.c b/src/str/strncat_s.c +index 4089d390..79a38eff 100644 +--- a/src/str/strncat_s.c ++++ b/src/str/strncat_s.c +@@ -117,9 +117,15 @@ + * strcat_s(), strncpy_s(), wcsncat_s() + * http://www.informit.com/articles/article.aspx?p=2036582&seqNum=5 + */ ++#ifdef FOR_DOXYGEN ++errno_t strncat_s(char *restrict dest, rsize_t dmax, ++ const char *restrict src, rsize_t slen) ++#else + EXPORT errno_t _strncat_s_chk(char *restrict dest, rsize_t dmax, + const char *restrict src, rsize_t slen, +- size_t destbos, const size_t srcbos) { ++ size_t destbos, const size_t srcbos) ++#endif ++{ + rsize_t orig_dmax; + char *orig_dest; + const char *overlap_bumper; +diff --git a/src/str/strncpy_s.c b/src/str/strncpy_s.c +index bc49c38d..3e595268 100644 +--- a/src/str/strncpy_s.c ++++ b/src/str/strncpy_s.c +@@ -106,9 +106,15 @@ + * http://www.informit.com/articles/article.aspx?p=2036582&seqNum=5 + * + */ ++#ifdef FOR_DOXYGEN ++errno_t strncpy_s(char *restrict dest, rsize_t dmax, ++ const char *restrict src, rsize_t slen) ++#else + EXPORT errno_t _strncpy_s_chk(char *restrict dest, rsize_t dmax, + const char *restrict src, rsize_t slen, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + rsize_t orig_dmax; + char *orig_dest; + const char *overlap_bumper; +diff --git a/src/str/strnlen_s.c b/src/str/strnlen_s.c +index d364aeec..1b57003f 100644 +--- a/src/str/strnlen_s.c ++++ b/src/str/strnlen_s.c +@@ -68,7 +68,12 @@ + * http://www.informit.com/articles/article.aspx?p=2036582&seqNum=5 + * + */ +-EXPORT rsize_t _strnlen_s_chk(const char *str, rsize_t smax, size_t strbos) { ++#ifdef FOR_DOXYGEN ++rsize_t strnlen_s(const char *str, rsize_t smax, size_t strbos) ++#else ++EXPORT rsize_t _strnlen_s_chk(const char *str, rsize_t smax, size_t strbos) ++#endif ++{ + rsize_t count; + + if (unlikely(str == NULL)) { +diff --git a/src/str/strtok_s.c b/src/str/strtok_s.c +index 2ba30f87..0da3beec 100644 +--- a/src/str/strtok_s.c ++++ b/src/str/strtok_s.c +@@ -171,10 +171,15 @@ + * } + * @endcode + */ +- ++#ifdef FOR_DOXYGEN ++char *strtok_s(char *restrict dest, rsize_t *restrict dmaxp, ++ const char *restrict delim, char **restrict ptr) ++#else + EXPORT char *_strtok_s_chk(char *restrict dest, rsize_t *restrict dmaxp, + const char *restrict delim, char **restrict ptr, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + const char *pt; + char *ptoken; + rsize_t dlen; +diff --git a/src/str/vsnprintf_s.c b/src/str/vsnprintf_s.c +index bfb91740..869e431d 100644 +--- a/src/str/vsnprintf_s.c ++++ b/src/str/vsnprintf_s.c +@@ -89,10 +89,15 @@ + * @see + * snprintf_s(), sprintf_s(), vsprintf_s(), vsnwprintf_s() + */ +- ++#ifdef FOR_DOXYGEN ++int vsnprintf_s(char *restrict dest, rsize_t dmax, ++ const char *restrict fmt, va_list ap) ++#else + EXPORT int _vsnprintf_s_chk(char *restrict dest, rsize_t dmax, + const size_t destbos, const char *restrict fmt, +- va_list ap) { ++ va_list ap) ++#endif ++{ + + int ret = -1; + const char *p; +diff --git a/src/str/vsprintf_s.c b/src/str/vsprintf_s.c +index 699ec307..da0f1de5 100644 +--- a/src/str/vsprintf_s.c ++++ b/src/str/vsprintf_s.c +@@ -96,9 +96,15 @@ + * sprintf_s(), vsnprintf_s() + */ + ++#ifdef FOR_DOXYGEN ++int vsprintf_s(char *restrict dest, const rsize_t dmax, ++ const char *restrict fmt, va_list ap) ++#else + EXPORT int _vsprintf_s_chk(char *restrict dest, const rsize_t dmax, + const size_t destbos, const char *restrict fmt, +- va_list ap) { ++ va_list ap) ++#endif ++{ + + int ret = -1; + const char *p; +diff --git a/src/wchar/mbsrtowcs_s.c b/src/wchar/mbsrtowcs_s.c +index e7a52e95..738814ba 100644 +--- a/src/wchar/mbsrtowcs_s.c ++++ b/src/wchar/mbsrtowcs_s.c +@@ -119,11 +119,18 @@ + * @see + * mbstowc_s() + */ +- ++#ifdef FOR_DOXYGEN ++errno_t mbsrtowcs_s(size_t *restrict retvalp, ++ wchar_t *restrict dest, rsize_t dmax, ++ const char **restrict srcp, rsize_t len, ++ mbstate_t *restrict ps) ++#else + EXPORT errno_t _mbsrtowcs_s_chk(size_t *restrict retvalp, + wchar_t *restrict dest, rsize_t dmax, + const char **restrict srcp, rsize_t len, +- mbstate_t *restrict ps, const size_t destbos) { ++ mbstate_t *restrict ps, const size_t destbos) ++#endif ++{ + wchar_t *orig_dest; + mbstate_t orig_ps; + errno_t rc; +diff --git a/src/wchar/mbstowcs_s.c b/src/wchar/mbstowcs_s.c +index e3f8100d..8d4bf7aa 100644 +--- a/src/wchar/mbstowcs_s.c ++++ b/src/wchar/mbstowcs_s.c +@@ -118,9 +118,16 @@ + * mbsrtowc_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t mbstowcs_s(size_t *restrict retvalp, wchar_t *restrict dest, ++ rsize_t dmax, const char *restrict src, ++ rsize_t len) ++#else + EXPORT errno_t _mbstowcs_s_chk(size_t *restrict retvalp, wchar_t *restrict dest, + rsize_t dmax, const char *restrict src, +- rsize_t len, const size_t destbos) { ++ rsize_t len, const size_t destbos) ++#endif ++{ + wchar_t *orig_dest; + errno_t rc; + #ifdef HAVE_CYGWIN64 +diff --git a/src/wchar/snwprintf_s.c b/src/wchar/snwprintf_s.c +index 4e733058..b4a4c0b7 100644 +--- a/src/wchar/snwprintf_s.c ++++ b/src/wchar/snwprintf_s.c +@@ -111,8 +111,10 @@ any of the arguments corresponding to %s is a null pointer. + * @see + * vswprintf_s(), swprintf_s(), vsnprintf_s() + */ +- +-#if defined(SAFECLIB_HAVE_C99) && !defined(TEST_MSVCRT) ++#if defined FOR_DOXYGEN ++int snwprintf_s(wchar_t *restrict dest, rsize_t dmax, ++ const wchar_t *restrict fmt, ...) ++#elif defined(SAFECLIB_HAVE_C99) && !defined(TEST_MSVCRT) + EXPORT int _snwprintf_s_chk(wchar_t *restrict dest, rsize_t dmax, + const size_t destbos, const wchar_t *restrict fmt, + ...) +diff --git a/src/wchar/swprintf_s.c b/src/wchar/swprintf_s.c +index 824c35bd..be9d47fe 100644 +--- a/src/wchar/swprintf_s.c ++++ b/src/wchar/swprintf_s.c +@@ -108,8 +108,10 @@ any of the arguments corresponding to %s is a null pointer. + * @see + * vswprintf_s(), snwprintf_s(), vsnprintf_s() + */ +- +-#if defined(SAFECLIB_HAVE_C99) && !defined(TEST_MSVCRT) ++#if defined FOR_DOXYGEN ++int swprintf_s(wchar_t *restrict dest, rsize_t dmax, ++ const wchar_t *restrict fmt, ...) ++#elif defined(SAFECLIB_HAVE_C99) && !defined(TEST_MSVCRT) + EXPORT int _swprintf_s_chk(wchar_t *restrict dest, rsize_t dmax, + const size_t destbos, const wchar_t *restrict fmt, + ...) +diff --git a/src/wchar/vsnwprintf_s.c b/src/wchar/vsnwprintf_s.c +index 462f083b..d0760787 100644 +--- a/src/wchar/vsnwprintf_s.c ++++ b/src/wchar/vsnwprintf_s.c +@@ -112,10 +112,15 @@ any of the arguments corresponding to %s is a null pointer. + * @see + * vswprintf_s(), snwprintf_s(), vsnprintf_s() + */ +- ++#ifdef FOR_DOXYGEN ++int vsnwprintf_s(wchar_t *restrict dest, rsize_t dmax, ++ const wchar_t *restrict fmt, va_list ap) ++#else + EXPORT int _vsnwprintf_s_chk(wchar_t *restrict dest, rsize_t dmax, + const size_t destbos, const wchar_t *restrict fmt, +- va_list ap) { ++ va_list ap) ++#endif ++{ + wchar_t *p; + int ret = -1; + const size_t destsz = dmax * sizeof(wchar_t); +diff --git a/src/wchar/vswprintf_s.c b/src/wchar/vswprintf_s.c +index 39baa600..920a0615 100644 +--- a/src/wchar/vswprintf_s.c ++++ b/src/wchar/vswprintf_s.c +@@ -101,10 +101,15 @@ any of the arguments corresponding to %s is a null pointer + * sprintf_s(), vsnprintf_s(), swprintf_s() + * + */ +- ++#ifdef FOR_DOXYGEN ++int vswprintf_s(wchar_t *restrict dest, rsize_t dmax, ++ const wchar_t *restrict fmt, va_list ap) ++#else + EXPORT int _vswprintf_s_chk(wchar_t *restrict dest, rsize_t dmax, + const size_t destbos, const wchar_t *restrict fmt, +- va_list ap) { ++ va_list ap) ++#endif ++{ + wchar_t *p; + int ret = -1; + const size_t destsz = dmax * sizeof(wchar_t); +diff --git a/src/wchar/wcrtomb_s.c b/src/wchar/wcrtomb_s.c +index 89b91a49..e87c776c 100644 +--- a/src/wchar/wcrtomb_s.c ++++ b/src/wchar/wcrtomb_s.c +@@ -120,10 +120,15 @@ + * @see + * wctomb_s() + */ +- ++#ifdef FOR_DOXYGEN ++errno_t wcrtomb_s(size_t *restrict retvalp, char *restrict dest, ++ rsize_t dmax, wchar_t wc, mbstate_t *restrict ps) ++#else + EXPORT errno_t _wcrtomb_s_chk(size_t *restrict retvalp, char *restrict dest, + rsize_t dmax, wchar_t wc, mbstate_t *restrict ps, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + size_t len; + errno_t rc; + +diff --git a/src/wchar/wcscat_s.c b/src/wchar/wcscat_s.c +index 409d5a7e..673e019d 100644 +--- a/src/wchar/wcscat_s.c ++++ b/src/wchar/wcscat_s.c +@@ -96,9 +96,14 @@ + * wcscat_s(), strcpy_s(), strncpy_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t wcscat_s(wchar_t *restrict dest, rsize_t dmax, const wchar_t *restrict src) ++#else + EXPORT errno_t _wcscat_s_chk(wchar_t *restrict dest, rsize_t dmax, + const wchar_t *restrict src, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + rsize_t orig_dmax; + wchar_t *orig_dest; + const wchar_t *overlap_bumper; +diff --git a/src/wchar/wcscpy_s.c b/src/wchar/wcscpy_s.c +index 80ab366b..f395ecff 100644 +--- a/src/wchar/wcscpy_s.c ++++ b/src/wchar/wcscpy_s.c +@@ -82,10 +82,13 @@ + * @see + * wcsncpy(), wmemcpy(), wmemmove(), strncpy_s() + */ +- +-EXPORT errno_t _wcscpy_s_chk(wchar_t *restrict dest, rsize_t dmax, +- const wchar_t *restrict src, +- const size_t destbos) { ++#ifdef FOR_DOXYGEN ++errno_t wcscpy_s(wchar_t *restrict dest, rsize_t dmax, const wchar_t *restrict src) ++#else ++EXPORT errno_t _wcscpy_s_chk(wchar_t *restrict dest, rsize_t dmax, const wchar_t *restrict src, ++ const size_t destbos) ++#endif ++{ + rsize_t orig_dmax; + wchar_t *orig_dest; + const wchar_t *overlap_bumper; +diff --git a/src/wchar/wcsncat_s.c b/src/wchar/wcsncat_s.c +index 26a73802..cc7cf1a5 100644 +--- a/src/wchar/wcsncat_s.c ++++ b/src/wchar/wcsncat_s.c +@@ -101,10 +101,15 @@ + * @see + * wcscat_s(), strncat_s() + */ +- ++#ifdef FOR_DOXYGEN ++errno_t wcsncat_s(wchar_t *restrict dest, rsize_t dmax, ++ const wchar_t *restrict src, rsize_t slen) ++#else + EXPORT errno_t _wcsncat_s_chk(wchar_t *restrict dest, rsize_t dmax, + const wchar_t *restrict src, rsize_t slen, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + rsize_t orig_dmax; + wchar_t *orig_dest; + const wchar_t *overlap_bumper; +diff --git a/src/wchar/wcsncpy_s.c b/src/wchar/wcsncpy_s.c +index d4404f3b..84b8ad42 100644 +--- a/src/wchar/wcsncpy_s.c ++++ b/src/wchar/wcsncpy_s.c +@@ -88,10 +88,15 @@ + * @see + * wcscpy_s(), strncpy_s(), wmemcpy_s(), wmemmove_s() + */ +- ++#ifdef FOR_DOXYGEN ++errno_t wcsncpy_s(wchar_t *restrict dest, rsize_t dmax, ++ const wchar_t *restrict src, rsize_t slen) ++#else + EXPORT errno_t _wcsncpy_s_chk(wchar_t *restrict dest, rsize_t dmax, + const wchar_t *restrict src, rsize_t slen, +- const size_t destbos, const size_t srcbos) { ++ const size_t destbos, const size_t srcbos) ++#endif ++{ + rsize_t orig_dmax; + wchar_t *orig_dest; + const wchar_t *overlap_bumper; +diff --git a/src/wchar/wcsnlen_s.c b/src/wchar/wcsnlen_s.c +index 52c59e2a..e9156342 100644 +--- a/src/wchar/wcsnlen_s.c ++++ b/src/wchar/wcsnlen_s.c +@@ -74,8 +74,12 @@ + * @see + * strnlen_s(), strnterminate_s() + */ +- +-EXPORT rsize_t _wcsnlen_s_chk(const wchar_t *str, rsize_t smax, size_t strbos) { ++#ifdef FOR_DOXYGEN ++rsize_t wcsnlen_s(const wchar_t *str, rsize_t smax) ++#else ++EXPORT rsize_t _wcsnlen_s_chk(const wchar_t *str, rsize_t smax, size_t strbos) ++#endif ++{ + const wchar_t *z; + rsize_t orig_smax = smax; + +diff --git a/src/wchar/wcsrtombs_s.c b/src/wchar/wcsrtombs_s.c +index f83d9a0e..1606300c 100644 +--- a/src/wchar/wcsrtombs_s.c ++++ b/src/wchar/wcsrtombs_s.c +@@ -126,11 +126,17 @@ + * @see + * wcrtomb_s(), wcstombs_s() + */ +- ++#ifdef FOR_DOXYGEN ++errno_t wcsrtombs_s(size_t *restrict retvalp, char *restrict dest, ++ rsize_t dmax, const wchar_t **restrict srcp, ++ rsize_t len, mbstate_t *restrict ps) ++#else + EXPORT errno_t _wcsrtombs_s_chk(size_t *restrict retvalp, char *restrict dest, + rsize_t dmax, const wchar_t **restrict srcp, + rsize_t len, mbstate_t *restrict ps, +- const size_t destbos) { ++ const size_t destbos) ++#endif ++{ + size_t l; + errno_t rc; + +diff --git a/src/wchar/wcstok_s.c b/src/wchar/wcstok_s.c +index 8c3e1ece..abeb8160 100644 +--- a/src/wchar/wcstok_s.c ++++ b/src/wchar/wcstok_s.c +@@ -174,10 +174,15 @@ + * } + * @endcode + */ +- ++#ifdef FOR_DOXYGEN ++wchar_t *wcstok_s(wchar_t *restrict dest, rsize_t *restrict dmaxp, ++ const wchar_t *restrict delim, wchar_t **restrict ptr) ++#else + EXPORT wchar_t *_wcstok_s_chk(wchar_t *restrict dest, rsize_t *restrict dmaxp, + const wchar_t *restrict delim, +- wchar_t **restrict ptr, const size_t destbos) { ++ wchar_t **restrict ptr, const size_t destbos) ++#endif ++{ + const wchar_t *pt; + wchar_t *ptoken; + rsize_t dlen; +diff --git a/src/wchar/wcstombs_s.c b/src/wchar/wcstombs_s.c +index cd6e2e2c..052d2477 100644 +--- a/src/wchar/wcstombs_s.c ++++ b/src/wchar/wcstombs_s.c +@@ -120,9 +120,16 @@ + * @see + * mbstowc_s() + */ ++#ifdef FOR_DOXYGEN ++errno_t wcstombs_s(size_t *restrict retvalp, char *restrict dest, ++ rsize_t dmax, const wchar_t *restrict src, ++ rsize_t len) ++#else + EXPORT errno_t _wcstombs_s_chk(size_t *restrict retvalp, char *restrict dest, + rsize_t dmax, const wchar_t *restrict src, +- rsize_t len, const size_t destbos) { ++ rsize_t len, const size_t destbos) ++#endif ++{ + size_t l; + errno_t rc; + #if defined(__CYGWIN__) && defined(__x86_64) +diff --git a/src/wchar/wctomb_s.c b/src/wchar/wctomb_s.c +index 179aabb4..1506fc8b 100644 +--- a/src/wchar/wctomb_s.c ++++ b/src/wchar/wctomb_s.c +@@ -115,8 +115,14 @@ + * @see + * wcrtomb_s() + */ ++#ifdef FOR_DOXYGEN ++errno_t wctomb_s(int *restrict retvalp, char *restrict dest, ++ rsize_t dmax, wchar_t wc) ++#else + EXPORT errno_t _wctomb_s_chk(int *restrict retvalp, char *restrict dest, +- rsize_t dmax, wchar_t wc, const size_t destbos) { ++ rsize_t dmax, wchar_t wc, const size_t destbos) ++#endif ++{ + int len; + errno_t rc; + #if defined(__CYGWIN__) && defined(__x86_64) +diff --git a/src/wchar/wmemcpy_s.c b/src/wchar/wmemcpy_s.c +index d556ba0b..c0a629a4 100644 +--- a/src/wchar/wmemcpy_s.c ++++ b/src/wchar/wmemcpy_s.c +@@ -98,10 +98,14 @@ + * memcpy_s(), memcpy16_s(), wmemmove_s(), memmove16_s() + * + */ +- ++#ifdef FOR_DOXYGEN ++errno_t wmemcpy_s(wchar_t *dest, rsize_t dlen, const wchar_t *src, rsize_t count) ++#else + EXPORT errno_t _wmemcpy_s_chk(wchar_t *dest, rsize_t dlen, const wchar_t *src, + rsize_t count, const size_t destbos, +- const size_t srcbos) { ++ const size_t srcbos) ++#endif ++{ + const rsize_t dmax = dlen * SIZEOF_WCHAR_T; + const rsize_t smax = count * SIZEOF_WCHAR_T; + +diff --git a/src/wchar/wmemmove_s.c b/src/wchar/wmemmove_s.c +index b24fa695..fcf08757 100644 +--- a/src/wchar/wmemmove_s.c ++++ b/src/wchar/wmemmove_s.c +@@ -104,9 +104,14 @@ + * memmove_s(), memmove16_s(), memcpy_s(), memcpy16_s() memcpy32_s() + * + */ ++#ifdef FOR_DOXYGEN ++errno_t wmemmove_s(wchar_t *dest, rsize_t dlen, const wchar_t *src, rsize_t count) ++#else + EXPORT errno_t _wmemmove_s_chk(wchar_t *dest, rsize_t dlen, const wchar_t *src, + rsize_t count, const size_t destbos, +- const size_t srcbos) { ++ const size_t srcbos) ++#endif ++{ + const rsize_t dmax = dlen * SIZEOF_WCHAR_T; + const rsize_t smax = count * SIZEOF_WCHAR_T; + diff --git a/meta-oe/recipes-core/safec/safec/0002-man-fix-various-doxygen-warnings.patch b/meta-oe/recipes-core/safec/safec/0002-man-fix-various-doxygen-warnings.patch new file mode 100644 index 000000000..fa4b13218 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0002-man-fix-various-doxygen-warnings.patch @@ -0,0 +1,438 @@ +From a171e13459a043d95425095fb2fa16f63c6cd726 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Wed, 2 Sep 2020 08:48:25 +0200 +Subject: [PATCH] man: fix various doxygen warnings + +* duplicate return values. +--- + src/extmem/memchr_s.c | 6 +++--- + src/extmem/memcpy16_s.c | 9 ++++----- + src/extmem/memcpy32_s.c | 9 ++++----- + src/extmem/memmove16_s.c | 7 +++---- + src/extmem/memmove32_s.c | 7 +++---- + src/extmem/memrchr_s.c | 5 ++--- + src/extmem/memset16_s.c | 12 ++++++------ + src/extmem/memset32_s.c | 12 ++++++------ + src/extstr/strchr_s.c | 3 +-- + src/extstr/strnset_s.c | 3 +-- + src/extstr/strrchr_s.c | 3 +-- + src/extstr/strset_s.c | 3 +-- + src/extwchar/wcsnatcmp_s.c | 3 +-- + src/io/gets_s.c | 4 ++-- + src/mem/memcpy_s.c | 2 +- + src/mem/memmove_s.c | 2 +- + src/os/ctime_s.c | 10 +++++----- + src/wchar/vfwscanf_s.c | 5 +++-- + src/wchar/vwscanf_s.c | 5 +++-- + src/wchar/wcrtomb_s.c | 4 +--- + src/wchar/wcsrtombs_s.c | 3 ++- + 21 files changed, 54 insertions(+), 63 deletions(-) + +diff --git a/src/extmem/memchr_s.c b/src/extmem/memchr_s.c +index 91b6265c..4f166147 100644 +--- a/src/extmem/memchr_s.c ++++ b/src/extmem/memchr_s.c +@@ -55,11 +55,11 @@ + * @pre dmax shall not be greater than RSIZE_MAX_MEM and sizeof(dest) + * @pre ch shall not be greater than 255 + * +- * @retval EOK when successfully character found. ++ * @retval EOK when the character was successfully found. + * @retval ESNULLP when dest/result is a NULL pointer + * @retval ESZEROL when dmax = 0 +- * @retval ESLEMAX when dmax > RSIZE_MAX_MEM or > sizeof(dest) +- * @retval ESLEMAX when ch > 255 ++ * @retval ESLEMAX when dmax > RSIZE_MAX_MEM or > sizeof(dest). ++ * Or when ch > 255 + * @retval ESNOTFND when ch not found in dest + * + * @see +diff --git a/src/extmem/memcpy16_s.c b/src/extmem/memcpy16_s.c +index 6aefffbb..4c1f483c 100644 +--- a/src/extmem/memcpy16_s.c ++++ b/src/extmem/memcpy16_s.c +@@ -67,13 +67,12 @@ + * @retval EOK when operation is successful or slen = 0 + * @retval ESNULLP when dest/src is NULL POINTER + * @retval ESZEROL when dmax = ZERO +- * @retval ESLEMAX when dmax > RSIZE_MAX_MEM ++ * @retval ESLEMAX when dmax > RSIZE_MAX_MEM or slen > RSIZE_MAX_MEM16 + * @retval EOVERFLOW when dmax > size of dest (optionally, when the compiler +- * knows the object_size statically) ++ * knows the object_size statically). ++ * Or when 2*slen > size of src (optionally, when the ++ * compiler knows the object_size statically) + * @retval ESLEWRNG when dmax != sizeof(dest) and --enable-error-dmax +- * @retval ESLEMAX when slen > RSIZE_MAX_MEM16 +- * @retval EOVERFLOW when 2*slen > size of src (optionally, when the +- * compiler knows the object_size statically) + * @retval ESNOSPC when 2*slen > dmax + * @retval ESOVRLP when src memory overlaps dest + * +diff --git a/src/extmem/memcpy32_s.c b/src/extmem/memcpy32_s.c +index 4c6ebcad..4c50dcd6 100644 +--- a/src/extmem/memcpy32_s.c ++++ b/src/extmem/memcpy32_s.c +@@ -67,13 +67,12 @@ + * @retval EOK when operation is successful or slen = 0 + * @retval ESNULLP when dest/src is NULL POINTER + * @retval ESZEROL when dmax = ZERO +- * @retval ESLEMAX when dmax > RSIZE_MAX_MEM ++ * @retval ESLEMAX when dmax > RSIZE_MAX_MEM or slen > RSIZE_MAX_MEM32 + * @retval EOVERFLOW when dmax > size of dest (optionally, when the compiler +- * knows the object_size statically) ++ * knows the object_size statically). ++ * Or when 4*slen > size of src (optionally, when the ++ * compiler knows the object_size statically) + * @retval ESLEWRNG when dmax != sizeof(dest) and --enable-error-dmax +- * @retval ESLEMAX when slen > RSIZE_MAX_MEM32 +- * @retval EOVERFLOW when 4*slen > size of src (optionally, when the +- * compiler knows the object_size statically) + * @retval ESNOSPC when 4*slen > dmax + * @retval ESOVRLP when src memory overlaps dest + * +diff --git a/src/extmem/memmove16_s.c b/src/extmem/memmove16_s.c +index c2a3449e..595179e9 100644 +--- a/src/extmem/memmove16_s.c ++++ b/src/extmem/memmove16_s.c +@@ -69,13 +69,12 @@ + * @retval EOK when operation is successful or slen = 0 + * @retval ESNULLP when dest/src is NULL POINTER + * @retval ESZEROL when dmax = ZERO +- * @retval ESLEMAX when dmax > RSIZE_MAX_MEM ++ * @retval ESLEMAX when dmax > RSIZE_MAX_MEM or slen > RSIZE_MAX_MEM16 + * @retval EOVERFLOW when dmax > size of dest (optionally, when the ++ * compiler knows the object_size statically). ++ * Or when 2*slen > size of src (optionally, when the + * compiler knows the object_size statically) + * @retval ESLEWRNG when dmax != sizeof(dest) and --enable-error-dmax +- * @retval ESLEMAX when slen > RSIZE_MAX_MEM16 +- * @retval EOVERFLOW when 2*slen > size of src (optionally, when the +- * compiler knows the object_size statically) + * @retval ESNOSPC when 2*slen > dmax + * + * @see +diff --git a/src/extmem/memmove32_s.c b/src/extmem/memmove32_s.c +index 2cc60c94..3c8e7e42 100644 +--- a/src/extmem/memmove32_s.c ++++ b/src/extmem/memmove32_s.c +@@ -71,13 +71,12 @@ + * @retval EOK when operation is successful or slen = 0 + * @retval ESNULLP when dest/src is NULL POINTER + * @retval ESZEROL when dmax = ZERO +- * @retval ESLEMAX when dmax > RSIZE_MAX_MEM ++ * @retval ESLEMAX when dmax > RSIZE_MAX_MEM or slen > RSIZE_MAX_MEM32 + * @retval EOVERFLOW when dmax > size of dest (optionally, when the ++ * compiler knows the object_size statically). ++ * Or when 4*slen > size of src (optionally, when the + * compiler knows the object_size statically) + * @retval ESLEWRNG when dmax != sizeof(dest) and --enable-error-dmax +- * @retval ESLEMAX when slen > RSIZE_MAX_MEM32 +- * @retval EOVERFLOW when 4*slen > size of src (optionally, when the +- * compiler knows the object_size statically) + * @retval ESNOSPC when 4*slen > dmax + * + * @see +diff --git a/src/extmem/memrchr_s.c b/src/extmem/memrchr_s.c +index 2ffeabaa..e0a5b84c 100644 +--- a/src/extmem/memrchr_s.c ++++ b/src/extmem/memrchr_s.c +@@ -62,14 +62,13 @@ extern void *memrchr(const void *, int, size_t); + * @pre dmax shall not be greater than RSIZE_MAX_MEM and size of dest + * @pre ch shall not be greater than 255 + * +- * @retval EOK when successfully character found. ++ * @retval EOK when the character was successfully found. + * @retval ESNULLP when dest/result is a NULL pointer + * @retval ESZEROL when dmax = 0 +- * @retval ESLEMAX when dmax > RSIZE_MAX_MEM ++ * @retval ESLEMAX when dmax > RSIZE_MAX_MEM or ch > 255 + * @retval EOVERFLOW when dmax > size of dest (optionally, when the compiler + * knows the object_size statically) + * @retval ESLEWRNG when dmax != size of dest and --enable-error-dmax +- * @retval ESLEMAX when ch > 255 + * @retval ESNOTFND when ch not found in dest + * + * @see +diff --git a/src/extmem/memset16_s.c b/src/extmem/memset16_s.c +index 1da0082b..acc6abc3 100644 +--- a/src/extmem/memset16_s.c ++++ b/src/extmem/memset16_s.c +@@ -59,17 +59,17 @@ + * @pre n shall not be greater than RSIZE_MAX_MEM16. + * @pre 2*n may not be greater than dmax + * +- * @return If there is a runtime-constraints violation, and if dest is not a +- * null pointer, and if dmax is not larger than RSIZE_MAX_MEM, then, before +- * reporting the runtime-constraints violation, memset16_s() copies +- * dmax bytes to the destination. ++ * @return If there is a runtime-constraints violation, and if dest is ++ * not a null pointer, and if dmax is not larger than ++ * RSIZE_MAX_MEM, then, before reporting the ++ * runtime-constraints violation, memset16_s() copies dmax ++ * bytes to the destination. + * @retval EOK when operation is successful or n = 0 + * @retval ESNULLP when dest is NULL POINTER +- * @retval ESLEMAX when dmax > RSIZE_MAX_MEM ++ * @retval ESLEMAX when dmax > RSIZE_MAX_MEM or n > RSIZE_MAX_MEM16 + * @retval EOVERFLOW when dmax > size of dest (optionally, when the compiler + * knows the object_size statically) + * @retval ESLEWRNG when dmax != size of dest and --enable-error-dmax +- * @retval ESLEMAX when n > RSIZE_MAX_MEM16 + * @retval ESNOSPC when 2*n > dmax + * + * @see +diff --git a/src/extmem/memset32_s.c b/src/extmem/memset32_s.c +index 11733cb2..dbf42eeb 100644 +--- a/src/extmem/memset32_s.c ++++ b/src/extmem/memset32_s.c +@@ -59,17 +59,17 @@ + * @pre n shall not be greater than RSIZE_MAX_MEM32. + * @pre 4*n may not be greater than dmax. + * +- * @return If there is a runtime-constraints violation, and if dest is not a +- * null pointer, and if dmax is not larger than RSIZE_MAX_MEM, then, before +- * reporting the runtime-constraints violation, memset32_s() copies +- * dmax bytes to the destination. ++ * @return If there is a runtime-constraints violation, and if dest is ++ * not a null pointer, and if dmax is not larger than ++ * RSIZE_MAX_MEM, then, before reporting the ++ * runtime-constraints violation, memset32_s() copies dmax ++ * bytes to the destination. + * @retval EOK when operation is successful or n = 0 + * @retval ESNULLP when dest is NULL POINTER +- * @retval ESLEMAX when dmax > RSIZE_MAX_MEM ++ * @retval ESLEMAX when dmax > RSIZE_MAX_MEM or n > RSIZE_MAX_MEM32 + * @retval EOVERFLOW when dmax > size of dest (optionally, when the compiler + * knows the object_size statically) + * @retval ESLEWRNG when dmax != size of dest and --enable-error-dmax +- * @retval ESLEMAX when n > RSIZE_MAX_MEM32 + * @retval ESNOSPC when 4*n > dmax + * + * @see +diff --git a/src/extstr/strchr_s.c b/src/extstr/strchr_s.c +index 2229d2a2..5fd84d86 100644 +--- a/src/extstr/strchr_s.c ++++ b/src/extstr/strchr_s.c +@@ -59,11 +59,10 @@ + * @retval EOK when successfully character found. + * @retval ESNULLP when dest/resultp is a NULL pointer + * @retval ESZEROL when dmax = 0 +- * @retval ESLEMAX when dmax > RSIZE_MAX_STR ++ * @retval ESLEMAX when dmax > RSIZE_MAX_STR, or ch > 255 + * @retval EOVERFLOW when dmax > size of dest (optionally, when the compiler + * knows the object_size statically) + * @retval ESLEWRNG when dmax != size of dest and --enable-error-dmax +- * @retval ESLEMAX when ch > 255 + * @retval ESNOTFND when ch not found in dest + * + * @see +diff --git a/src/extstr/strnset_s.c b/src/extstr/strnset_s.c +index 99f36109..1ede9888 100644 +--- a/src/extstr/strnset_s.c ++++ b/src/extstr/strnset_s.c +@@ -64,8 +64,7 @@ + * @retval EOK when successful + * @retval ESNULLP when dest is NULL pointer + * @retval ESZEROL when dmax = 0 +- * @retval ESLEMAX when value > 255 +- * @retval ESLEMAX when dmax > RSIZE_MAX_STR ++ * @retval ESLEMAX when value > 255 or dmax > RSIZE_MAX_STR + * @retval EOVERFLOW when dmax > size of dest (optionally, when the compiler + * knows the object_size statically) + * @retval ESLEWRNG when dmax != sizeof(dest) and --enable-error-dmax +diff --git a/src/extstr/strrchr_s.c b/src/extstr/strrchr_s.c +index 3e056ca6..e7f5178d 100644 +--- a/src/extstr/strrchr_s.c ++++ b/src/extstr/strrchr_s.c +@@ -60,11 +60,10 @@ + * @retval EOK when successfully character found. + * @retval ESNULLP when dest/resultp is a NULL pointer + * @retval ESZEROL when dmax = 0 or strnlen_s = 0 +- * @retval ESLEMAX when dmax > RSIZE_MAX_STR ++ * @retval ESLEMAX when dmax > RSIZE_MAX_STR or ch > 255 + * @retval EOVERFLOW when dmax > size of dest (optionally, when the compiler + * knows the object_size statically) + * @retval ESLEWRNG when dmax != size of dest and --enable-error-dmax +- * @retval ESLEMAX when ch > 255 + * @retval ESNOTFND when ch not found in dest + * + * @see +diff --git a/src/extstr/strset_s.c b/src/extstr/strset_s.c +index 99ec7cdd..4100c881 100644 +--- a/src/extstr/strset_s.c ++++ b/src/extstr/strset_s.c +@@ -62,8 +62,7 @@ + * @retval EOK when successful + * @retval ESNULLP when dest is NULL pointer + * @retval ESZEROL when dmax = 0 +- * @retval ESLEMAX when value > 255 +- * @retval ESLEMAX when dmax > RSIZE_MAX_STR ++ * @retval ESLEMAX when value > 255 or dmax > RSIZE_MAX_STR + * @retval EOVERFLOW when dmax > size of dest (optionally, when the compiler + * knows the object_size statically) + * @retval ESLEWRNG when dmax != sizeof(dest) and --enable-error-dmax +diff --git a/src/extwchar/wcsnatcmp_s.c b/src/extwchar/wcsnatcmp_s.c +index f27b8f3d..9af8ef1f 100644 +--- a/src/extwchar/wcsnatcmp_s.c ++++ b/src/extwchar/wcsnatcmp_s.c +@@ -73,11 +73,10 @@ + * @retval EOK when comparison is complete + * @retval ESUNTERM when dest or src is unterminated, or dmax is too small. + * @retval ESNULLP when dest/src/resultp is NULL pointer +- * @retval ESZEROL when dmax = 0 + * @retval ESZEROL when dmax/smax = 0 + * @retval ESLEMAX when dmax/smax > RSIZE_MAX_WSTR + * @retval EOVERFLOW when dmax/smax > size of dest/src (optionally, when the +- * compiler knows the object_size statically) ++ * compiler knows the object_size statically) + * @retval ESLEWRNG when dmax != size of dest and --enable-error-dmax + * + * @see +diff --git a/src/io/gets_s.c b/src/io/gets_s.c +index 382945d0..05366dd1 100644 +--- a/src/io/gets_s.c ++++ b/src/io/gets_s.c +@@ -85,9 +85,9 @@ + * @return If there is a runtime-constraint violation, then if dest is + * not a null pointer and dmax is greater than zero and not + * greater than RSIZE_MAX_STR, then gets_s nulls dest. +- * @retval >0 when successful operation, all the characters from src ++ * @retval int >0 when on successful operation, all the characters from src + * were appended to dest and the result in dest is null +- terminated. ++ * terminated. + * @retval 0 + errno=ESNULLP when dest is a NULL pointer + * @retval 0 + errno=ESZEROL when dmax = 0 + * @retval 0 + errno=ESLEMAX when dmax > RSIZE_MAX_STR +diff --git a/src/mem/memcpy_s.c b/src/mem/memcpy_s.c +index 742070cb..5a287786 100644 +--- a/src/mem/memcpy_s.c ++++ b/src/mem/memcpy_s.c +@@ -79,7 +79,7 @@ + * @retval ESZEROL when dmax = 0 + * @retval ESLEMAX when dmax/slen > RSIZE_MAX_MEM + * @retval EOVERFLOW when dmax/slen > size of dest/src (optionally, when the +- * compiler knows the object_size statically) ++ * compiler knows the object_size statically) + * @retval ESLEWRNG when dmax != size of dest and --enable-error-dmax + * @retval ESNOSPC when dmax < slen + * @retval ESOVRLP when src memory overlaps dst +diff --git a/src/mem/memmove_s.c b/src/mem/memmove_s.c +index 2d844497..e1dfbe17 100644 +--- a/src/mem/memmove_s.c ++++ b/src/mem/memmove_s.c +@@ -83,7 +83,7 @@ + * @retval ESZEROL when dmax = 0 + * @retval ESLEMAX when dmax/slen > RSIZE_MAX_MEM + * @retval EOVERFLOW when dmax/slen > size of dest/src (optionally, when the +- * compiler knows the object_size statically) ++ * compiler knows the object_size statically) + * @retval ESLEWRNG when dmax != size of dest and --enable-error-dmax + * @retval ESNOSPC when dmax < slen + * +diff --git a/src/os/ctime_s.c b/src/os/ctime_s.c +index e50b5fab..277c91ef 100644 +--- a/src/os/ctime_s.c ++++ b/src/os/ctime_s.c +@@ -82,19 +82,19 @@ char *ctime_r(const time_t *, char *); + * @retval EOK on success + * @retval ESNULLP when dest or tm is a NULL pointer + * @retval ESLEMIN when dmax < 26 or *timer < 0 +- * @retval ESLEMAX when dmax > RSIZE_MAX_STR ++ * @retval ESLEMAX when dmax > RSIZE_MAX_STR. ++ * Or when *timer > 313360441200L, the year 10000, ++ * resp. LONG_MAX on 32bit systems. + * @retval EOVERFLOW when dmax > size of dest (optionally, when the compiler + * knows the object_size statically) + * @retval ESLEWRNG when dmax != size of dest and --enable-error-dmax +- * @retval ESLEMAX when *timer > 313360441200L, the year 10000, +- * resp. LONG_MAX on 32bit systems + * @retval ESNOSPC when dmax is too small for the result buffer + * @retval -1 when ctime_r or ctime returned NULL + * + * @note + * ctime returns a pointer to static data and is not thread-safe. In +- * addition, it modifies the static tm object which may be shared with gmtime +- * and localtime. POSIX marks this function obsolete and recommends strftime ++ * addition, it modifies the static tm object which may be shared with gmtime ++ * and localtime. POSIX marks this function obsolete and recommends strftime + * instead. The C standard also recommends strftime instead of ctime and + * ctime_s because strftime is more flexible and locale-sensitive. The + * behavior of ctime may be undefined for the values of time_t that result +diff --git a/src/wchar/vfwscanf_s.c b/src/wchar/vfwscanf_s.c +index 5554c3b5..d3e36122 100644 +--- a/src/wchar/vfwscanf_s.c ++++ b/src/wchar/vfwscanf_s.c +@@ -79,7 +79,7 @@ any of the arguments corresponding to %s is a null pointer. + * @todo When an argument is not assigned to, it should be zero'd + * (not yet). + * +- * @retval > 0 on success, the number of arguments assigned ++ * @retval int >0 on success, the number of arguments assigned + * @retval EOF on error + * + * @see +@@ -88,7 +88,8 @@ any of the arguments corresponding to %s is a null pointer. + */ + + EXPORT int vfwscanf_s(FILE *restrict stream, const wchar_t *restrict fmt, +- va_list ap) { ++ va_list ap) ++{ + wchar_t *p; + int ret; + +diff --git a/src/wchar/vwscanf_s.c b/src/wchar/vwscanf_s.c +index aec4cedc..57d502ff 100644 +--- a/src/wchar/vwscanf_s.c ++++ b/src/wchar/vwscanf_s.c +@@ -75,7 +75,7 @@ any of the arguments corresponding to %s is a null pointer. + * was assigned or if there is a runtime constraint + * violation. + * +- * @retval > 0 on success, the number of arguments assigned ++ * @retval int >0 on success, the number of arguments assigned + * @retval EOF on error + * + * @see +@@ -83,7 +83,8 @@ any of the arguments corresponding to %s is a null pointer. + * + */ + +-EXPORT int vwscanf_s(const wchar_t *restrict fmt, va_list ap) { ++EXPORT int vwscanf_s(const wchar_t *restrict fmt, va_list ap) ++{ + wchar_t *p; + int ret; + +diff --git a/src/wchar/wcrtomb_s.c b/src/wchar/wcrtomb_s.c +index e87c776c..24531488 100644 +--- a/src/wchar/wcrtomb_s.c ++++ b/src/wchar/wcrtomb_s.c +@@ -111,10 +111,8 @@ + * @retval EOVERFLOW when dmax > size of dest (optionally, when the compiler + * knows the object_size statically), unless dest is NULL + * @retval ESLEMAX when dmax > RSIZE_MAX_STR, unless dest is NULL +- * @retval EOVERFLOW when dmax > size of dest (optionally, when the compiler +- * knows the object_size statically) + * @retval ESLEWRNG when dmax != size of dest and --enable-error-dmax and +- * dest != NULL ++ * dest != NULL + * @retval ESNOSPC when dmax is smaller than the number of required bytes + * + * @see +diff --git a/src/wchar/wcsrtombs_s.c b/src/wchar/wcsrtombs_s.c +index 1606300c..02397d7e 100644 +--- a/src/wchar/wcsrtombs_s.c ++++ b/src/wchar/wcsrtombs_s.c +@@ -115,7 +115,8 @@ + * @retval ESZEROL when dmax = 0, unless dest is NULL + * @retval ESLEMAX when dmax > RSIZE_MAX_STR, unless dest is NULL + * @retval EOVERFLOW when dmax or len > size of dest (optionally, when the +- * compiler knows the object_size statically), unless dest is NULL ++ * compiler knows the object_size statically), unless dest ++ * is NULL + * @retval ESLEWRNG when dmax != size of dest and --enable-error-dmax + * @retval ESOVRLP when *srcp and dest overlap + * @retval ESNOSPC when there is no null character in the first dmax diff --git a/meta-oe/recipes-core/safec/safec/0003-v02092020-3.6.0-release.patch b/meta-oe/recipes-core/safec/safec/0003-v02092020-3.6.0-release.patch new file mode 100644 index 000000000..5e3e0f889 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0003-v02092020-3.6.0-release.patch @@ -0,0 +1,24 @@ +From 6d921f4e95586897fce98202ada7da82e0a6e97d Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Wed, 2 Sep 2020 09:18:04 +0200 +Subject: [PATCH] v02092020 3.6.0 release + +--- + ChangeLog | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/ChangeLog b/ChangeLog +index 563e0329..147b5feb 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,6 +1,10 @@ + + ChangeLog file for safeclib + ++Changes in v02092020 3.6.0 ++ - Improved generated man pages. Describe not the private _chk functions, ++ but the public _s functions. Merge duplicate return values. ++ + Changes in v31082020 3.6.0 + - Added smokers for more architectures and distros: + ubuntu, debian, centos, fedora, rhel / diff --git a/meta-oe/recipes-core/safec/safec/0004-drone-no-fedora-modular-on-arm32.patch b/meta-oe/recipes-core/safec/safec/0004-drone-no-fedora-modular-on-arm32.patch new file mode 100644 index 000000000..4af3f5c3c --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0004-drone-no-fedora-modular-on-arm32.patch @@ -0,0 +1,34 @@ +From b25770ba512a887c9d6655d8217b10b13ba6f89f Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Thu, 3 Sep 2020 17:13:45 +0200 +Subject: [PATCH] drone: no fedora modular on arm32 + +no idea why this fails. +use the debian image, as with travis. +--- + .drone.yml | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +diff --git a/.drone.yml b/.drone.yml +index 473b12dc..31b0494f 100644 +--- a/.drone.yml ++++ b/.drone.yml +@@ -28,12 +28,14 @@ platform: + os: linux + arch: arm + steps: +- - name: arm32v7-fedora +- image: arm32v7/fedora ++ - name: arm32v7-debian ++ image: arm32v7/debian + commands: + - uname -a +- - dnf install -y gcc make file git automake autoconf which +- libtool perl-Text-Diff pkgconf-pkg-config ++ - apt-get update -qq ++ - apt-get install -yq --no-install-suggests --no-install-recommends ++ build-essential file gcc make autotools-dev automake autoconf libtool ++ libtext-diff-perl pkg-config + - build-aux/autogen.sh + - build-aux/conf-make-check.sh + trigger: diff --git a/meta-oe/recipes-core/safec/safec/0005-document-new-CI-s-tested-archs.patch b/meta-oe/recipes-core/safec/safec/0005-document-new-CI-s-tested-archs.patch new file mode 100644 index 000000000..70043ea8f --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0005-document-new-CI-s-tested-archs.patch @@ -0,0 +1,32 @@ +From 5d5c492eaa29fa357274d3f7d7912497d73db5a9 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Thu, 3 Sep 2020 17:42:41 +0200 +Subject: [PATCH] document new CI's, tested archs + +--- + README | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/README b/README +index 66e65f9c..77ca06a2 100644 +--- a/README ++++ b/README +@@ -257,10 +257,16 @@ Tested Platforms + - cygwin32 gcc (newlib) + - cygwin64 gcc -std=c99 (newlib) + - freebsd 10 - 12 amd64 +-- arm-linux-gnueabihf cross-compiled and tested under qemu (under darwin and debian) ++- linux docker images under qemu: ++ i386/debian, x86_64/rhel, arm32v7/debian, aarch64: arm64v8/{debian,centos,rhel,fedora}, ++ s390x/fedora (the only big endian test I could find), ppc64le/{debian,ubuntu,fedora,centos,rhel} + - User Mode Linux (UML), Linux kernel version v3.5.3 w/ Debian Squeeze rootfs + +-with most available compilers. See `build-aux/smoke.sh`. ++with most available compilers. See `build-aux/smoke.sh` and the various CI configs. ++- https://travis-ci.org/github/rurban/safeclib/ ++- https://ci.appveyor.com/project/rurban/safeclib/ ++- https://cirrus-ci.com/github/rurban/safeclib ++- https://cloud.drone.io/rurban/safeclib/ + + Known Issues + ------------ diff --git a/meta-oe/recipes-core/safec/safec/0006-man-improved-s-n-printf_s.patch b/meta-oe/recipes-core/safec/safec/0006-man-improved-s-n-printf_s.patch new file mode 100644 index 000000000..98b850cd8 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0006-man-improved-s-n-printf_s.patch @@ -0,0 +1,42 @@ +From a43d2b146614507e4f4aae6521fbaa2bd84bb4dc Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Fri, 4 Sep 2020 14:18:33 +0200 +Subject: [PATCH] man: improved s{n,}printf_s + +--- + src/str/snprintf_s.c | 5 +++-- + src/str/sprintf_s.c | 5 +++-- + 2 files changed, 6 insertions(+), 4 deletions(-) + +diff --git a/src/str/snprintf_s.c b/src/str/snprintf_s.c +index f74f6826..9f27d210 100644 +--- a/src/str/snprintf_s.c ++++ b/src/str/snprintf_s.c +@@ -90,8 +90,9 @@ any of the arguments corresponding to %s is a null pointer + * @see + * sprintf_s(), vsnprintf_s(), snwprintf_s() + */ +- +-#ifdef SAFECLIB_HAVE_C99 ++#if defined FOR_DOXYGEN ++int sprintf_s(char *restrict dest, rsize_t dmax, const char *restrict fmt, ...) ++#elif defined SAFECLIB_HAVE_C99 + EXPORT int _snprintf_s_chk(char *restrict dest, rsize_t dmax, + const size_t destbos, const char *restrict fmt, ...) + #else +diff --git a/src/str/sprintf_s.c b/src/str/sprintf_s.c +index 50875869..1c12b1c8 100644 +--- a/src/str/sprintf_s.c ++++ b/src/str/sprintf_s.c +@@ -96,8 +96,9 @@ + * @see + * vsprintf_s(), snprintf_s() + */ +- +-#ifdef SAFECLIB_HAVE_C99 ++#if defined FOR_DOXYGEN ++int sprintf_s(char *restrict dest, rsize_t dmax, const char *restrict fmt, ...) ++#elif defined SAFECLIB_HAVE_C99 + EXPORT int _sprintf_s_chk(char *restrict dest, const rsize_t dmax, + const size_t destbos, const char *restrict fmt, ...) + #else diff --git a/meta-oe/recipes-core/safec/safec/0007-mem_prim_set-remove-duplicate-MEMORY_BARRIER.patch b/meta-oe/recipes-core/safec/safec/0007-mem_prim_set-remove-duplicate-MEMORY_BARRIER.patch new file mode 100644 index 000000000..63cbae4a8 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0007-mem_prim_set-remove-duplicate-MEMORY_BARRIER.patch @@ -0,0 +1,31 @@ +From d870926392b8728115a3d9bb7cb789def374bec2 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Wed, 9 Sep 2020 11:00:41 +0200 +Subject: [PATCH] mem_prim_set: remove duplicate MEMORY_BARRIER + +They are already in all memset/zero/cpy calls. we dont need it twice, keep +mem_prim_set fast +--- + src/mem/mem_primitives_lib.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/src/mem/mem_primitives_lib.c b/src/mem/mem_primitives_lib.c +index 49e7641e..6890d8bf 100644 +--- a/src/mem/mem_primitives_lib.c ++++ b/src/mem/mem_primitives_lib.c +@@ -160,7 +160,6 @@ void mem_prim_set(void *dest, uint32_t len, uint8_t value) { + *dp = value; + } + +- MEMORY_BARRIER; + return; + } + +@@ -267,7 +266,6 @@ void mem_prim_set(void *dest, uint32_t len, uint8_t value) { + *dp = value; + } + +- MEMORY_BARRIER; + return; + } + diff --git a/meta-oe/recipes-core/safec/safec/0008-perf_memset_s-add-mem_prim_set-test-without-MEMORY_B.patch b/meta-oe/recipes-core/safec/safec/0008-perf_memset_s-add-mem_prim_set-test-without-MEMORY_B.patch new file mode 100644 index 000000000..c6bc88678 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0008-perf_memset_s-add-mem_prim_set-test-without-MEMORY_B.patch @@ -0,0 +1,101 @@ +From 5c131595b20fd72aaebae6080be0b5bd6db6e307 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Wed, 9 Sep 2020 11:13:18 +0200 +Subject: [PATCH] perf_memset_s: add mem_prim_set test without MEMORY_BARRIER + +to test the MEMORY_BARRIER overhead and compare the fast mem_prim_set +with native memset. + +gcc and clang overheads now both bad: 56/51% slower. +apparently glibc got faster in between. +--- + tests/Makefile.am | 1 + + tests/perf_memset_s.c | 31 +++++++++++++++++++++++++------ + 2 files changed, 26 insertions(+), 6 deletions(-) + +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 0102363e..b184b9b5 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -279,6 +279,7 @@ endif + + p_memcpy_s_SOURCES = perf_memcpy_s.c $(SAFEC_TEST_COMMON) + p_memset_s_SOURCES = perf_memset_s.c $(SAFEC_TEST_COMMON) ++p_memset_s_CFLAGS = $(CFLAGS) $(AM_CFLAGS) -I$(top_srcdir)/src + p_strcpy_s_SOURCES = perf_strcpy_s.c $(SAFEC_TEST_COMMON) + + t_memcpy_s_SOURCES = test_memcpy_s.c $(SAFEC_TEST_COMMON) \ +diff --git a/tests/perf_memset_s.c b/tests/perf_memset_s.c +index 6ca4b24c..eab767d1 100644 +--- a/tests/perf_memset_s.c ++++ b/tests/perf_memset_s.c +@@ -17,10 +17,17 @@ + * memset_s.o 1228 +56%, 444 bytes + * + * Speed overhead: -1 - 2% ++ * ++ * fc32 on ryzen3: ++ * gcc-10.2.1 speed overhead: 56.56% ++ * clang-10.0 speed overhead: 51.25% ++ * + */ + + #include "test_private.h" + #include "safe_mem_lib.h" ++#undef debug_printf ++#include "mem/mem_primitives_lib.h" + + #ifndef __KERNEL__ + #ifdef TIME_WITH_SYS_TIME +@@ -74,9 +81,9 @@ static double timing_loop(uint32_t len, uint32_t loops) { + + clock_t sl_clock_diff; + clock_t sd_clock_diff; ++ clock_t sp_clock_diff; + +- double sl_clock_dur; +- double sd_clock_dur; ++ double sl_clock_dur, sd_clock_dur, sp_clock_dur; + double percent; + + for (i = 0; i < LEN; i++) { +@@ -89,7 +96,18 @@ static double timing_loop(uint32_t len, uint32_t loops) { + /*printf("\n Timing %d byte copy, %u loops \n", len, loops); */ + + /* +- * Safe C Lib Routine ++ * Fast safe C Lib Routine (without MEMORY_BARRIER) ++ */ ++ clock_start = rdtsc(); ++ for (i = 0; i < loops; i++) { ++ mem_prim_set(mem1, len, 0); ++ } ++ clock_end = rdtsc(); ++ ++ sp_clock_diff = (clock_end - clock_start) / loops; ++ ++ /* ++ * Slow safe C Lib Routine (with MEMORY_BARRIER) + */ + clock_start = rdtsc(); + for (i = 0; i < loops; i++) { +@@ -123,15 +141,16 @@ static double timing_loop(uint32_t len, uint32_t loops) { + sd_clock_diff = (clock_end - clock_start) / loops; + + /* convert to seconds */ ++ sp_clock_dur = ((double)(sp_clock_diff) / CLOCKS_PER_SEC); + sl_clock_dur = ((double)(sl_clock_diff) / CLOCKS_PER_SEC); + sd_clock_dur = ((double)(sd_clock_diff) / CLOCKS_PER_SEC); + percent = 100 * (sl_clock_dur - sd_clock_dur) / sl_clock_dur; + + /* just to disable optimizing away the inner loop */ + /* fprintf(stderr, "errors %lu\n", errors); */ +- printf("%u %u memset_s %1.6f memset %1.6f diff %1.6f %2.2f %%\n", +- loops, len, sl_clock_dur, sd_clock_dur, +- (sl_clock_dur - sd_clock_dur), percent); ++ printf("%u %u mem_prim_set %1.6f memset_s %1.6f memset %1.6f diff %1.6f %2.2f %%\n", ++ loops, len, sp_clock_dur, sl_clock_dur, sd_clock_dur, ++ (sp_clock_dur - sd_clock_dur), percent); + + return percent; + } diff --git a/meta-oe/recipes-core/safec/safec/0009-improve-perf_memset_s-proper-timer-linearization.patch b/meta-oe/recipes-core/safec/safec/0009-improve-perf_memset_s-proper-timer-linearization.patch new file mode 100644 index 000000000..90a87c1e6 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0009-improve-perf_memset_s-proper-timer-linearization.patch @@ -0,0 +1,175 @@ +From 919d494a892bbba3730bdfd50e0543ae74b71e13 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Wed, 9 Sep 2020 11:37:44 +0200 +Subject: [PATCH] improve perf_memset_s: proper timer linearization + +as in smhasher. +also change the percent to compare against. mem_prim_set vs memset + +gcc now as fast as memset, only clang 2x slower without -march=native. +With -march=native gcc is 2.5% faster than glibc, clang 3% slower. +--- + tests/perf_memset_s.c | 92 +++++++++++++++++++++++++++++++++++++------ + 1 file changed, 81 insertions(+), 11 deletions(-) + +diff --git a/tests/perf_memset_s.c b/tests/perf_memset_s.c +index eab767d1..66489161 100644 +--- a/tests/perf_memset_s.c ++++ b/tests/perf_memset_s.c +@@ -19,8 +19,8 @@ + * Speed overhead: -1 - 2% + * + * fc32 on ryzen3: +- * gcc-10.2.1 speed overhead: 56.56% +- * clang-10.0 speed overhead: 51.25% ++ * gcc-10.2.1 speed overhead: 5.13% ++ * clang-10.0 speed overhead: 51.16% + * + */ + +@@ -54,6 +54,8 @@ uint8_t mem1[LEN]; + uint8_t mem2[LEN]; + + static inline clock_t rdtsc(); ++static inline uint64_t timer_start(); ++static inline uint64_t timer_end(); + static double timing_loop(uint32_t len, uint32_t loops); + int main(void); + +@@ -72,12 +74,80 @@ static inline clock_t rdtsc() { + #endif + } + ++// see https://www.intel.com/content/dam/www/public/us/en/documents/white-papers/ia-32-ia-64-benchmark-code-execution-paper.pdf ++// 3.2.1 The Improved Benchmarking Method ++static inline uint64_t timer_start() ++{ ++#if defined (__i386__) || (defined(__x86_64__) && SIZEOF_SIZE_T == 4) ++ uint32_t cycles_high, cycles_low; ++ __asm__ volatile ++ ("cpuid\n\t" ++ "rdtsc\n\t" ++ "mov %%edx, %0\n\t" ++ "mov %%eax, %1\n\t": "=r" (cycles_high), "=r" (cycles_low):: ++ "%eax", "%ebx", "%ecx", "%edx"); ++ return ((uint64_t)cycles_high << 32) | cycles_low; ++#elif defined __x86_64__ ++ uint32_t cycles_high, cycles_low; ++ __asm__ volatile ++ ("cpuid\n\t" ++ "rdtsc\n\t" ++ "mov %%edx, %0\n\t" ++ "mov %%eax, %1\n\t": "=r" (cycles_high), "=r" (cycles_low):: ++ "%rax", "%rbx", "%rcx", "%rdx"); ++ return ((uint64_t)cycles_high << 32) | cycles_low; ++#elif defined(__ARM_ARCH) && (__ARM_ARCH >= 6) ++ // V6 is the earliest arch that has a standard cyclecount ++ uint32_t pmccntr; ++ uint32_t pmuseren; ++ uint32_t pmcntenset; ++ // Read the user mode perf monitor counter access permissions. ++ asm volatile("mrc p15, 0, %0, c9, c14, 0" : "=r"(pmuseren)); ++ if (pmuseren & 1) { // Allows reading perfmon counters for user mode code. ++ asm volatile("mrc p15, 0, %0, c9, c12, 1" : "=r"(pmcntenset)); ++ if (pmcntenset & 0x80000000ul) { // Is it counting? ++ asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(pmccntr)); ++ // The counter is set up to count every 64th cycle ++ return static_cast(pmccntr) * 64; // Should optimize to << 6 ++ } ++ } ++ return (uint64_t)rdtsc(); ++#else ++ return (uint64_t)rdtsc(); ++#endif ++} ++ ++static inline uint64_t timer_end() ++{ ++#if defined (__i386__) || (defined(__x86_64__) && defined (HAVE_BIT32)) ++ uint32_t cycles_high, cycles_low; ++ __asm__ volatile ++ ("rdtscp\n\t" ++ "mov %%edx, %0\n\t" ++ "mov %%eax, %1\n\t" ++ "cpuid\n\t": "=r" (cycles_high), "=r" (cycles_low):: ++ "%eax", "%ebx", "%ecx", "%edx"); ++ return ((uint64_t)cycles_high << 32) | cycles_low; ++#elif defined __x86_64__ ++ uint32_t cycles_high, cycles_low; ++ __asm__ volatile ++ ("rdtscp\n\t" ++ "mov %%edx, %0\n\t" ++ "mov %%eax, %1\n\t" ++ "cpuid\n\t": "=r" (cycles_high), "=r" (cycles_low):: ++ "%rax", "%rbx", "%rcx", "%rdx"); ++ return ((uint64_t)cycles_high << 32) | cycles_low; ++#else ++ return (uint64_t)rdtsc(); ++#endif ++} ++ + static double timing_loop(uint32_t len, uint32_t loops) { + uint32_t i; + size_t errors = 0; + +- clock_t clock_start; +- clock_t clock_end; ++ uint64_t clock_start; ++ uint64_t clock_end; + + clock_t sl_clock_diff; + clock_t sd_clock_diff; +@@ -98,24 +168,24 @@ static double timing_loop(uint32_t len, uint32_t loops) { + /* + * Fast safe C Lib Routine (without MEMORY_BARRIER) + */ +- clock_start = rdtsc(); ++ clock_start = timer_start(); + for (i = 0; i < loops; i++) { + mem_prim_set(mem1, len, 0); + } +- clock_end = rdtsc(); ++ clock_end = timer_end(); + + sp_clock_diff = (clock_end - clock_start) / loops; + + /* + * Slow safe C Lib Routine (with MEMORY_BARRIER) + */ +- clock_start = rdtsc(); ++ clock_start = timer_start(); + for (i = 0; i < loops; i++) { + volatile errno_t rc; + rc = memset_s(mem1, len, 0, len); + errors += rc; + } +- clock_end = rdtsc(); ++ clock_end = timer_end(); + + /* + * Note that background stuff continues to run, i.e. interrupts, so +@@ -126,13 +196,13 @@ static double timing_loop(uint32_t len, uint32_t loops) { + /* + * Standard C Routine + */ +- clock_start = rdtsc(); ++ clock_start = timer_start(); + for (i = 0; i < loops; i++) { + volatile char *rc; + rc = (char *)memset(mem1, 0, len); + errors += *rc; + } +- clock_end = rdtsc(); ++ clock_end = timer_end(); + + /* + * Note that background stuff continues to run, i.e. interrupts, so +@@ -144,7 +214,7 @@ static double timing_loop(uint32_t len, uint32_t loops) { + sp_clock_dur = ((double)(sp_clock_diff) / CLOCKS_PER_SEC); + sl_clock_dur = ((double)(sl_clock_diff) / CLOCKS_PER_SEC); + sd_clock_dur = ((double)(sd_clock_diff) / CLOCKS_PER_SEC); +- percent = 100 * (sl_clock_dur - sd_clock_dur) / sl_clock_dur; ++ percent = 100 * (sp_clock_dur - sd_clock_dur) / sp_clock_dur; + + /* just to disable optimizing away the inner loop */ + /* fprintf(stderr, "errors %lu\n", errors); */ diff --git a/meta-oe/recipes-core/safec/safec/0010-extract-perf-functions-into-perf_private.h.patch b/meta-oe/recipes-core/safec/safec/0010-extract-perf-functions-into-perf_private.h.patch new file mode 100644 index 000000000..67da8a56b --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0010-extract-perf-functions-into-perf_private.h.patch @@ -0,0 +1,581 @@ +From f9c15db3cb58cc9865d095aa0e04ab40fada0667 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Wed, 9 Sep 2020 11:50:42 +0200 +Subject: [PATCH] extract perf functions into perf_private.h + +and use it. +p_memset_s needs to link to mem_primitives_lib.lo for windows. +it is not exported. +--- + tests/Makefile.am | 8 ++- + tests/perf_memcpy32_s.c | 30 ++------- + tests/perf_memcpy_s.c | 48 +++----------- + tests/perf_memset_s.c | 110 ++----------------------------- + tests/perf_private.h | 140 ++++++++++++++++++++++++++++++++++++++++ + tests/perf_strcpy_s.c | 47 ++------------ + 6 files changed, 173 insertions(+), 210 deletions(-) + create mode 100644 tests/perf_private.h + +diff --git a/tests/Makefile.am b/tests/Makefile.am +index b184b9b5..0301794d 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -277,10 +277,12 @@ endif + # endif + # endif + +-p_memcpy_s_SOURCES = perf_memcpy_s.c $(SAFEC_TEST_COMMON) +-p_memset_s_SOURCES = perf_memset_s.c $(SAFEC_TEST_COMMON) ++p_memcpy_s_SOURCES = perf_memcpy_s.c $(SAFEC_TEST_COMMON) perf_private.h ++p_memset_s_SOURCES = perf_memset_s.c $(SAFEC_TEST_COMMON) perf_private.h + p_memset_s_CFLAGS = $(CFLAGS) $(AM_CFLAGS) -I$(top_srcdir)/src +-p_strcpy_s_SOURCES = perf_strcpy_s.c $(SAFEC_TEST_COMMON) ++# needed for windows ++p_memset_s_LDFLAGS = $(top_builddir)/src/mem/mem_primitives_lib.lo $(LDADD) ++p_strcpy_s_SOURCES = perf_strcpy_s.c $(SAFEC_TEST_COMMON) perf_private.h + + t_memcpy_s_SOURCES = test_memcpy_s.c $(SAFEC_TEST_COMMON) \ + $(SAFEC_TEST_MSVCRT) test_expmem.h +diff --git a/tests/perf_memcpy32_s.c b/tests/perf_memcpy32_s.c +index ca56006c..7c01dbf2 100644 +--- a/tests/perf_memcpy32_s.c ++++ b/tests/perf_memcpy32_s.c +@@ -4,21 +4,7 @@ + + #include "test_private.h" + #include "safe_mem_lib.h" +- +-#ifndef __KERNEL__ +-#ifdef TIME_WITH_SYS_TIME +-#include +-#include +-#else +-#ifdef HAVE_SYS_TIME_H +-#include +-#else +-#include +-#endif +-#endif +-#else +-#error Not supported in Linux kernel space +-#endif ++#include "perf_private.h" + + #define LEN (1024 * 20) + +@@ -27,14 +13,12 @@ uint32_t mem2[LEN]; + + uint16_t mem3[LEN]; + uint16_t mem4[LEN]; +-static void timing_loop(uint32_t len, uint32_t loops); +-int main(void); + + static void timing_loop(uint32_t len, uint32_t loops) { + uint32_t i; + +- clock_t clock_start; +- clock_t clock_end; ++ uint64_t clock_start; ++ uint64_t clock_end; + + clock_t sl_clock_diff; + clock_t sd_clock_diff; +@@ -56,11 +40,11 @@ static void timing_loop(uint32_t len, uint32_t loops) { + /* + * Safe C Lib Routine + */ +- clock_start = clock(); ++ clock_start = timer_start(); + for (i = 0; i < loops; i++) { + (void)memcpy32_s(mem1, len, mem2, len); + } +- clock_end = clock(); ++ clock_end = timer_end(); + + /* + * Note that background stuff continues to run, i.e. interrupts, so +@@ -71,12 +55,12 @@ static void timing_loop(uint32_t len, uint32_t loops) { + /* + * Standard C Routine + */ +- clock_start = clock(); ++ clock_start = timer_start(); + for (i = 0; i < loops; i++) { + (void)memcpy16_s(mem3, len, mem4, len); + // memcpy(mem1, mem2, len); + } +- clock_end = clock(); ++ clock_end = timer_end(); + + /* + * Note that background stuff continues to run, i.e. interrupts, so +diff --git a/tests/perf_memcpy_s.c b/tests/perf_memcpy_s.c +index d3a4023a..c50824db 100644 +--- a/tests/perf_memcpy_s.c ++++ b/tests/perf_memcpy_s.c +@@ -45,21 +45,7 @@ + + #include "test_private.h" + #include "safe_mem_lib.h" +- +-#ifndef __KERNEL__ +-#ifdef TIME_WITH_SYS_TIME +-#include +-#include +-#else +-#ifdef HAVE_SYS_TIME_H +-#include +-#else +-#include +-#endif +-#endif +-#elif !defined(__x86_64__) && !defined(__i386__) +-#error Not supported in Linux kernel space +-#endif ++#include "perf_private.h" + + #if defined(TEST_MSVCRT) && defined(HAVE_MEMCPY_S) + #undef memcpy_s +@@ -70,31 +56,15 @@ + uint8_t mem1[LEN]; + uint8_t mem2[LEN]; + +-static inline clock_t rdtsc(); +-static double timing_loop(uint32_t len, uint32_t loops); +-int main(void); +- +-static inline clock_t rdtsc() { +-#ifdef __x86_64__ +- uint64_t a, d; +- __asm__ volatile("rdtsc" : "=a"(a), "=d"(d)); +- return (clock_t)(a | (d << 32)); +-#elif defined(__i386__) +- clock_t x; +- __asm__ volatile("rdtsc" : "=A"(x)); +- return x; +-#else +-#define NO_CYCLE_COUNTER +- return clock(); +-#endif +-} ++//static double timing_loop(uint32_t len, uint32_t loops); ++//int main(void); + + static double timing_loop(uint32_t len, uint32_t loops) { + uint32_t i; + size_t errors = 0; + +- clock_t clock_start; +- clock_t clock_end; ++ uint64_t clock_start; ++ uint64_t clock_end; + + clock_t sl_clock_diff; + clock_t sd_clock_diff; +@@ -115,13 +85,13 @@ static double timing_loop(uint32_t len, uint32_t loops) { + /* + * Safe C Lib Routine + */ +- clock_start = rdtsc(); ++ clock_start = timer_start(); + for (i = 0; i < loops; i++) { + volatile errno_t rc; + rc = memcpy_s(mem1, len, mem2, len); + errors += rc; + } +- clock_end = rdtsc(); ++ clock_end = timer_end(); + + /* + * Note that background stuff continues to run, i.e. interrupts, so +@@ -132,13 +102,13 @@ static double timing_loop(uint32_t len, uint32_t loops) { + /* + * Standard C Routine + */ +- clock_start = rdtsc(); ++ clock_start = timer_start(); + for (i = 0; i < loops; i++) { + volatile char *rc; + rc = (char *)memcpy(mem1, mem2, len); + errors += *rc; + } +- clock_end = rdtsc(); ++ clock_end = timer_end(); + + /* + * Note that background stuff continues to run, i.e. interrupts, so +diff --git a/tests/perf_memset_s.c b/tests/perf_memset_s.c +index 66489161..ca89ceec 100644 +--- a/tests/perf_memset_s.c ++++ b/tests/perf_memset_s.c +@@ -19,31 +19,17 @@ + * Speed overhead: -1 - 2% + * + * fc32 on ryzen3: +- * gcc-10.2.1 speed overhead: 5.13% +- * clang-10.0 speed overhead: 51.16% ++ * gcc-10.2.1 speed overhead: 5.13% and -2.53% with -march=native ++ * clang-10.0 speed overhead: 51.16% and 3.26% with -march=native + * + */ + + #include "test_private.h" + #include "safe_mem_lib.h" ++#include "perf_private.h" + #undef debug_printf + #include "mem/mem_primitives_lib.h" + +-#ifndef __KERNEL__ +-#ifdef TIME_WITH_SYS_TIME +-#include +-#include +-#else +-#ifdef HAVE_SYS_TIME_H +-#include +-#else +-#include +-#endif +-#endif +-#elif !defined(__x86_64__) && !defined(__i386__) +-#error Not supported in Linux kernel space +-#endif +- + #if defined(TEST_MSVCRT) && defined(HAVE_MEMSET_S) + #undef memset_s + #endif +@@ -53,94 +39,8 @@ + uint8_t mem1[LEN]; + uint8_t mem2[LEN]; + +-static inline clock_t rdtsc(); +-static inline uint64_t timer_start(); +-static inline uint64_t timer_end(); +-static double timing_loop(uint32_t len, uint32_t loops); +-int main(void); +- +-static inline clock_t rdtsc() { +-#ifdef __x86_64__ +- uint64_t a, d; +- __asm__ volatile("rdtsc" : "=a"(a), "=d"(d)); +- return (clock_t)(a | (d << 32)); +-#elif defined(__i386__) +- clock_t x; +- __asm__ volatile("rdtsc" : "=A"(x)); +- return x; +-#else +-#define NO_CYCLE_COUNTER +- return clock(); +-#endif +-} +- +-// see https://www.intel.com/content/dam/www/public/us/en/documents/white-papers/ia-32-ia-64-benchmark-code-execution-paper.pdf +-// 3.2.1 The Improved Benchmarking Method +-static inline uint64_t timer_start() +-{ +-#if defined (__i386__) || (defined(__x86_64__) && SIZEOF_SIZE_T == 4) +- uint32_t cycles_high, cycles_low; +- __asm__ volatile +- ("cpuid\n\t" +- "rdtsc\n\t" +- "mov %%edx, %0\n\t" +- "mov %%eax, %1\n\t": "=r" (cycles_high), "=r" (cycles_low):: +- "%eax", "%ebx", "%ecx", "%edx"); +- return ((uint64_t)cycles_high << 32) | cycles_low; +-#elif defined __x86_64__ +- uint32_t cycles_high, cycles_low; +- __asm__ volatile +- ("cpuid\n\t" +- "rdtsc\n\t" +- "mov %%edx, %0\n\t" +- "mov %%eax, %1\n\t": "=r" (cycles_high), "=r" (cycles_low):: +- "%rax", "%rbx", "%rcx", "%rdx"); +- return ((uint64_t)cycles_high << 32) | cycles_low; +-#elif defined(__ARM_ARCH) && (__ARM_ARCH >= 6) +- // V6 is the earliest arch that has a standard cyclecount +- uint32_t pmccntr; +- uint32_t pmuseren; +- uint32_t pmcntenset; +- // Read the user mode perf monitor counter access permissions. +- asm volatile("mrc p15, 0, %0, c9, c14, 0" : "=r"(pmuseren)); +- if (pmuseren & 1) { // Allows reading perfmon counters for user mode code. +- asm volatile("mrc p15, 0, %0, c9, c12, 1" : "=r"(pmcntenset)); +- if (pmcntenset & 0x80000000ul) { // Is it counting? +- asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(pmccntr)); +- // The counter is set up to count every 64th cycle +- return static_cast(pmccntr) * 64; // Should optimize to << 6 +- } +- } +- return (uint64_t)rdtsc(); +-#else +- return (uint64_t)rdtsc(); +-#endif +-} +- +-static inline uint64_t timer_end() +-{ +-#if defined (__i386__) || (defined(__x86_64__) && defined (HAVE_BIT32)) +- uint32_t cycles_high, cycles_low; +- __asm__ volatile +- ("rdtscp\n\t" +- "mov %%edx, %0\n\t" +- "mov %%eax, %1\n\t" +- "cpuid\n\t": "=r" (cycles_high), "=r" (cycles_low):: +- "%eax", "%ebx", "%ecx", "%edx"); +- return ((uint64_t)cycles_high << 32) | cycles_low; +-#elif defined __x86_64__ +- uint32_t cycles_high, cycles_low; +- __asm__ volatile +- ("rdtscp\n\t" +- "mov %%edx, %0\n\t" +- "mov %%eax, %1\n\t" +- "cpuid\n\t": "=r" (cycles_high), "=r" (cycles_low):: +- "%rax", "%rbx", "%rcx", "%rdx"); +- return ((uint64_t)cycles_high << 32) | cycles_low; +-#else +- return (uint64_t)rdtsc(); +-#endif +-} ++//static double timing_loop(uint32_t len, uint32_t loops); ++//int main(void); + + static double timing_loop(uint32_t len, uint32_t loops) { + uint32_t i; +diff --git a/tests/perf_private.h b/tests/perf_private.h +new file mode 100644 +index 00000000..9e05c6e6 +--- /dev/null ++++ b/tests/perf_private.h +@@ -0,0 +1,140 @@ ++/*------------------------------------------------------------------ ++ * perf_private.h - Internal benchmarking tools ++ * ++ * 2020 Reini Urban ++ * ++ * Copyright (c) 2017, 2020 Reini Urban ++ * All rights reserved. ++ * ++ * Permission is hereby granted, free of charge, to any person ++ * obtaining a copy of this software and associated documentation ++ * files (the "Software"), to deal in the Software without ++ * restriction, including without limitation the rights to use, ++ * copy, modify, merge, publish, distribute, sublicense, and/or ++ * sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following ++ * conditions: ++ * ++ * The above copyright notice and this permission notice shall be ++ * included in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES ++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ * OTHER DEALINGS IN THE SOFTWARE. ++ *------------------------------------------------------------------ ++ */ ++ ++#ifndef __PERF_PRIVATE_H__ ++#define __PERF_PRIVATE_H__ ++ ++#include "config.h" ++#include "safe_config.h" ++ ++#ifndef __KERNEL__ ++#ifdef TIME_WITH_SYS_TIME ++#include ++#include ++#else ++#ifdef HAVE_SYS_TIME_H ++#include ++#else ++#include ++#endif ++#endif ++#elif !defined(__x86_64__) && !defined(__i386__) ++#error Not supported in Linux kernel space ++#endif ++ ++static inline clock_t rdtsc(); ++static inline uint64_t timer_start(); ++static inline uint64_t timer_end(); ++ ++static inline clock_t rdtsc() { ++#ifdef __x86_64__ ++ uint64_t a, d; ++ __asm__ volatile("rdtsc" : "=a"(a), "=d"(d)); ++ return (clock_t)(a | (d << 32)); ++#elif defined(__i386__) ++ clock_t x; ++ __asm__ volatile("rdtsc" : "=A"(x)); ++ return x; ++#else ++#define NO_CYCLE_COUNTER ++ return clock(); ++#endif ++} ++ ++// see https://www.intel.com/content/dam/www/public/us/en/documents/white-papers/ia-32-ia-64-benchmark-code-execution-paper.pdf ++// 3.2.1 The Improved Benchmarking Method ++static inline uint64_t timer_start() ++{ ++#if defined (__i386__) || (defined(__x86_64__) && SIZEOF_SIZE_T == 4) ++ uint32_t cycles_high, cycles_low; ++ __asm__ volatile ++ ("cpuid\n\t" ++ "rdtsc\n\t" ++ "mov %%edx, %0\n\t" ++ "mov %%eax, %1\n\t": "=r" (cycles_high), "=r" (cycles_low):: ++ "%eax", "%ebx", "%ecx", "%edx"); ++ return ((uint64_t)cycles_high << 32) | cycles_low; ++#elif defined __x86_64__ ++ uint32_t cycles_high, cycles_low; ++ __asm__ volatile ++ ("cpuid\n\t" ++ "rdtsc\n\t" ++ "mov %%edx, %0\n\t" ++ "mov %%eax, %1\n\t": "=r" (cycles_high), "=r" (cycles_low):: ++ "%rax", "%rbx", "%rcx", "%rdx"); ++ return ((uint64_t)cycles_high << 32) | cycles_low; ++#elif defined(__ARM_ARCH) && (__ARM_ARCH >= 6) ++ // V6 is the earliest arch that has a standard cyclecount ++ uint32_t pmccntr; ++ uint32_t pmuseren; ++ uint32_t pmcntenset; ++ // Read the user mode perf monitor counter access permissions. ++ asm volatile("mrc p15, 0, %0, c9, c14, 0" : "=r"(pmuseren)); ++ if (pmuseren & 1) { // Allows reading perfmon counters for user mode code. ++ asm volatile("mrc p15, 0, %0, c9, c12, 1" : "=r"(pmcntenset)); ++ if (pmcntenset & 0x80000000ul) { // Is it counting? ++ asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(pmccntr)); ++ // The counter is set up to count every 64th cycle ++ return (int64_t)(pmccntr) * 64; // Should optimize to << 6 ++ } ++ } ++ return (uint64_t)rdtsc(); ++#else ++ return (uint64_t)rdtsc(); ++#endif ++} ++ ++static inline uint64_t timer_end() ++{ ++#if defined (__i386__) || (defined(__x86_64__) && defined (HAVE_BIT32)) ++ uint32_t cycles_high, cycles_low; ++ __asm__ volatile ++ ("rdtscp\n\t" ++ "mov %%edx, %0\n\t" ++ "mov %%eax, %1\n\t" ++ "cpuid\n\t": "=r" (cycles_high), "=r" (cycles_low):: ++ "%eax", "%ebx", "%ecx", "%edx"); ++ return ((uint64_t)cycles_high << 32) | cycles_low; ++#elif defined __x86_64__ ++ uint32_t cycles_high, cycles_low; ++ __asm__ volatile ++ ("rdtscp\n\t" ++ "mov %%edx, %0\n\t" ++ "mov %%eax, %1\n\t" ++ "cpuid\n\t": "=r" (cycles_high), "=r" (cycles_low):: ++ "%rax", "%rbx", "%rcx", "%rdx"); ++ return ((uint64_t)cycles_high << 32) | cycles_low; ++#else ++ return (uint64_t)rdtsc(); ++#endif ++} ++ ++#endif /* __PERF_PRIVATE_H__ */ +diff --git a/tests/perf_strcpy_s.c b/tests/perf_strcpy_s.c +index 930f1fa5..3801f89c 100644 +--- a/tests/perf_strcpy_s.c ++++ b/tests/perf_strcpy_s.c +@@ -22,21 +22,7 @@ + + #include "test_private.h" + #include "safe_str_lib.h" +- +-#ifndef __KERNEL__ +-#ifdef TIME_WITH_SYS_TIME +-#include +-#include +-#else +-#ifdef HAVE_SYS_TIME_H +-#include +-#else +-#include +-#endif +-#endif +-#else +-#error Not supported in Linux kernel space +-#endif ++#include "perf_private.h" + + #if defined(TEST_MSVCRT) && defined(HAVE_STRCPY_S) + #undef strcpy_s +@@ -47,31 +33,12 @@ + char str1[LEN]; + char str2[LEN]; + +-static inline clock_t rdtsc(); +-static double timing_loop(uint32_t len, uint32_t loops); +-int main(void); +- +-static inline clock_t rdtsc() { +-#ifdef __x86_64__ +- uint64_t a, d; +- __asm__ volatile("rdtsc" : "=a"(a), "=d"(d)); +- return (clock_t)(a | (d << 32)); +-#elif defined(__i386__) +- clock_t x; +- __asm__ volatile("rdtsc" : "=A"(x)); +- return x; +-#else +-#define NO_CYCLE_COUNTER +- return clock(); +-#endif +-} +- + static double timing_loop(uint32_t len, uint32_t loops) { + uint32_t i; + size_t errors = 0; + +- clock_t clock_start; +- clock_t clock_end; ++ uint64_t clock_start; ++ uint64_t clock_end; + + clock_t sl_clock_diff; + clock_t sd_clock_diff; +@@ -94,13 +61,13 @@ static double timing_loop(uint32_t len, uint32_t loops) { + /* + * Safe C Lib Routine + */ +- clock_start = rdtsc(); ++ clock_start = timer_start(); + for (i = 0; i < loops; i++) { + volatile errno_t rc; + rc = strcpy_s(str1, LEN, str2); + errors += rc; + } +- clock_end = rdtsc(); ++ clock_end = timer_end(); + + /* + * Note that background stuff continues to run, i.e. interrupts, so +@@ -111,13 +78,13 @@ static double timing_loop(uint32_t len, uint32_t loops) { + /* + * Standard C Routine + */ +- clock_start = rdtsc(); ++ clock_start = timer_start(); + for (i = 0; i < loops; i++) { + volatile char *rc; + rc = strcpy(str1, str2); + errors += *rc; + } +- clock_end = rdtsc(); ++ clock_end = timer_end(); + + /* + * Note that background stuff continues to run, i.e. interrupts, so diff --git a/meta-oe/recipes-core/safec/safec/0011-.gitgnore-new-files.patch b/meta-oe/recipes-core/safec/safec/0011-.gitgnore-new-files.patch new file mode 100644 index 000000000..66ac45edb --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0011-.gitgnore-new-files.patch @@ -0,0 +1,30 @@ +From ee149b795970a51e93fd175835156540d713ecd8 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Thu, 10 Sep 2020 09:50:38 +0200 +Subject: [PATCH] .gitgnore: new files + +--- + .gitignore | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/.gitignore b/.gitignore +index 0224fe8c..a3e180ca 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -63,6 +63,8 @@ TAGS + /stamp-h1 + /aclocal.m4 + /autom4te.cache/ ++/libsafec-* ++/fmt + + # More generated files + build-aux/ar-lib +@@ -79,6 +81,7 @@ doc/html + doc/man + src/gcov.log + tests/gcov.log ++src/Scripts.txt + + # + # Debian directory (make deb-pkg) diff --git a/meta-oe/recipes-core/safec/safec/0012-perf-fix-aarch64-and-add-more-archs.patch b/meta-oe/recipes-core/safec/safec/0012-perf-fix-aarch64-and-add-more-archs.patch new file mode 100644 index 000000000..fa875afbf --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0012-perf-fix-aarch64-and-add-more-archs.patch @@ -0,0 +1,97 @@ +From b90c52b1691fe82ce0a0681a503e1d45584f0162 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Thu, 10 Sep 2020 11:16:03 +0200 +Subject: [PATCH] perf: fix aarch64 and add more archs + +aarch64 has no mrc opcode. +--- + tests/perf_private.h | 69 ++++++++++++++++++++++++++++++++++---------- + 1 file changed, 53 insertions(+), 16 deletions(-) + +diff --git a/tests/perf_private.h b/tests/perf_private.h +index 9e05c6e6..070faf75 100644 +--- a/tests/perf_private.h ++++ b/tests/perf_private.h +@@ -63,6 +63,59 @@ static inline clock_t rdtsc() { + clock_t x; + __asm__ volatile("rdtsc" : "=A"(x)); + return x; ++#elif defined(__ARM_ARCH) && (__ARM_ARCH >= 7) && (SIZEOF_SIZE_T == 4) ++ // V7 is the earliest arch that has a standard cyclecount (some say 6) ++ uint32_t pmccntr; ++ uint32_t pmuseren; ++ uint32_t pmcntenset; ++ // Read the user mode perf monitor counter access permissions. ++ asm volatile("mrc p15, 0, %0, c9, c14, 0" : "=r"(pmuseren)); ++ if (pmuseren & 1) { // Allows reading perfmon counters for user mode code. ++ asm volatile("mrc p15, 0, %0, c9, c12, 1" : "=r"(pmcntenset)); ++ if (pmcntenset & 0x80000000ul) { // Is it counting? ++ asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(pmccntr)); ++ // The counter is set up to count every 64th cycle ++ return (int64_t)(pmccntr) * 64; // Should optimize to << 6 ++ } ++ } ++ return (uint64_t)rdtsc(); ++#elif defined(__aarch64__) && (SIZEOF_SIZE_T == 8) ++ uint64_t pmccntr; ++ uint64_t pmuseren = 1UL; ++ // Read the user mode perf monitor counter access permissions. ++ //asm volatile("mrs cntv_ctl_el0, %0" : "=r" (pmuseren)); ++ if (pmuseren & 1) { // Allows reading perfmon counters for user mode code. ++ asm volatile("mrs %0, cntvct_el0" : "=r" (pmccntr)); ++ return (uint64_t)(pmccntr) * 64; // Should optimize to << 6 ++ } ++ return (uint64_t)rdtsc(); ++#elif defined(__powerpc64__) || defined(__ppc64__) ++ uint64_t tb; ++ __asm__ volatile (\ ++ "mfspr %0, 268" ++ : "=r" (tb)); ++ return tb; ++#elif defined(__powerpc__) || defined(__ppc__) ++ // This returns a time-base, which is not always precisely a cycle-count. ++ uint32_t tbu, tbl, tmp; ++ __asm__ volatile (\ ++ "0:\n" ++ "mftbu %0\n" ++ "mftbl %1\n" ++ "mftbu %2\n" ++ "cmpw %0, %2\n" ++ "bne- 0b" ++ : "=r" (tbu), "=r" (tbl), "=r" (tmp)); ++ return (((uint64) tbu << 32) | tbl); ++#elif defined(__sparc__) ++ uint64_t tick; ++ asm(".byte 0x83, 0x41, 0x00, 0x00"); ++ asm("mov %%g1, %0" : "=r" (tick)); ++ return tick; ++#elif defined(__ia64__) ++ uint64_t itc; ++ asm("mov %0 = ar.itc" : "=r" (itc)); ++ return itc; + #else + #define NO_CYCLE_COUNTER + return clock(); +@@ -91,22 +144,6 @@ static inline uint64_t timer_start() + "mov %%eax, %1\n\t": "=r" (cycles_high), "=r" (cycles_low):: + "%rax", "%rbx", "%rcx", "%rdx"); + return ((uint64_t)cycles_high << 32) | cycles_low; +-#elif defined(__ARM_ARCH) && (__ARM_ARCH >= 6) +- // V6 is the earliest arch that has a standard cyclecount +- uint32_t pmccntr; +- uint32_t pmuseren; +- uint32_t pmcntenset; +- // Read the user mode perf monitor counter access permissions. +- asm volatile("mrc p15, 0, %0, c9, c14, 0" : "=r"(pmuseren)); +- if (pmuseren & 1) { // Allows reading perfmon counters for user mode code. +- asm volatile("mrc p15, 0, %0, c9, c12, 1" : "=r"(pmcntenset)); +- if (pmcntenset & 0x80000000ul) { // Is it counting? +- asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(pmccntr)); +- // The counter is set up to count every 64th cycle +- return (int64_t)(pmccntr) * 64; // Should optimize to << 6 +- } +- } +- return (uint64_t)rdtsc(); + #else + return (uint64_t)rdtsc(); + #endif diff --git a/meta-oe/recipes-core/safec/safec/0013-add-support-banner-and-link.patch b/meta-oe/recipes-core/safec/safec/0013-add-support-banner-and-link.patch new file mode 100644 index 000000000..1b180dfeb --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0013-add-support-banner-and-link.patch @@ -0,0 +1,2912 @@ +From 91abca67137d46a95b8b264081905ecfa0fa0d15 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Fri, 2 Oct 2020 11:36:06 +0200 +Subject: [PATCH] add support banner and link + +--- + README | 3 +++ + doc/safeclib-banner.png | Bin 0 -> 149815 bytes + 2 files changed, 3 insertions(+) + create mode 100644 doc/safeclib-banner.png + +diff --git a/README b/README +index 77ca06a2..c35a7e7c 100644 +--- a/README ++++ b/README +@@ -1,5 +1,8 @@ + Safe C Library - README + ======================= ++.. image:: doc/safeclib-banner.png ++`safeclib support via xs:code `_ ++ + :toc: + + +diff --git a/doc/safeclib-banner.png b/doc/safeclib-banner.png +new file mode 100644 +index 0000000000000000000000000000000000000000..7014dec5f823be09f03db57724a18ff5758b1640 +GIT binary patch +literal 149815 +zcmaHSW0WV&l6Tvfwr$&*wrx%G-?nYrwr$%zZA{y??SALEd+)ycVb9i=s*H+XC?if~ +z<%tYekQ0Z8!G-|>0)m&65K#gG0$l(C0tSKt`AgXhDIffM!*UYUa8kB4adI_q000RZ +z+ZqB0C9Mri0ZIS^V|V*80PkOvm${0DlZLDew~?(iy}>^`^lsL6f6+idyaH}^21b?u +zCqhGjsksdw@pWe}F`>CJAF(={ETgQQFu=@Q!ovZe>>;OOUV`SoHWann%ApG}5{8yWUu?e@5h}ge%{T=ZUn>jhz +zaWgQuy1LT4ve4T)m@+VNas8FS%)rb{_m_jt(cQ+$z>Utvk>o!TL;#LP4(4`F=C(G3 +z|41}2v~_mkBmQgYf4N|7CoB8kf^8iC9jLz{V{kLDV_>3ZWU#jW$FF~JJ31)={=XUj +zE4QPHyB&Z*3E*h!>|peFK1@jd1O6Mk|69>NjDM}+mUl4!J1GWMBDO}()&LtPNfAEc +zzi;S`&5gN5nZ!6axkQ<`1XZDKfsGO1KYGpo>isuXO!piJ~lfP7>haBS`+>&zTD>j +zi++HS5hJ6CAu}B#7b6=TtBDaaogo(o6CD?`2^*Ucy9pbk0UPnZ@y7onZvT~^e<^=` +zu=|fG-0UW-EbPooY;=Y!TugK(EUbS8F&Y}uak8+pa&j=Uvaxe=5;OcYk>Q_|`5!6t +zAJX5v{O9q%3*ztKze@^W^S6#1{uT`17TGQkh^V5Zh@gtw+C?{X9AHcf|LHs3eY*X5 +zX=!os{ejkYt1Fr;Du@7vhA{qj# +z+IqhP;wbx!wZZRK4B*+Z=@>BNIK42KU=S5B!&C8(^bc@t-zlh(Z`cFhz#V~Ln7-cm +zn_8$|9lMd!?N9=wOaicgA9BGXCTT#yVhwsA^uU_KlT;ExX&kqmcqYYwQG0sgLlVx%}K^_a@U? +zNYgLsoivKiwu!<&+neFNa<8|gEL^jz-dU-^7%p~>#I+qvOebU=U|!w=CKgo+UQD7R@_^& +zh~oRt&fHJcwM`gI6ZW-^hdZ{PE?=Lyl%9Apb|P_pn@Z*Q>GFqf%E$D-#u6g6o^ds> +zmeP(c44CdON55~S-w#(q*vXjqYT_zP(_=Kc056to+OKQ~QrlcU*$U*VK~p*B +zuX@2`$OC7)GX@!K{>xO-_OiF5&ygv2bhy(&2KBcXBsy#&Og@5-vd(bopO{;HpQQP3 +zZYOU2ku?%m&(FPgk&B4l*Xlogq3)3LTUOLl89sMyV|-85`5Qe?=R+Fl*+PXn8usV1 +zzQa%@H3Wi{q{3wM&qAw^&51ub(vkU!xh402cVfm{L^J*Vup?d9bfMBgup +zZ|5~R-}BP%n~AGcD`m6QTWk9H8u!Os(r1BJUzgj?gZD46FU_JkjkSeaBAq@=IjDjP +zhO?t%B%SQ|w(iW(E#IFcFr0_X$V6tKVI{pUHN=Dti)gHs0!rtBr8<2#MV3R@uut}| +zDmt_FcO-jYxkg=j74P}}#*SrYZs`n>TWVj4YIh4# +zJLgvf;`}3Ex29RL==_2&UgP`m7vQ&S +zK|tKBJbbZFC>|)(@Rr=W_faezFhEu?RrEL2f4TOTVE<{CP2hsq15E!pwlR1rT#A`4 +z9l}dhbo}*7(DlXht^953y9?{(w*x2J4}q8@cqb#_6+dre9a}Hc50wcO01ey#YkeyIhZezx|1*x3Rk3r^vro33CwENS&xYdl@C>3Jeooe&=i8 +zhg#1tBFWq!CcA;=tHTL_>9EMx;uR;-bo^cR(^5HblqU#iGZ& +zn+X5M891o@86m4f|opzlpTq7#E& +z!EWDZ!~Amr@mv*7%qYgNu&Vez!}-ghFS`$z=febUQs~G?FMPEa3xstaWqmzGt#4nb +z&2XXM@sh3-d&f||2nc`Q!;kGzR9sK{b(&CNqAk)(mE~T41&9h2nB?#}W9*yI=YFKi +z_^z{$Jk}BMAUVdj98h+DR9FnS#5z)!d;yW#)QvV#4*u}7;)U+GEqt?^e6hY8euwzu +zoC&0!g?Y%4XPZGIX*|i3GK+bb3-)f7P3TKOHupj9nO&wvYh2HQ5}@?^17(LcYzXHa +zXg)C4kL&SSV>B1KE%q9_cvi^F8@POlVEBO_0CJWlVYD{2lW9>o*7*X3@3;GuJuL&- +zbX$$AP7oWgs;_EJbsZAQjI-~s{K18vEWgo8myR=vYvWu&70ic23Xf2sl>O@Pe^m;< +zQbSaX8sH%jWj6)xmEsCGqGGwJJ8m_ROL{dN@5u1SME)`r;>|tU`^J2$T_1Qr-Q}#Y +z+j{mv)QUxLUOo1|@>gKn8-qa%Xp)G;De21R!K+VCBVzm-`Mo@9*4fS%oAQ=Dr|`?e +zhj5F*rfa-)RVN+5WD-W?#^t=ydjRn +z;dbn9Jt6qaIHrekbRiNt#0WF0uS^{@GyCeGYpqxVe+|0K!70OM0Zs2cRcJ6~nOSho +zUHmdk8{#q!YeHt=43|)fn~z6j9cXY8i|3vCJ+!#R(wpIsMp_lxjwf3|VRLXS@L0}a +z;CLX+djp)HW|!BYo{%cgWzPxsna8Jg&72f2!BcSk18CuU1P~iex**s!q1aC`) +zvkg4bZjkf7+n^cXw)@!xUE^21ex0J`F_{fT;41nOwn$zFl@QX9xj{tW&lLw9iT6|M +zfP(1J7K)@+fl-1GWv>IhOMG|RRPbF*YzuV2qY{;v)-Ex|B4Zdlk3PuL?2oztSHM>H +zf%h?DB)!BihA|r|Xs7!aX}2SGjo@tz&x!-z;@a{^@_QxUv>bHL;QiI829&T!G4PM% +zy`M4xg1$5S+_!mu)Y5`)RA?nL33Q=7jmXf7lLnRZ +za|JKj1XEbfWKqs!E*Q?I-|4=^G?Sj9Fmv!;*kfGs!&T;xUR-Ld4EmY4KkJl8fPx*w +z?%dU(P)L<=R_}5@|6m#HZZw9Y@2oqnlxM+1nNo@VlBQ%xQpHDIj +zB0Vb*3xR6;0_13B!G`Enmi7QjwthT48aGB`JRaGln?q$Z{muk3+jn5>pN-yx*$*9w`0F%>6={bWFvHU^3j*A2c-9cbnwA5l>ZurbeI= +z$Q$y_xup$eBbMd>N(TQvp3Ik=pZ4kf7#8S&)J>(p!`yN0Nvd!hZVM{fU>|U@GGLTk +za8&q3e;1mz>B*L}GoE$+|V7Z;~p@@@A<8LBj +zTEvbe2tkY{WIw8ff{NJn6-RGirILhdnAR}GtIYEW-{J=cF^r7Yh@%H>O|cMJ>2iwY +z{qE~ek-gBTLW`E!kBFO}S;5Ur- +zq^ta*@`(_~Euzfwd#RY4-L*%Y*T+<*op84U-)8TIe_%`q6U)oUn3J#z{kxHu9!U2YP2XrQ$i)I>9J9<>hZW&VnJmuV5&!d)7L +zPApmeE@$dR^(BDyTN~^}CZNaR8wIX9W9BTuKn)$bm`e#@88G@aYSd{8>}zVYOmVLj +zz9~R+zz5m`aHHcJSo7w%|FEb3(d%|Ysg+kb^hmF-<=gPq$Qaud+qZo$eov_VT0Gbx +zJnuaWV+_!|o6@I=o3aSI2{mzxa}E|SO)&+XBGyOXv4Rr>;XO|=7b^TL`aQJ-?s=?b +zF~>)sr1;U4_tUJe@bNavk*uu=N`Ecom7qO8AV&2R^AwPnbL=epZdqBPbJHeae%M#I +z(N9kLgd+MiGcwrQ)IQ9m7FTdrXFm9b#)Jiw_5MZh-PU!)l& +zT>0+!u20e&W&XL5tlfRhlpK0xfQ61fNKUQXrYM2f19N%Xx(bp0@zDMCHER+c?BCt6 +z{`zF8yB}gyzrP3?rTzfzWEdsr_mUy46owocF=i`} +zm$-oiXwP7KWjn7>*ppecTBOO>0c?xG{{aRBOM)slc=s#P!5+dK`4LSw@VtDLMHi< +zIheIlbmsQFP8Z5s>v*`EI&EGF%yvBs5p^VES^v6&{A4LcdfAD;Q>=&M)&F?|>=iVM +zgEKjAxJPYl@LIH3;iYxddF8Z}5lKE=L*Da=i6U5av`0k+6F^Abgp?hLm1>qLSJ!Bd8fqJ=lmLqmJ)vYTULPv$!W}ekq;8U(u0<}(b$Sqvfao912 +z?J>}Na`wnww8!&XmB$ZdYD}@{3yZpM=1gJKVMbo%`EGPAq0yS&;|w{8WtNS9ur@CE +zR9n?!ML0*>+&*@n&xzW@q>bX* +zrXn)0cgShm!Dnn~9q2XT3YL-64-r+g)U$Jv;Af8ejZTze3IjD&6!5NnF(d^x@vSUV +z^ybZJC%vmt*!iaY4eeWm7_J_8>(=alGiW3w&&jX>E3dQRl +z(ZXF~^MduL(gT=7V{|`W_oYWEqJyZ|JjwPSQIkV +z7*s>|H2Z4yZeOnH4?{%zq>G|_W!@}BDN$$Jcf>F9SN^~*4cHv>&J^CAEB_1b?V|uT +za={Pv*mw5FU4u@#ayTz;aOYmP`I+N|#t5R7+cYr2qRi04O@WU|ypyW{eCb$KKAmaj +zvu&{camXo+=N}$_z*3Zc_>DzzH5kO#&MORF +za&tFNP;SZX9b8a?5mIezNoX2T^3H)#m=@$G +zGgH-qry}GMyB^6;qk&~ZnrPd?nOa2xQ9cOO-e)=@=YoXk?ys9g4%_~%;7#eh6wjnt +zuH8Z@>XF&zZp*K30`?o;XuUzhK}jvgF)ra%=wZ}(n8msw;x{>wtIqtsfjxraQ}&9R +z!mB;nkww((Mj7g#bbY9Squ6vH^d(Go&>MPj*Xl+uBlknXc4#-QP`SbfXnTT|+119| +zC@Bx8wa6OEua<_Ll0%JBD$MIPC~ANL3meYWI=!e-P3xvUCkcs++3Y_7iR_jeM`Qar +za0^YYgK^?O-XbjendN$6L}hqq^IEaHGCS&esM&=4*80!9cjReBz`1liIvi8hud6c$ +zAlpVK?y7Qc<@twzRHj6bHXER?Es*-^UH2BFPiQCU%=)nVs9db5MQ?{-izs%tX&1kd +zqEj4z{U6NKBHFo~O)J4v{ZYDFRS9aZwr$M63=^WIvTayl%vO_Zr6* +z0}0-)V*O5q9K@NiH=tmZeU|x~m~m3t +zNyp*ywWfOSAL3zd{2{K#Pi4G6M6S==8TMjzSwS4(L<5TmPp&^aW;v*!C|rGsx=H8# +zYS`JWY(&-}7gZkvV=`KeLlNUxb-SlKj|Y(~<+_{~^ILct*Wi6!u9VJ>)1-4wGz!r+ +zL#A23wq^b%7k^R&?yPFhlXU`V*nU?bfZ*4lDT02UrcV11t_>T4&%PCo3SOy?)K%eO +zTMJGbL)To|0aBZ*jv?Yz9Aj-1-Jek*j!MSrHv_`>6_?s71^cpw=N^}eXXP@2$u5al +z?~RG(5RDSwO}8i;vN}J?xpC6dn!gX(eEsyh@AYMLGq!w)OFw4mLM+{N#!V$rZ@FZ7 +zNuj3;xnn~$Wv%Gr+;OdS4>Dj2xW;JTRU(7ClSmY1;l#@pHj|o}X?UD|guFNrbAJq`i6uG2t0{@L3I2FqcAyQ?@8M%ZQVF +zLXLu2?ni$?pgTx8<*CmSDrEl|hMT2s9~cmaw!_yZ{ylYcc-v_z3Y*a +zmOSJNT%_^HJfjNEJzsG6if8U{BptM#XUq6Wn=HK-NA`tnpngfwkcA +z21f<*2ubA&pBcx>3fmZd48iw?eD~A7z)NW|H6a6>HDf04qF%py{P6p96hsH6(a-f5 +zEH(0XZcR1C+OAF81i4!aLEm0qy}ih3(6=k?ZO>D!lFrbG#kqu69bbd>%?sjJBQ!+! +z@|=S<4(?5GdaRyBfS2QW?D$%gj(S+mk4#D>0$iw&oGOe_GeI8t%GSFg)FcfHb%^k| +zpIUX|L6IKd@@&1V=ShtN`vy2EgzecEK5w$0(>$(umGw~x-~oZ21RiAF9`>!j1OFH% +zjRbjPVOW#uOnHq0I3#-T*4MD73!O70c&KUDX&WVm&4ZBIa6`D9X7=wH?sjc((VwrZ +zZ2`Kdz(NhQ6v%<|dJ-0wV&w={cOj#_c(Jas{V@2&GQ^~zT=kHAb`nkPlp+x=JE&5K +ze~zJo#0FWq1@U{H2T35gti-Ha?u_zQ?7J0$S1~N+5Md9x2I2Dn_531Y138P35R>8%HSroo&)N)j?(&YbK7CnCCj?3&*b~TBp +zc!0%3*i!_cWVKncA^!bIG~N`{c%31XvtOLG62z^R3sKuTmC0S4TNF9- +zrp+-kRSVW0d3tej%sFq`TS4H-QrurIa-p5B(}BOPDLCir&sn!ee7sH1rg%Z6?bt~) +z?@`apm}VANruArUmAyG}8cEch?C6e){2DGUM2PLYYc%d1#3qWZ*}d6cV|xhN{_bkL^6q;#u%({6PQlkO{SPH-dWH%>wOFZo9u_`mx;thrceKZ+41bS8KN{= +zi%t8Z!cG#j7h7`V>Vtdh7BzhaYpEX?^^a_)MQe4hkH^lqr#`qem{PD2NE{4L0=L@_ +zeLFL*TUMBGT{8W!%x9zyAwcEfdLId{(IA8X=EQc&(wW344rs~458UyAHwfP^aKxl> +z;neMpN|Cd)Cd4Pc_~J(YKgnuPgWXPn8D%4nBNBavYeH|H +zHUgi5ma&v8xsg{jhKywZouB@;ylq&y=}w%dQ*;>!XL;n87xmP}aUs>QUJ#a#j!xgr +z*QO_@I1gWKDnLKwON8e#u-D4>1$1Nj+v0R(#h2pHAe*&e3i@9!i`AQ(e67YXLX?&++qP_@GB|I#nWiIW8T8xYSRf!e;JzZ +zQ%F(@HByVJON=Fvej|9}LFxzLvV<8dA?%hq!QTRHthvoJMr2f<5(v +z5G+J`pYIkP7WKv7jl$Fs%9c`0wWI-JTPIOMw`ePp>;dn-t&N5(U;ldhg=mG4_F}#U +zR+X`<){FbOG4t`H_x>e7gDhCW&^C=H8u>Gb)d@8+dUaxU+n#HH*t9=HLI}C%5dN7o +zALh4kSFM|MkS!-)XHM7Y9Y@hmHIa$Xq}dh}SRd*alw^e!PD +zmRSlHY(TNTcaLa5c4T|*0R1C1xU=`&Am=~YoA +zZ?_=f0;1BMxA*$2x6@HEO~0>h0cwLf*t3*b{4(qNgwq7X?i1VBydax?w-xfLvib{T +zp=h%OZrV>sxXx_9YB$>@qxC#DLiGSTAuOI7$d)hfU>d~RJ+`%pkM7GZ7x~5;0jDw~ +zs|WmOiePD}^uq{lrCw=^lkL5^dZuzJF}w)`W@`GJt`@}PPOF4S{@({E3RHNdeQJfv +z;OpXYvCX^cDuV&z+CqXv9rNUxt-ccj6#VZ{?B$-1cgNh%^S5$_oi_WxCnBU6Fn$b- +zH@IleI_;8Tpm^lwO$#QD$vajUfe8?sZ5kcs%&qqvZUw|VQy~&*qe3?9YMLR64|t9A +z?Jvd~MNnMz%{QA&fH4-V4BH=dU2VlqD#p)EE6x?AubeR3FZm$G@Nvje{ +z_VC|4A3WABUrovHp@o0lV8K{^=q=}1!aZ7><6Hv9JODb@J3RUq1HDelObCYPOB +z)8~KqDHbViUK%{Wq>-uRckJd{C=cSpZ4y4D>SA7kG9ohR7)Z1h%q#ym(=7Sv#G~sj +z8|+V>is`&2*nMtTYNR6x+=5aZN!Zw12=ueGfBs1vdI_507tj%4XyUqUFp@O+)hM0a +zSj&X{QycPI2|Rto@@>aPDwF;k+aQ&VFNIjJ^!cLOno+E)Dj(wxL7Ja-$ALK}V0M7v +z>H4R;bbE{{4wnlrz9cgODA@6wpj`)4lh?|<+=#*~u*+8r=ZAj*iL&qxa7B`q`3THN +zVJX2!dT8C}&FI%W#tROcA+Iw$s=gu|951DF$E3Ih*B|Dets};oB`O0aAiCweduKv( +zuczX!pO7dg>vy-ym)$R-+0mJM`Hi}#0b~V@*-n3iZ@g5%V1J;{GP!-}K4HEerR0kl +zS8LE!?_w5|-*z2gUx4-pP5fT@yLI7AoO5DUVHwpn9Gm0VxjJ2G%ja`*^`ir;4;V^z +ziNoM_d?JB!Qw8PdOj*8Ez? +z;SiZ2vlYMNeK6(>;t=}WdG(bCMpSqTGrws3{;mb`mRg#3F9pur{o}m`u|D-)VnTAe +z1S8Q(7>B~pJRhrFHqyOj0wI`?3`%{aT!f0>?lygyV8FoRQ^=%4=W8RDWtUq;qIHg@ +zqsr+Gx%*qq!7+)9kFK@(NioxRH-kAu*{r8>`~X)7Y|az)0&FpS2O?^RUgC}9621fh +zN>29|WQm1DjqswfDCCkFj8N&6bJ~{`hp +z=Vv=2TsQ%oC-OqP&mFFN%v1n!&NnlXQqS-kn{%hE +z6xEDSDX;vy5Hi}L+jT@_zOd?`O!?Vz0@0EgrELvYg-dQLfnQt>aLMvE#&oVogSS*H +zNir*~4@Nf<5dFQv~$rwxDCOUjhSw?I^|^^l?Ys567TG^*ROGucRc1`oVbU2Kb! +zPB2sr-!5sYnuoaT&<>f)R{Qg%NNg!R6Pe$9HpJBXv+YRc@inaLd&TOON`7ME8=Gwv +zVk1tcU;FY04NO6z5SGi&9?(O0Q_13i_CiA^K{a6b!w|t%)9YU$-bHw()1cCtJ8rj( +z0Vz7sV0oT1YdmJw8E7H1BHh=GMw+;FkWulNzdM$^vbwyg;H((ZoP3p19@x7Q>1PgXF +zeX*?;k1u18;214+o2RqZlVn_IkkpT +zCtHGJ`}Qti;e>4sE#?U&HzSZ+^b=9g>nSHTL8+z=1+_iII9NrfA9AcC>!NYM>^m@V +zt#HZ@EA0$5qI%nV22+*Wad;Ok0aX3xBjLjEFpX3XmFZ=PBC~x@kZ%^{wew=;HMwms +zf67edoz(S69aPFL^iLwZhxy7cN&=Oeh<5cK@GBZ5h!pYtkAUgzkR3|y%b+DO_qpsz-dBz^0K^`0Z&+#hlZUUQrJ7OebK7pWiPFZ7B!%!`%LPL!e;cf}7iPWNPv0(Ivby>B3-+nW6^wSw_JNY%w@^P=c5)6()0iF)) +za)xoOe=V9V#o6Akm_}R%UkpVrR)Vy6L|9Hz@(v<8#JIr>xBJ8_OZfOf!Uj&2!!fp| +zKN{XWXA;nmb#?-LQoqhA=MeoeyK+kic+8@GtVzIuJ;3Q4j9mh)u|E}$7M9Bk!((u?uA6Xzeoer85gQme?4qvq$AQ>Aro +z5w(d%$e4zaqW(^%?(HF`2YmBC()VrEZZz+ElAPFFyS^QFzQ}f_X5l~%#9=^NCLyo? +zZ90K}A3@Jrh_I`21Z5y@<|BCy)%QF_xyOadcSs-&6ypK46B44W5JU%Z($cR{ADlCT +zWFOOkbx9~><$FHGLA-ap7MgGDS>>`-`FVRXeC*oF!R|aZtZQoB*jc-7Ckt)H=nb*sYDXTK>&w18vL+{TsWThQ6p6yti(zAhetmo +z_}Zi9H;QGp$4W6LFh|`E?sS_Yf(t;YAX*hKGk}`W{x)mED=H0F7*2F86bMo0?o|DH +zz$E?Gy0^}YDjJ*XqC!lhNY-|$gC{J%%&?hG6bqoZzYg!vOpu|CeDIpK&(*S#r);tE +zjvLr}VqCOc=|!3G8Tx1mZO^H+(DS@QmV&TrU1%jEe|YtCKk@Qcgass_hbQR$Hg23k +zwvIMppN2_T2D0$X&~|2tOpAPYSLyjmliH%zjG`dG;t=Vdr2YsL1yR${aB8=Q9!k-j +z=<0T*!D&DTS9NwK7t^>j)NgXCY?hngZC(RI2PDi%#ss01PD&c<73XkBridGki}s&5 +zz;WyKAuq|;Wv#MRve44ZE!(en3q}vB0zJ!!wEFNLk^;Y!fsK>fx|=JJWW5AOV;yoc +zsP)Mbh~v8wbGgr0y&W-OWjWinG_nlO4Nv^-idLqTYRKyNEX2Fb3@*zabJEe1KQ4tx +z-AD`2EcKchKgX!@ybtUxR`?;!!fAS4KixIN{XM@JLqJ?2#J=@mrF-Ge7X4X3@N|QE +z4{Z>dO%#s?8J7D%6D8q6zkK?exsz6Fsf?c2rovPlpD}jWWt6W6&Xs8sJlV=DHk57G +zWWv^X&d5CZD5x)A-Q;20#Drdp!@v5T}h(y&KF|?HUT^P3&Zy;cgj6(PCC} +z@@+(qlLx-TmAW7_o&|(m9fiSl1z|>d&;VGqhNTp;BVIPnaB@KjI*sYLDqKZ!;ldU~ +zJ;r`bgXRaw`{%KwYCx~V^n??BWZ;odLUSQhE?7ABE7&mVpYr$_n3tb|vKDqr$p;{K +z(z5RNoIApG{S>hHn0>)%IxX$?*O!8K+P1FxJnFBrfq*;^h_Pmxb%tN6!+m`j9?}aa9}h^^*p~_SYAIK1z}Ft +zLx(dVZAhlTV@q;ki$&J*0u+U7*aB47`b#*PdqWm73g)xjJBmMJ{&~R)a)Mjo|4E +zx=ChBi|M-8Al4?mo||z5i#g{1kb8|wK#Wv8L#m!_7Y|5f_GNfE>`dtGPn?i5%)V~( +z6Z5o<8g>>j#tdYSXp9HlWBw+r9&7KP_pD9xR?g*kXvX +z(b3{OG31U%k>p;KVDY*P(><%foUKOO6c=k{OO#_pU_`y0jb0{uv+|keY&P6DA5ley +zqaA6c2Qn&8Td4tlKJzVEm4X#cvvciS>tbMWbcR7vIx$cybSc2b|6+As8o{!P=#}7* +zefsGSR5FG(eIRoMCg%s+V#LVw;|w90qh5vhG;Iyl>!}#Nyo@9*TgAg(^wgR9ZIu_v_bJquj2}+ +zfr}Bdyl{Lzs)=CFrsApfMpLzmuVk1}qENBG85GFPj_z%7Gl3f$Tw5$7^ +zY!;beuX17hu|3xS1QP~D9=W6?cGcSo?ycx~h~wz+7pexU%EY%;m;UZo8v>g{2Ho}k +zdmmJs^1`cd#!C|mZEQDzP~P`}QS^%iP}PkP8Y=h`kxAF=VYWFhdG%xr;*4C*Du~p` +zmrUyK5thu5B^Ivq5~{KW4Bo|YCebRf(qTeQ=-LRQVJK+OvzW)j%_On3oR*`a!#fA5 +zMMRkfS`78Yeo=3Z+rg1jm5CH*7`b-j>DjoI7UWX&OFlZ-{*-h*R=v>^8Wp`ki(qFn +zoAn^M`ju7_*39ge_|Z4E+*ix?}i%dJl15)nOqAh%dW3%RK@N|kh1L)10 +zPj$rm3wMm%;I5bAIzmUbZnurIhXz~>o)zjTpc9j2fMDqfKnwOfINh5Rj=xitzD57Y +zZ@Q7T7K596UdW~KLA=cBz1}W+5U_7Qu<2Qu@2KR|`A1|`C?i{1z?w(1d(d)00J;2K +z8jOa^oLNIn0MRAq;SzuF=9J+X}WYgh==uY&JxA#=~ibAC^$0hcENSk-IWaupOt7d_;0$hM;fAB`t^ +z->8L~-A51QWYr`vV}@amy;fW}LmsL_2a$?{}x+of3*2_=cKLawc1>LhOY(C(><@$ISdmIudEBRGXgLLP<^3T`f995doBYW_Ur^P@{|#1 +z_qb+JgBcx{keizqPma~QakePxS!-D_*G|saIB*m3uQSEeQm`zxL}%z)9)i@vCzrB2LU!9@oLpIc~nD9L=uKTduVD3bi +zycXoyk)+DYeI@R%etdb_?K!eIs*fG#;ze_j9U2#);HA0|`XGBty7R9<(Dk{n(AC8z +zl=uUMgaYR4IU-qOKR}MGu^`{y2pgGNswqdhKVBB4BjH)YzRd +z>`y&SF1_?kO6?x|$e?)XpP=N@>Hpbv%x)#AYspVb5>3vz-+u&!_|@Wi)tTj*jZ0yv +z)M>7*Vo8RS@mRrybdMM3iaG=KDFfa~LB8!(q2R-+mfSj3^I{%(p7qmlUTmvc^H|13 +zZm)D9$1CdJdiXd8Q5#T +zG-eDe&mDYQYW9GBku#v6+PhH9Xdlptw>aLm9|BLe2F%N}+zI5)aI_HXzpwf*$NprK +z`sKgh_)C81V>jbE^s%)<&Mw&WT+ioX5x>$(^H&p;+5~~_%Te%VJ+E_u+6k=A+tF*| +zp90vt!pvu@Vv@$CEK}f^nHvRpj}i2Iem_V|GR5ijuQKwHVf=(BB;(@}X4mYi2F|5^ +z(r^cI&g1I0(bJM#h}u7y&^kA1;~n($i(c~H?FyzjLv@sr^|R}_SJ-4Yat$JV3@%xI +ztIUd`?SL)1jrMP(8Sg+!CH1rz@g=b|*;AwjkBiz9PoIbW#n>nQx5G^Rr?vpuCDYbu +zkCs?rSte_-8cb|m7#Tx4HcJVpyTbg~HTg>^QQ8f2yI;GS(Nj%iyz>wypk_H^mtFyHsr +zR_EZ}+$W^cBW)-tiUX~cTU>8UjNEn6S^bzGgx;mu?Inp^?{6M~iw~{e9@{mI+E!xp +zhQ-nm>PS)paEJ}>CAp6}V-m|HSAJOY2uQp6IbX}~}9YVX^^9a!{jIY;FCA_yBhNhJyfgnK-j +z6&MbmqG`V!yAUr+z2qHr37aT0VxjuqtEtw@hqbrGkiYh{I5^q9j`1aye}%1a-@h7( +zH}42BLCIK%Dc!%P5318Gt1J>RDO+M-h^x}AaG&0X`xM_=Wx-sOP`#2%K*8LqQRNgu +zkS?;PPw@|H&Td)fDVGK@G$QJ;r=1(7*i(>AFIR_|hV-RNHtJ4n8x6qJq!>Vp8*79} +zc$*6yBVnb~4V`QB&6~ld|nKQKD97 +za9vBX5675kWv@5PPU_Qn>ypX6YRe8n3Au7Ul!gLKpeddC0;c$9DU-CL$av?Vr;fbE +zdgN@9%IMXx4lH~_pas6m?Mf5f!jmX*PZkbR&HdVrcX0i3O3G4Xg};*Ufj1Nw{aB4# +z4|)39LLP-aKv(^A+(@HOYh4grqTV=ow0$;;jgc3Kc9W4;K77A+zHoBe +z-eCnEih&TTRwda?kw;|t=}rE&ox}Q{5buw?$2{(tQR;(M21~6%bZG5LU?X0?^?KzJ +z_O5Mn2gQG;Ox@2mhGx~ZYF6~fBFs5=o{3T>O%c3or&y_BCf-<|C}_rl+R$VDsrGiP +z44TkfN*nS&@X~|}akifvLUNW_zAKFm-HxM_@^(cyAiOE%?~$MlX(;+YUgY=^NnoI% +z$M$(z{=xhjaM%v7iWn$F0`;RFK%vU_nB4q$P=5R@?y0pUd-Keaf?r|%%kQ>y%R?X0 +zBQGL=3qTNyJk_8Cwl>Qu*GAOzaV_6_Xi#LZ)W@e(4`kkh4i@fB4VZ2>D+P{`E +zUDwLJ8t-2}E}0a^%VO3_`NRl(71Dll1&{Spg-p$2mjJl9iurfE=7l`ZC(NO?BILIefh^ki1CYQM +zLf`t^;khw`1f^H#-$O9LAfHBmHt(!oi_zci)YPsdV~R#@cP(gxR&Pfk!8h3K_o@>B +z`z|4Z+`#vjhPzVJUr+!*!3J@`ObRj4n&+s_;9HgH4nOapS1o{fWh-V>Sv5RUgK(%X +z(12rkNioZ%yZ}%7&>TgVUYO@c6FgTA{ZkHudAKxsJekVt!P@O_l?g2u=GM>Imn<17 +zUlE>BWQ>camVlZk>~*D^A9ItQM#~F}ZWevgqy1MTqcc?I*Hrz`a|8Re{=GP3vg;*3 +zV%0L6;+Mid9+&Q3c40bx{fpIVzSH)YSQ +z-3kX;JP~kqI?X=3E&cMR7*wSU`he>Uk{LE{*T{hH(liM_@z5(~-Xq#G{ZynJ5iw)P +zDu=2EPy8|L-Tqct#J)|&Vg;p;kLC>5_+$v2ialezL6opjV4gi2#F@Yi_(>1plE_0L +zJcDYzSA-x>W8Nlp+CZYsOE=CR4^aM=d!Qj@Vt$ts@P39?qu)Ox1Z+L?94mQC7OIdS +zznOez#lKJWzBj~s--;2tlCZ3Uq{|Zq^jSYjG_)zw!rBZaMhfe9T%u$)8fSSfMfewd +z?FwaxB)_)4_~ECmU-Jewe2X2gw%1PJE+o#fqogQ8zq)nZ(Kc(a_@4+jrFN+iHPmC_ +zt*YbLT=#b67>i?+D{aFYIuw=**kU2KQB~l2kdk+4r|U5_=tWPoh3|TmOC$}xl2AH- +zj`9$~zaXIdIsZzmlvny!jfrY4kNK5u=Y!#O4FY{?&_31=4~waM +z6&mHuE0?o<_3MNe?Bt_AA2Xxt7=j1{iA{A>Fy~$v?tXIBm2i>w>Z2SDq7zwag``U# +z5``xE1lE15pKKRYY8&!`e+E$E(&Sa2SW=lp2Pdw>8I4F?wJ!KFsq6S0veLPf +zn0kA=GQ`S1(dDV;^!%~*K8MWQ#YNuZWa?^j4{q$`&yqO;v*07qD>SVEN;Mv3OC5!h$waKau-w2Z=%lh8kdp_w6pLHJO +zvDdb~?rLqP@DqqDp2XcP+(=*L_7_TDW{M}A3EVt(R)=+-%~fRU>mKvTp=~f77t`@eP<$0>E3lN^ +zL^E}nX9cL_AAal*Zaw_T@B1h~KNn6A&a_M=p +z;wNGcH-maZtS&ogugiSB>|yR9Ecac#M$N5Mw3MQ#B-asn(A?OHCSPuTtW{Rj5#yuN +z+3sy4KlS!)e>dIYAtO0dke7QGFTHXx8?n?vG1bpouKt6jm2(A9E7ikQm{{J@a?MK< +z3Y{WWZ4fYZ$AOUBH+HxSh(jqr3@Y7(gGsJYLyk}4UF@4tR? +z1e=$)&WpQl2tLBH<51kEyQR+icV5llWyl}kqp|W&O%^3vQSM!p4kbFO_5rR5z9%zO +zZEnqK8`-L`6KvyI4<5C+*4EjU72rI*)!@4GHBGyGAhk-NpAZn#%)6+;w~T`Cy3S4m +z30=i}Q(fJY8Y%HJ(wx9l^7yL2dq&^WE`?cU&JCSs +z1g4J&ollt1*tT|tMX9}?@8u!s81iE#e{&`5cw`sg6Hg94Dcx|ovAgnV^9ypPQlCP;=#@1>Hr$m%qShJzxq=CkJzfoJvbB;Ti8#?tR +zgzh1uf{ve9J67*XkLZI9Hsi=L2&sb0p%$ogFUbZY^}l!bzY#Z}ESRYRsSI*C@y;f} +zouB%f55Dm)UfSUuerVTw4|Lz8KsTEX7DHvVs=Qv13+^N;NfIVq10?j&9J1{1J{W-B +zASIxD^p!i}+BxZA`#|~_B@sS!@Q_YEPn6{Pv5-2PLQZEg#4YY1scluRsoGNbn1;0A +z0;IJ{uU?~$m_6om?_%Dhhfan)8N+p>ZB=5X#<81%wy7!$gIFVNnmU)Br0JqOKyVjL}1S) +zeIZ^GHnA%1K~NL~p{&WNU~mTToN*Z$4Ujl#1#!w|U0#013c>~I-+&$~(@*Ij#eS+> +z;_pg-<}FtApSwa2J4tXTbeuP;2biZ1>SX~9%>2}O{ZE`f|CHf +z#f&BR#1Q4!-lw)W767j8Ywf>-~c~Kfk&8QPN-!OcF3tnJWKY=>3iV_72da@BNPJ03%LC +zsF)LpQ#pu%SJY!u=E37&0wtAFJpEf5B)Jj&q}=-_L;I>8DYwhv$5#IDiSsZx%u_o~ +zJRaB9cr1A>QQdL=K(jrf3i1w`;r{2NOvU9cna(o-+i@t;E+Il|jZxNQJHecAsK4SY +z8aiTdw#s@P$vR-YMoz=Q`q$IHkDsz!-3AmDiObIm_vzdH{e2FLEF~U`1C^i$AHH_3 +z(@{f`Li;hMSp^g_`)bz{sLRentxI=x+4&&9Wy;%XQ_GCFw+-CAd-3^hxxEV`7mW7(zhjWSBH2qc +zyn@9*+?OmucXjc^RcRry)*Obl)k!0F4ubF6=Oi$VRNt754m1IJP72GPp3%bf9KK<~ +ziPA|+RnI+o74wa;#!w|Y5g;qNB$U@7*Z2&&NnuN%r-Z=gD!Jh4q!iN_n~tEX7F2bp +zY3~;Do|L$&u`;wc(wQRju`ql~FI_*?6XJkc7dR;X#*t1_7N}Rh{;p +z0o7{4H8U(L%~%!D@zOYJ!-7W};RCFnVRnYY{2~L|R0AL;zda%~9*(@JSp2G-QNvXLOAtdsxarV1P{@comwtB^#*xpfH&X*du` +zgwmT(+EV<=!6ScvuE?P5e_N-g#Fh~SF=wqJ!pqWK%E^@j6owDQ#Sk@3*Ls-kHp%i* +zf0ruwEwgP2=VU@Z5~4-vXklI8Oj1o&vwNYxRat5Cr>db7jZ_ +z2z4Q&@*A2AziJJv9hV!JIFZ)`Jv4WLZ^W$(-`UrHaK{gg1a+TfH9pQ77cX3sm(KU{ +zk#nqMw!D@HW-;V4hRTlq|9rdvxGDZ7fbL*>5?|~*2>!2yNAsjd{=5BBKfk4SItHNo +z`tYz{422P;Wup!o0yhf&ITnQfWXI8Ck_UjPvxZ&oIau-|P+*{+0}3z>Hl(;Jd|)~% +z2~*>*P>g+il_Y~iJVtY$ibq`OzPJG9i%@(;r}M2lmp)>Xk=9+SQfrmd9npRLcEA5l +z|Kin--s|=I{<$kd5WzgF%P#uX`Vi+Z-}B9Bg{ms|HN8d?r9*rwU6l(Pdkxq3`Nmc{ +zcwJ#fMy4^KZwZy7hYN+}xlckM4W}&Yh|qEwsSU-`rqxXh--= +zq@{y)G`AQKoJ^OD^Op7}xc6zlj#V5dmN-=4sqrh$+FsMr*AbbN!EvIgnkpvs)nVp^ +zi+lFQ_{5?B)Le;%=@!fgmwlI;A(c>G1_);0eTO*+klEI8{=vp(?89Nk){gzK((Km5wkkqqC=)H@PPt1;7TrgH +z+kd}5g5pq!9u)Y+yTdQv+0)}9wFOZR7{z*Ebq(!#n?D3OVCN7&?1h~lJB`~nvX=!H +zI#Cu=n<$$Yn-n4C4*6y+37X$btul4yMrA0K6=1vJEF9{Tahbd$Yjztx_PjFR-6@6!)E +zxL^+Y*5x7#lsU(n)tuRO{SN!o!JVewuqGi+GK<#^g8^@Y3}r2&<|HVd14gL)Jt*#g +zO@#O-Ml;l2K3C0Un8b}0ND&j)!sD^Xg6|tJ6&*T)y*FD8s?ZcwEK`p)8$B@NhD@Cx +zhtDLX=d7eAQ(3RaroK`O`8U{C1fA9l$eUU$sckFS6xM+$v0TjoPh=-G?Ooe@Pjk3# +z&eHGL4HGy^^1I4~IqAWx$hkI#a*MJj@T5wQCqcNrcQPz-{mWa(n+iCgQOxJ#*9rCp +zm)!nLIwn5T0r1QpjWc0VX1H(>F-@HHCK)-z^ytH~=m$H5)CP=)M=)D{a0^LRgL|w=@tBN44kIO&s;WEnuKTBohmW25Ds>q= +znq#xLuCm%624wHGPYvJxt$W}5!ySN4C^N@IX$qASOT}Wa-qXV}Yjion2z=@$O4C%L +z7|D_e+agQS-e<@3PxAxl7TWGYD!(;-2&F190Wo4n4wt0zTq3tdsFRVIez;i@6J|GsU7#gKWidhB7dl&k0lMY*Tt~pvh+1 +zwAy>tG-Xm)r}ERDXrE{W()KLK?`bw~1@OO2c;Y6-lwwCZQ{V109N4Y7m;ceu6+szWXMF{x +zloUP$cgIG3BN}}r?xnIM7;DP3Ldm-G0^r4;_}l;D%l@72D;KVVISk^JZY+$@-U(%Z +zD#+@g(>e37byii9Bp#EDWy#dEO%q{3b$?~(AeSQVK#~8uo1>jhGUS69f8maSdoNYz +zoyO9Pg|b20lgt&hn2dzrPr_fWPJFB!uO-rg9EZjY7nkvipD_T_FQog4Rt@7&jrWMB#>1bLi0w(q~3oZrq%&6VBb +z^vZ51p(}JWmEfd-U^Eyiom5Lz6v9BQ4u@#|Z9?He|BWl0d2!35g1&#-XAg5Ncr3fR +zVocEW#BDfXg(|c34q%RHk6qbK$!dEpt5X9k79?0VxF++j>5A`2)%SHa|0->MFK&Om +zNR*?SDtuZ_-&tFRV=PVRi +zunfw=`5ji-pj}+^Vu$9J&txb|DKs{B$Wow79^0$t%6A|SXvF@d-Xm3|( +zzG>~$vSl2^+JbMIQO6m=g;g?W +zVZhQ>%(~M2VLSs +zMrnsS51f0zraJy_+K;_dv+rJIrw}wYeUV?G@|!ldzX9c+8tqFM+*0|_j$EE^3`_t1 +zQuGkIS<&4Y^v)e-CFrZ5t~xBK6qJrtf}lIF{l-1x?jBsb+8gaj8ek#Vr<}Kx#D-1I +zdno=PXU49d)Ocn>IT9=W* +zU4K-%S`@qbcKwL)?;zv@Q76z4+E1ix_w;)fp?Yo +zGk+(7HRIOMxda|&>6^;El$su!&aK{30-eMIU2w5L>G8MSm05>%7zQL-rgA513h#u9 +ztRVLhw3vK1+R;_S5Q5Q@xHg+UL8SZ^q +zpy=0lPI6O<>Ks?ig*V;0RwpxCoLqgKEJ|=|$^~dn_COUdZdT645(GE@dp6Lv1tg!o +zxewaM0=WxLCQul;0nc6P6}e%G-c?MHt!y>w!porx!n*4k&y!eW-v6sjsmmh3aU08^ +z_{Pi2e7B>no#*bj-5(zghiM|IO}T{x6V7SXuBXLAWABkwA<#)3DnDF8?p-X1>Mv_7 +zyS9+(aXHS5*EjWn!d}Sy*lohgA~8XmWdw`%JEHsc +zgYnxpA7xi}SUs`HcT3v +znIM)yURadixC%aA8Si2}b!2SSkQb9W_WZAE{m4V2Zp?N@rl>1ohJR;{yddRT99NEB%vQXg +z{S8hTm`rX#tPr~@7hZ%(sAwn_O0HY4B~KPsj@!%LKlN7%))vhx*3oGdUzEXaL||3s +z5m+*7`l50~u~vAvnzDtRpuX1o{s__;N#Xa9aCvY^(L04_XigxsQXALZ)q_p>c#Qua +zd+!=7OR}8@t(93--MwFDpV!RXxv!D#y}s9yY{`090s*!xfxh9{^`DZKk?EQfH%EC1z31)`{9hY#ZGzhCh +ziSZs_$~N7U`VrBz0Gj^aWIv|TPYP|pLnecVR{3{k0H^=i|NIBDlhc3whd&E6Pm^a^ +zc~>?iA47=8rzky32O)YyM@8W;#j>(Dlz!*ciGpd)OlnHZp{4}V{O?^GxIA?S9#CHY +zwTZreWS50fZdRnsvR36Z&5og5VmU`vR!M^?1q3f4>kJnDO@0)WXsWX=w_|B_%SmDD +zl=UNx{_0%9Bdm>Z5F{5oAeYi>xa9nK!V=PC63!!Q_D_li^8TnMh|9KGHYMf~WTCkC +zvE(*CCD2f86xnzZOAjL17gIZF!E_>2XT_zQnAlz&N-^KX2CK_(J|K5To&M$r$~}J$ +zI48H@K3;v~&*nSspZHG~Sc=SvQ*qa1n|AhcLSt0H=^{T4PVAaQdfGDE+j`_m&I8@j +znbMlvn!>+~$Kr)8Cit-|l8dQbrpoFJOe)~a`bB82=$VE^=I2R@e0z9s5U|!V_d%gWRq#`o6qGIX{5uLL +zQXe`lk4pb2-O=guC%OH?*C%j@$!qF;yqMWL%jtBoye^VL%^vzse!GMF>D7D6q?Rq3 +zeB{WY?;#J)?GGe6Fu=Ez6>L)Onsu!HxvR+zMW>od;al>)N|L^uZYHEE&&yb)e64Gw9Y@_*Tv`ba1rQ5_gx#hGsLc5E!i3Pi~*RhtC +z(U()?1y|+}j!EOcsAz5zRv!QHF;o`ZmW$o`PrIt@scrHpd)Ca>XQ^)(e&G7_{Kk`^ +zn`<3z$cyhfdbs27M@Bif^`l=v4*oVDNokr~k}Xt>IaSm))#@DSG5gV^spVioF;-I4 +z-3rAi(t{@tCuyRt(lkRj5W7bb@r*I~8dX|*Z9S@yG&|8O$v7CWRuZg+Z81@Y+_2UD +z>?Xf&=3l4sN7O^W9NAo5gb_VDPi9|u`@OIJ%GKZb+ixKy!E(WKE=E>-^=Is8D9) +zAc31}VoM+k5gKl(U6yYg9Lm|w-<5BEYP-n@4dUr;BNPGQqyi&&nN1p4Qq#;S|E{{ +zm1u;@u=CF-ab=U18!;?Su>NWHbZe6@bTv?v6}iFAnia;R#U| +z+!eRBS_K&}tM#QV7C@!e9>QcA4~a#vWe4#8D?&Eb|IWt%6K;jfeh#jF(40&$7kR!4 +zZ*bS+?7#RQzVUs30l)R$>xI#7a@k22iY+6Gwl_NzI@T>gsShv=wl?utEKQ^7xPr{7 +zg}VBCwt(dWLF4!zm;*StT(GEl%IY6Up;*r1&0?7wcdc|cyQGFMzh+LezbGf0tz}*= +zD!1~s&7c`2NFtSRTcTMC=>>OWWKkQ;cT+g+9dS_gx%W*z3Q7_+xA_;I0Zi{C<_etf +zO!E1|JCje|P4ea3RosHGId|FP{*H^cjGIh-xtynnDfnL=Uw)XFobi$v$APo_s% +z3g5fDJjbW3q)M9g+%|3WO$}r;?L;n4iK&pPQolM{>vTxAE|zE_-6BHITio4gw}#91 +z;t-j~u%~r!$Gse)y^gTG#h5`Rp;TKsuUhDlUcSm8?(eNb9SivyDdVsrM6Xx6Z7CmG +zAX-$Po+?R;9@0-9cWq#6{9QF}S6o%q^^=b`m)bOyZDWAl)4uscZJ7(*0MOSYI@i92 +zTL-!IaNqRle8mWQYdE-pM}>Iv^yE5Sk?peLFEn}?FHH>{biSud3T+vq&P*G9z4(Gn +z=*RAZRT^UdXYDq%Q?N5Gq2uw#fK8mcgUQqd{d5lva)CqKlb4kSwFP(Y7ino! +z@xx5NE&wVC4hGF9fA{ad4HxD={I}l%cnmg+iz~$$5j7+fn|m5_RhG-Tl?cQ&U2Dy} +z3>7d-32^wolm(}{{nZ!qzmVcvK-VT$kS=+s{Gc6A^(V+5s5q;KL`WRi@@cQt6}yoK +z<29zFl*BBO#6hji(!TF&c)%nIyjn4Fh1o%QQd*J!jvH9D8LsN4t!kdMRW%y%6Umyk +zJ_0TKon~gX=;172X(0WrM}>#Cs=Q+8r&B1)$pO4|FDaLc*l1d9;*D`81=k+y;j9T> +zFF|b(LT@W0ZwNS?0uiMw$u3R)aFV=!kOGwNUZ0 +zQDOoINU)CL^s@}RpKvN!T30YNUqhv}SbJl)R}&i=X3^eL@KMVo8z)F!W0~UgYahVk +z{j=8}&aNLGn0cW|akiezII~or`0M-}m?OAaXd|#X(Lu|H+D=9TH%slZen;=5VB=Za +z%4?DMR*_l|lXOAn#C4S^Zn|@fTC+O2)*42(KD_4+*X%wZseauUTPB=gsL++ojby4HIGhs;09fvaabtmPjG3SPpR4=#)usTvSBtb~sOW1Y3y|jwrheU3u +zA4qxpZ9VuFOHp%a{=3SeOEX10t_eMamY2shKSe{)T$`1A5w6QHui*q)_DNKmUKc +z{o{Z06FvrjMJlEa;BfA_W0M!#cwU10H^+Q +zedzuQ-380~=vNazN~L36!UvGxB0py{qW*)hItY^U4k$<(9sCs(LZ!g%3qpSfjkFVw +zn-ndXA??7e^+&<=vk}|;lU566{JpD^zZE>}ol2#V%%9cz_zUk{&Cf1Cm5iC$*2s_f +z{1b1S_)BIgq>X!%l{{b49Omlok0;HBw&H`&)UYA2oS8w}UFho9*_YNp|J +zq3Lm~`!VaDw(Z%U3W7H|>AHRpOBnrgscq`(^J*!hY-c^ie&QSFp`cY%Y4u9NK9-iX +z$Vn7vtO_@4D^s1uhLM!w)ktj{OL!n1xl@Pb)(vT^dpr)M|7s;vSkqpKLo>MUFKujl +zH}+GuOG16M@_v>~O7@lw22n{;ABG)E3j|dFHWHBAsDYJ1F%;*-U%TpeMgxUcQzdd>jtJ +zER(cUiJ6*oVl}|zzx;{o({C-l|GPiJX?2|^WE0K=Cr)L=E;&g|ll#jr<}4P%IcUxH +zkN#4!4AR8$Ir;ay11h1I{mjDu%h6RjhXwwngBeUN^CFqp(k7*ttE)`CNkvZhloIa! +zBxOW!Dma;o;vEL3I10gl)~O#HC#+%@rX2gsCo4DK5gL9m2cxX|;p&`{=+#J)nqB+2 +zU$!Kzf~6sMEAq#yHHuv{1*C`BD6e3h=wHVFD>jXGQ5~Em&H2R)XH?>O8A+TrH0w2{ +zs(iDI%2Furr0z@4)gM0bWJ^wjTTXQQfri3T;X->Le~P;>GppV_oifwfE#6+t6HwYvnV?OezB+%} +z%o&2YzuE8EL+4{XS}2>c)Q(DxPD=6Wlm=FRz4}`56!9~lWF`~)yo%MUs&$V&&dxkw +z$NXtBJ1Eqr-Ga0qac#6ey~(LwK8E7=zj*+YJb6t$f{d}Qe^jhdc8bZpxq{CXkl~Zk +z94cjt^wL76oaS%wH-(f7a|I)RlqxE(+5rP2wd?zl@ExpkMes#>Wt%QTvJKwY3xi|N +zP;tk!M@Q_TW4CdGRjwj@*J*DQcTWiAno4I-dM-m<#kJ(6Uvi>kTa2=KN1(PJdP{zL +zMSOH%!)fOxYE$>R0?{_l=_berFn)*1QXQ++Y8mBCgx=T)gV(K=ZvSS3eG?x*OkjeJY%zgA0-|aG5%Cb +z!gFSubNL;OnWzvJr}7mxRxhncVc-%b=~oJO?(`3(8NeJ}Myz(iNqdjWfBEwl*I&N= +zPyelt16+YiS!hj)&7uaAL{)9R_Jqm>nT6kyos{RTW5}3fnHB1Z-wl=?eB;S4*c_H> +zTKW^2|I4%NEu}80oRuDyc??}DG#NgGLL2*B9PFL2i9-^pYHX`~-2)Se70y-a&&x#% +zLOuaUtF{p#RWFW@U{|J!t%M!fwNEqUqa>!G=+G|NfC#LTI@GC~HQFg5?^$tOby=cD& +z@Cs2r#shReqdq9p>jY9~7@h~^rNl>BL32sEDj~U+6uZQlny}VoYRrA!*INKk~~%zid?`2vbBzpJ2Jo;=W{pQ1c#l@Cvo0$psnn){y*n;5@|k52D)GvM#e!oQaoTgS>rrxFP4d_2?VA^4=9AyRYw!1F7|P +zHgQ!ikU9(%)gt;0_|WfQDSyLZi}^zABnbEIwrm?M-YRB3 +z*J#f@_|Yl*y;HB0Rug{s*TzFF{p`ptm3gDEuLE8oEZ1R%K)FpUDrtZ8Sm*-T_TA{j +zBVm6+GtSSI0eyy@0l_1;h1GnLm+IhmmW%Jf0uHq)?yBNsnH6T1PduQ7r~mE$zWl2{ +zau>23@`;71qtsts!bj_x9J|sKODV267gD+0cA3Z}I!;D%rJjBTo_%R))8a18t{zhI +zH{cMamqf=&dBjO>D6-@Z!s&8Zk_YJwy@y>ZTNxC#XijZ%N#?268D*Sb7S=_=D)-SxRoD*xtIERTdTziRYz36CfiGB1 +zeZZ>BQ8saPV`9yM!lP +zwQw1NHOk@2*X?O9ABwS({HEY6BN^YoItiM(QedE3=cMJVbJJxCcM<1quD0`B-b_)e +zCxaXEtfJ{2XeS~H9Cc1wuet-_Rmcq9h_*Sv3fVk>T|gdl-p#NFos(6wc&IUYSJ?(S +z@9VT$Qg>Hw(@vl#@9i4u%LWWIARfNwc&l2NoB;RTq+7|0K#yysy>GW8Z%rWeM+UO5 +zX#iZS4}b$2JFt7tU+-&I+1ta92@d}>XGOdHz{Y=C_pht{lPj_C0FOegA*o|Swc6he +zzCE{ha$OkNH~*p+U3wLd-nwVO#ciE;oTYUOXtf3kDb2Ywd1C0A1^Pnk;@Xpt%=Pl5 +zJe#?c@V?N5+~#43U2mLqgaXYKIja+YI;p}F6lMZMu?v=;mX8=M1xj`F|Cq%@!)Nso +zxdqc-*gM0_oCdh_-~F$T-~j&GUwi=Ym@zhbNY1J3szI9be8iUog9E&EIocUQ$i283kCNRc$nu4Pzx^ZGYA8SV%$(S +zHMZ|xz=a}s#tHjUf$cOw1rlGiKhTbklmGWP3 +zVF~L(_=BU60ax|pp{~wgyp57*&eXvdKggF?e#lvO8$#i1 +zvc4XM&Rp`u(l?d=LlznAt~Pdoz{FtIHnUuaR>r+PPvLy?JJQm5%za0xPZC~p4aZ}4 +zmU8#t`|W4u`f>5*y~*MM&F6-rSU#SQ^bQkz%@4`9FH55@_~d-t$t)VTy7*$(EKrT! +zWMgAAibi=?WDvqr94Z_Y?yRD!P&vOj?8ZITMA~PI-L}-%I)g&~4*ZiyZm_O)mhWh4 +zzA}5A@m2a=s1+Nprpq~LK3Dsg)FLM97oq;PN)#(L4HE4r&or5Dti9N!?$xNMj81#s +zyz(100|@rE>{-!O{LrP@MiKz_K=8M6wDGC#+xWVH#PFCnpVqvMhO)w|R|o5*wa4U` +z>krcUVWHva-SOOcp#d26@+oU>+1|I9ZtpyAplEb!PdCPe`C +z;bqgTGv7i!(T)z7L0fpNqQ90FUpDxc%hw<~EAb3W%AK3$K4k7|j~>1IdH0|E_0M>? +z18!-RHOPtiUR{wp0PVt<+yi&3g7h!9U23glA4dO?#BU6Xdq1s~P%Kn&NO1YR)7iIC +zwm=_`OxaZ)7gV04>LHnVVK0T3!N&mQ1_ZI1S&6KyVqKtY6QfZFb(hZ`yDbwxOi8&F +z1Ip;}FjUKjnw22jAL2E;kCAr9jk+=F8;vr^%<&kp_CleocEz8S` +z$dd=~Y +zKZ&VPx$=Rg`xs@p$95%OtDm+9DtmOf{K^NH>i$7_FTFAgQi4k^4^hk8 +zvg@tWCVa2)CTuqU?z7TXO0SzNyLmf;0e%XN-8lE&2v<7N+Aw;Doxba5IdDE72DOKt +zw4)7 +zm0Ye{C${e|b^)F^GKR4zgPjrd>x +z%>Vl@e&46=92^<@G_@HsL9_w33~c5zYyJ7l%;!olKf^)Ro6|bULML(RTrsc5h|W>Q$@8E3~PDlV6CF% +z0!SrMqKP6XLJ~q<=wzDM=VZU|c+R=iQuMZ&n`7QQ&0as5%u8D;|BW7$+u-cNt~zY0 +z6mGGls6I_W{f#Nf5rUUO`?jSii?Z~GVZOKpo4eD4V^IE%EZ&Ue`|8+-}5ag+*i-fY*3ZwVA9p~F^3zsNtWh~#K{UGey@kV2Mt=8ubyX#k9xL_yzjSbp&z|RqDGjqHi^N(m?#z6(s2h!t9E_+hYW+fFd^J?0(;?5VrB< +zgwc?6r!vm|2az@kMX1(;fIZ3u`?<&00vdylw(5wI3`=mV7klZbYP4`(KlR)B*L6SD +zYz*C7;icQZS@B38>_kkuU5SHzit9Qr`L9HYymat`kpI?y)uPWSv7=uneuBHtG#bEnkS9o#4f7pqGC{K +z(Tq8H+5*0*a#RQgzY{s^8Mz!Vqz3&Ko&-&l0_l0lnjxxB(X6YD{@e;bXO`(CqYsYk +z%wHur@sZ| +zGI{ocGy^@;z~1DgeyYtO;Jv^5bH4{k_V4`21Az0y9)d??oUY`#fk73AjXS3b6D;Ps +zxDvk&WH9Anagus4?f&)VE0vot@3^4Ske{nnmcCs)o+oH?cBTu%~B +z59lgK{}l;YCNCsWbV6Z$_ee$0O%%d|A5QCd<8fQ*i)di}u+DYLNGSlvf#Z1_6UK&tc(7v`p +zq!C>gLF(c;?}5Gt;-#Ms^MX!iCmGCq^zqH*`^LgiJ~N56Xp~5Pa3o>1zjdXCLc6mP +z7YU_m$=>Rim5}iySE|&4Si$89EIkw^)eeoRR)%2&P1201ud^r05p5PT46Z2Z3S4t0H1l>zwpA$&Nw2 +zY60Jx>N95aX;^7^-w>yA``VA~-F|hAbv|r_lbeg5ywGCKP92sw`aQT&W_zb|9{l)b +zm-refj!}ad8Of~E(%wAU+mgWz7ROua`hG#x!&{LvZ=as~Fg>cQIs#6EDHZ$6I8k_% +zoGHRw)BDQ93x;m>;_0we$zl*a0ZI`sP+h3xk+QGzZ}bJ=LUcLQmdd%H@TDzs57rbf +zi;2S2!vfhr{eZm(<|+BxTxn!YTfu@Te@GqE(PieqjmV;Ws=7Tl^3m9%vts +z6q;pP79LQcJ52Cy?tf*@(1SWk0qrK~FbP&T`R!b@4Oz~P27vB%otVT?g&%^#iQA5= +zI3c3jJvi=BWNnBM)PBxg>|Jz&mIv`T{$DMmrArN8kH_L)d2$Z92IWDu;TYbqHR(t1 +z%_imCkhW~(RHa*kCruP$DQY0wV8R-V#VE(h_RXUu}LonVe3i9(-RfFR$&q +zOkAi0hoo-64o-2rmZCa$#Rcb6(kkKQw4{e6l2?lBDms@;Jg%=jvDgZ-)TBf??xR*8 +zDwShtc^1Lc=p%ryJ$(ij_TI@c^R*}!?+8v5?rz>~iQ_l>7JNZivwQ8`f*3`rRqZV=FAQO4 +z-RA2m%8Bc^n7%{+RpmIs3wE?P!loY@TJ0g7jPzOxew*;!Q(0~+e7BR|E7H->v`qr_ +z>~%UcR1rFX#$Gipd9BQMliA+J(Y#TV)N2Ta8<1EkfkbjNz}tJ(4UT;$)0YqY5x1Zv +z9ID~q&X4-qmP#D@7U&S4hMOHneBD5msZ&fD8%wO38MLcP+vd``X3buc=*D=pRe9LA +z5p(^=aN{uUhn{aGCPhH?il5NlDDW!c5!@1J8G10W+7U=6a|IVv3iuALfY4Vy;dC-f +zcL+rPM&>ebr$MnzJWWKDebeZ99E3U2f+ef@tTKX`$3-rxOGnAL>eLhCU^4wR%0FQz +zuk)#w=n{j<=@Jr;w%_<~e(DdtNI_jmIX{b3}%UQRnhQk +zns;p|8FKbY^c2Z4b6l*51dW>@%xwJ;J+yb_jMRe}XTF~=&Ymrw`(ulPPVDyzCIPI1 +z!mK0pM7j4l>7MA0k)-G_vYklT&(?gdp1zB({5pibp%m)acqr$4EekceNc|f{#jCvJ~zN{k_3v4_n +zBt(vB?+Ctw%Af=#wYp{u)!?rVFcy(^{o7Uz3>#&@T4-Zj&V{ov?!^455p*kj;?Z}@c^qyxvW#y^CV{gF4Q +zC-z4hSK9WkyR@9!DP?q1f`9Tec09v;W9x3gUFZVQw{j}GHbp7240^ab%df3V<)$is +zn5cJC^(+Aoe2+Ps4tDFk3ka@2cWrV=RHC#tG$EI&pt9n6?guP;Vh;Y0+@o~y=Q+RY +zzsAGX37M0`qac|4kH2`~SK7b%qj!MLlsV1Q1rt~LRaX|%D2m($CzcR{I2Ih#e$O_L +z*=(L&p`9;E{WDC$IV|W1lB*x}Z(dGH%EWfuI4V+oqHva*4}{P>*;>{JL}^`1h_IQb +zGeK||qt?JqH&U@M2wOGsU1Q|j(h?a;YAWpb%TaeHZqbe_zDgVNQ`1o;EGRNc87<6t +zTTb-kgB-tj=I^6*rf@jrc~mSud4dlotQG((K-9l!fu(HP?N*_c(nx@1geMae&civ_ +zsKpT_saXg`lG6rC>%R`vT~-^+=jG-3^2#L`8JH3?1SJJOuY3TeNj**MQ%=Sw&{8k) +z;8aG4$s~aK+Oc_Q5QJ}b=vHP#M#D{3Bt7Sxg +zn@^y6>zEEjyvg*hgBjZ8Q)?b-9AW&vc}*BhOXDsEG5d9GjyLPU6&m**q@7(|fo?LH +z>v`C2bBsItN=9RqUk>X@)ieTTjnr{uT+F_21xi7kC) +z9+WJsnOnoT@8QmL_FP1oBAqD6Q}sB-J7n*;Xj^Bu;ZbDPt7bOt(sD%~olQ|?e&cku +zRbUmc=~T7_{}rjW2OboIUObuGfBrj<|NS3(&HvIB$2eWAoIpkS +zFyd8NVJ+hkY@$=tnnfsdq4TL(cmViwg=l(+f6%{zkm2T$4cUe)cCKFagATWo`3 +zj?S{rJO%JwW8SXrNpzts5f{vyhx-aMj+*#x=E{1^_knX?dU^>{NMApC7SJwFSGHbC +z)saE`BtZ&`LUR1#qcr>z=r?u@_^zCrBjH;`mFt-NM)qG4ijRf5&oU6{Z|vz<*Ee@) +z>cYk>k-ERyzB#RP#;6)tB+jV2Emi0@tw_TmSJ|*`s8QRXz5G4*UwY{#obPcN)0l^@ +zwHMo&u+ZZe>O(c)2zOF-%A%Wd&P@Par@i}3j27r^*dC3mC2s0-?ZERJMkK9dFj99l +zqtSbIV<2D0F4bRGx6{?WD;#0p&=Z9j<0lW@PA}Cm7T*XEH(7SW2oJ)+TKXFI_!R^B +zUWaANJ$_AtX0M+(I;*ei%nk*=+PS^%TvXk@$<Kaa>l!Q +zmWYmt!(NrffYAnRnLX3x>xbo~2BVUxf`T~_?7LoWrhSX^3FJ!6!5Up!kpP*pdIaAi +zt1QcB@W5uQpn|2+7f?L>Rjb}~?qiUasmD-d0`ojkFkyqtpZM9g|JoHW4{$qlLdpC0>n0w#j%y%66 +z50sOE{04<7xsKVGxDal|P^UBSOf+s!d(0>Wcf=F3*CAgbcJ=FF4L+hbs +zlSz3Y6{1(J7!4;*r=%uz(3!ZHgjEO3Tmt-H&G4PYeh1l;@Q{L;o==hC`YR +z_bZY?S2BGC#8lpe7Do|0u~8f@f@aIf>|D8}f!EZ-1P?vL8O26;% +zGQDQnk(m{TZzl;OdnI}&Xp9D)Ipn|ImWm1KeokC-|AR`LDOFJ_M)+-|b`B+-zsH~q +z%yLa-^6A`PCtl(7ptPm-f#EcV{7a87!5!H9=a>Ew@DG|v +zuymp|&@@?EVf%!FLqI}yYgrI08_bBgCD*7?1$}G9f*%mbLygJ@we*$gHaaeM>b4xn +zwBM{h3|jy|2a!Q}Y0(@Es`>#THugG^e6lM9yKUOZt;6mC{?BlYpW3KY^@UM}Z^EF? +zNhNktYb0S?+dC4zYn}>0hwwd`mP30DNPBaImUq~G$D~GQa0Fec?VP#GtlqT^5m)sV +zb~lN{ZP`lPD_eO3y_8LDjyuWB?POrSrUXGNu~55qMX>Xg*3E3qVPOqBUKH|!x2|HqBBQZW%+E|iQ;P0^#3g=K$2%eE!L{2u1{Sc$&;es`7m +zosVXf^`Y84o>B4%6c?|uxzyBCKB6kzj2QXE%tf64H9TUD3$06vjs3K7VzH)p%x;L|o{830dr|;U8b*!BskQ8K +zqbLx2%r?+qoa<;?Z~ihD6_Qis=t +zBO_Zh(7L7V(z%8Z;G!}GIME%nr89<=2w8ZLl}}7L%O2r~{w!9?@W1lQO5?kx>U=rQ+_?0_{{q-&Wcls|g; +z-uV(1`re&n$r|X$`D+ibS!E{k$DAp6T`!k*VNFKTkkFnSuF+7BU#hmEfm&w}TdkHl +zG!&>x>{3-p$4Y0gR;YN1-j=J&Yp+*ur&4bR{Kwoy)#0ZrlO5I?Qf=g28_T~k+-x~PrhnZ1X|jiY(o+>8ECkn|0~ +zHxoz*%Fq(ptXZf%B){^E$`_vf$3Ng<*^=-;t$Lyd +z#t7%Y3*$rYUbUG%XwE@(73R@brJPax1r!lyWHZyjV1VeyPAw|vEZo*CvpX=3u*X?mF7Rrc+ +ziTbtYaD>AoeeZhthgTLDR$eQMDW(1{d~P;5ovNjDB?hGKDt=60b4P{5O4-C#(%&pf +z$nA{W=_oJb!8hx8GY~JcBst9v{p~m}A79$bge62!G+$y>+X~dy9(-#&19%3?M|3iy +zG~Wa^!E7d{A2)wH3rQ0z7wPXk2H8#`;g8bPm%L)R&%Fc<$ajg{ym0 +zewd^J!4D1|AS4qFpMqlH-@%;tN$4lWF5YP){;_H&5$@5{#$Yv*P?~dwI^DOR7cfr1;JT^)%q1aWUt%$va;Zz$8(W}`U_S@n%Im&k^00XK5 +z2yNCy<*ifO>kQ!THn{F`3#!C-4WWC&k^P3tnuSbFN`PL{&|^JMpi4X11tQcTOY9M^ +z?G!#lnDstJa`4dUL)lRU1$R|5S^IW;;VZ)J8pq%0*}>K=wazZ( +zHnl(rYf@`H<_=7)mm0MiMk>Yh&R^a75I*3?`v;jpb#hwgb=FaP1XY#sw?s{0eqj#?_E09R(F?*=^q);@-vyfe~@1L+s9N6TRBIH +zDQBQXv>Z*1bfAhkO|a7p-tsmQCPM!uD}R?Ms0ZmWH+9;_&zENkGwbRCo-hf8^qk1J +zKKJ;WrT7v~kTVVojjt+{1p=xrz%J47;^?XZ$(qpsZW5pqYaVdj!3Ts~u0d1Iz%RtFP+PZwm=GnY8cAm6p`OM9Y(K^|wa6a5MU`J__07Rq-Z +zrp5-;itx>io^*>{hP&hMwkF+8GGW+?J%rYX!JjJvab}u{$4=z>M{7^&c*4*h!R$CH96%rvdfX;yzMS; +z#ow#0mM=o*WK6;s_dV>^kK-EXy!oAj4Vs%xD`E7NZf0Dlp+BoNU8H-kQ1(;i9zzS+ +z{GPVMaZfvZTTcd;xtpbv>p*l8p~4ZQLq;2@1{4&g;W_$%;9qO +z1yjB^x%{5wm?2w`nbRIqO#$XV`HLUGN%F6L_s2P9uX@^lDvAt~aDU63Tt#t~i%ql+ +zoDlz2Ch_l4zgggWi>Ij4Vv-%_3jLwo1Hor8N!OnZkcHt2}wrP;K +zrviKh&aiZ@5Pj>Kldm8$8C=CI33QR+`c(I4)7xzG25P?_(Zk#YsINY|g4{#o1$zf^ +zHD#VA>D{B*b)Iv6zTLy> +zNt#L|$Ag_XR>^$tqI~<&HJ)VdEA~S-gJ#7$e7b9zf>r#ExRq{5HP^Vw&_srD +zY~#U3WKakvajkNdK3uILUoj0M-XiX_ +zr9Wy36;$0!CsoEejmRKvtmk!wuJ#*c8YsN%%GK>jz*iiBy0HC +zn<@iypw+RgR=Px+Uv8U_J#%&J=g7O=ysf6*4cwLBovAu%;2q<}Re#WSe`NbH?*1#O +z=%re{YQ@*C?n*0>-)q4fP;FnWEo`Vf?Div;gxW#X>$X)JajoIyV1s7=R9*K)kzqpB +zu!Pyq9+2YASSnfwSv9U*NLDl0(9gj*U8bCORK4tLrANh?K5b5t^beWMT7KN(mE#7= +zjorPFa%J8cM7Pj(E-Z6W+{u@PbS^J_OM*g$PEhR*=GwBqiFve0?$0vFE+@w0-YntP +z!ZJ~ZUwtRdzjpSwe(*IPPPnL7h{2H6d5DM^V7PGYF>`5_M(F~Rl6CuxP7{w{EExf= +zzzIsc`q}Ih%#8374${BGt)Fub%kwEs;o5Q2;+sH+ww!}2*mx%4+Z%cVogyRRcfoMp +zRpNPKO2{;G<+#(X;M~8OSjl9!Mz)v6mgIluWs#4Ypi6l0uSpp{|3jZ8=loebQWz=X +zV=oTmA@PO50<&L|;#VqOr*U#R&d#=8{#v-gfHpc}Rx}LBNGI0#vHSd`fx>@liKXab +zyA%@m#62{wWJPxF!HxEse0`2NB%v);V5F0mD138z+D{9XFt8ts2i_|3}_(kVT(9|-dGfF28-r`BaB +ze%v1>aDsMT+N(@N@vZqq3WdCXbTy4^r)wa6iPJONnKu +z(isH0IfC3x<+}$uXg5jY+8@20_^piPrNdH5!)Z+WOU~2Pe1{m`G$P-(=J7f5>T$?Y +zW-k=p$tR7e5%;Y{RmWSWYnId(qiK=C2UsaYKz%G<3x-oPQfR0uyTp9ALi-*hK8-(q +z-Dla6Gr#Rn>?N2=j)3X=oDZ(2nv5q&kLiHKHJX5GNE2h%?;0t9xK%_PcTB6V%bIUK +z)tzqlI)TL+ywbKQag*7IE41=gn|{7I!Tp9$E3IVK>hbaWQto%?%4nO{X~ja)xUjD9 +zC}>j)m}Ed{it2d^i-hiofw>)*z2!B{Lxr53w}sqIX2S3^B$A!z+66HgkMGq|G35Me +z39s4YSlNxuE)?()iD@ZR@Ly|V?(k#q!D!z +zyE~mE?#cXG;oqK2i~&nOTx1@*op}((LWQh6t@VM{ck^Xw-LeTn1yHW$vl(MCBorOI`YJWUtdcTWnzW_RmoxGT12J +zbvY*kIdvMQHdCKeORZDG?r|ZQh9SW!6L&4=gl@6hvR6^r@2H*r&|C4k|Ksz6uexax +zZ{x_go~1nouWx|Ax|Qsk#QFu-z6EYWiN;^pDMu~YIT+>4^{8)dJZ1<7;d{{V46unzEwgD`XDM#94HIP +z+D{*<|ju+X2%lgLJd6t|yGqdiRgA>A*0MQz0Ny!XJ +zaXdESGn+#PD#Rx6-GdDEv*aTd$tw?Ni}Cj7T1J+wpht4&74bUuQMvYOSdO3SN?Zfw +zS<(+_lBDNX%dae#+<6Nn>RcP<(7!dy?rF?h?lpl6Am);lxCylSu^e@-+SP90we_j7 +zW|1g7n)nb)=jD?NbL~K3(>&?~e{&MuPpUM*xhbDGoH(t(<_Uj8!U0gFKPC+8GLT!K +zl1k|j->ZQM=kLfI>*+m8Swov8HB+M|1nQgTCCtl*N6DGys45W}S7sn}(>dTh3m%Li6-6~DwrL)YS*(9O4{J)m>z`Pla$ZRCwj +z;8E+G$fKm9s-M`XRV+W_g&RUe)Nk#`a_PX;+1-x5Y%iCCE8cjd+m=ch`o={W>hi +zvUIBZQFG{4*TkC-4q?|ncf)H$M66DjaU`Sa6rBFr=L@)4{Chum +z3NVLQgsyh6MjDI3w<#A$rBET53?gRWwI;m>r#U3E-`4ocR07WY?-Fo--Vhi{&7|ZI +z#rm^Wa2L!$Y0psEVSAg_GogZ>Oq5ZK-Evm4xwXH1Goa2VK6c +z%8Bu?`ncu-=!r@)4smReN(S6PB~8P(TnaDNL~55(&|jFa%a}9d?izL9dWdZ-TIIO8 +zGlAp}{SaK14~{1D(+P{$`}5@h#3pXGgoFDAzQtUg!MV0+_y$^^gx)AMSf{;#Dv7-Y +zcGp@bVFLkbBtB|1a;x}ee8%^d5@Xe(6^VGNaTh{Keg}$O2YE}|L)7)J{95THdRyK; +zXxkMKRethNQ%wff6>4n_Fl=nuNdVM(I~9=cz{1*;ow`bWFQ7QE9xUuH?_K4+9gLC) +z+Esh*hR@(DPi(JS6L9wHB$1?&PL9{x#BlbMsFdaI2MQoyN`TUYL&~ +z@&fdNr}Urv5GZEVO8zg*1i@X*yw?lD!m?O0g%+v)9SJ2yi!{-ArkzgkKBuVTB%v|B +zx5i;^*(^|j$1xs!4@_5=u!Z?->9^R~Kh2(f1aVSK3ijGjlOnf_=ROMgJOAVl-uXAb +z?+t)V_zQd)mFRfuOqfAYcoN*+sbkOfV+LCABG- +zI+8K~7v#>YoA}uSZlR3-R&D~&QDO#33_Atc2caF+tpZS2JKc|naphg$me0Z!hD~|O +zS#gyCe*N0n^ZfMQLwzs>xb|OCvMrI1k0u6=jvTzE76x-aT6Lrm*FL!{9Fh61@r6V$ +zv5F!NJMFYLpsQ3wTZ#OJw{#oj-SNiq1k?z#0Jib}{`gyUTwP+frP8&|U^iHFP21nN +z9P|sQj<3PWo7>^m1JYr_cl&P@iF?2fu%!n$K=>X;n$*)QS-n8)xc0P-b*e=9i-z4b +zY(l_&qoBGy(BZJQH;#sDW3b&m$h&Kw`J%D=u1@b8z6dv}quhi-Jt&8=fe60UonCj{ +zYG8=OycIWZ!0ThKNDaHeH_?UeQermTi*I7!|jlUf3$3$#;DvRES9G!sIIt*QWE>i9d;ZmsasqF8DH0Wt%!+2L*?J9vszW@Tb+W)p5a +zWObTE-r!0fyIDVR@rtK{zbHSSxE+>TV52;?Yx{jl$fW&%f6AGHJCs$*ZaRrh%=3%< +zE6=i{S?TWBryP})#(#;Q5}4{_;*a-n^pks8V&gIyL!DloVROS}5Vk=GW~HE8gcBVY +zDDpT51(n*rD9}#O5fJU0^sNaaxL>WX>H4c-1ddI_V@s~K-EG<8dfvkjb6n_m +zu2eVSWy^eTvy|U}zk3?#v~fEa(m%mYsgqVS-u2V=OGTOZg-5;+jA#3R90!Bk4^e_QP!{UA!Q8(Rtq2 +z+P|+xbd7s_r6t{wH-TaI_`V>C>UlkevPw|xXsMd4+=WI=L$yw?C#BcNi(O5Uh6EC` +z7o8TVtv#J}OBId7ksIhDgXgo#LTS^-J4bHBg$DTR(Tm>ySM2Ch?1S$xlDc}S0dbP< +z-6ib2x}=wNQiC|6#4#pH8GMvB3^k4Tx=q{AE(L+DF>qK>Q%S-tJZNBTL6;ha;Wj)- +z=g3Zq83UIHzMCg1`n!0LQ4mc@KW5Kx`w>=g@c5hYWh&Ar8+T>R3<|@w|J2BHJ_+j1 +zXvIO@hJ2nwT(a^u&WqU-ho9AcA{9{5LM0wMPw)xA>p%Y+bI|s$eAh8h?q^wM{GMzm +zU}CDLC{GtEBnj!!YXGrqyB;!U$fAPk9BlHB&1|8T$1a1yeJ8lrv|Cz#KK>&fjrk)_ +zljM+1V0`SrCp^KN@lG6$tg|5~C)|xrtc_+5Ek1zhK +z^)si;K)-j9UD*p3vYAhvo}<4tc<_mt$H>c)v~^)L#78|u1}>sy*7HUWvW+GGD*4Y4 +z!8Z~A*@pKC{x(V#)*bsuDLwE5ab0|1U?FdaZxef)5OVN9S*4#LT$F7`X@Fa~gI23eCH2>CCTzs{mrXKM@CGTBBPZc;QHBFaQ +z83X!El +zy2CZtw=LGzPkzV#lfFk7bYN^XrcLNbJ^a!Wp{#m58q<>@kDXi8_U`iG*Nyr3J2l`Z +ze_O1N7oD8jublNV&u0Vbf;CDbu#w-gLDrg904r{k=Tk$%e`7rDRmIL#qu;N(BIWC} +zL2$jr&q!V$c7yBoAKaRc-xg)=MJ%_kN+#$9{RE4VzzcR#jc=^zjCEIjS5ui{?krGO +z8xNu+la>^=O7LppgDH2+umWp+!)?WBN4ZDaI=mZGe;7CLXa`4mF!W`d-_vDy$Oi$dOmol2M?x6H< +z&EPP52cQ3*$B6j>Wpsc?-_3Ey)q#ha#Dc;=9=A^bX4aM>cj>mscJrrL60I3D5!4%d +zhdKh=&8iX-H7=xPgD!f-X9#NF_2cA%+lXrJuWxAej*n{F}5=_Zx9Ora(TeQ(0S!Swi0 +zANk{7md|sOBj@0$Vb@e0p(OUDm$~tAmPu6U=Zz3_wAL6wh?WqNt?XI*ki-zEn}_aA +zL1Jlh|0E<+5h5=6VfAF +z>9;tfj`W8gm<SUC#%%u}3Lnt|)z($-&aRfX&iWR`mF>H4o7cDE +zX)AnpKG2-N=IM9iO}>=_Yf|X@P`#_9y(4h9I$3TEc3(2z8^<=oRoOrsd-=G@E*m@Y +z^Nn@ojfb??_=r_Tx#!f=e+4!1H5%SMJ@4?+Bi@XyH|zEX*F^}u2GE`H?wY$oQR_i)|bL^_J^=IMRm&HNg6c4BO*vN +zGf)2hKfCzLfBKl;SUQr_J3$W7J2N_|Ffg-AON*#@F2BRttAumn%pESl{*oUMJIPrt +zPya<`SRKV3N5oH2tl2oTbVUZ!6XkEQJ98f_%em&VWY@$e +z4n8Xjp0gIZpTnA>SBpREL^LsC5|Eho?WB(u2HYb$!|p>dk9pmRf&*Z(dztum*qKp2 +zI{n7g5|;Y-BwO;d*B*RxJcc%-levP20B@-IwJL&XCq>blu??3UrnHc!Dyx?^a9H~Mq#cst6rI}<+g!e +z|L=GMB-fbQP@f@!T^W;=X2`B)Q;kS_-a0MjJ$94cD}?WHp!cTv*LI?_&10b*?^KUq +z^G8u$@P#V7-Gmp58}rtKtG(|tLyDE{e%-50xpE>30xYJY`Xv|6d@qD~s$!#}2W6Vsz>8F89>p&Z(%C;@O0Z4XGTnX`(~mv+ +zPAgqz|H+xggR;1`fq8<#JZtR&!Ff&pEhw2|o+2w=G-kVN}(guTX +zs7m2YGh@7v)-R&SiP%*Jxf9EO2%j-zN@sML-kC7?UYMuzbU`wTNJq^*F}-_oQ%~m3hL>6_p1TSTqzF~8^?QSy-YY?p0T$0@uSN* +zoX?L=GRjh(SFDe30n5~#EcEQYgL{x)GOvb7COvT94zbi`WT2{MQWb`}R02H8`nrB15H#MMfRe{^i+JKRR3 +zw%Xu&J<~x%yF$;!0XaAtg-5&j^q7dpwpBg##m%-duW!( +ztcJ+k$wrutLwH>c^(MlIfJe9ZGriMRYi8HTh->x4;MHlQ^d`U_KkAl^<)H3~=QI{5D?ZbccyU!rEKlbN7!t@kX2rgBffRo)cK^P1M +zq5*{xWT3R>Jg!Tec4|^Gjr;S7xt`g?Uo$N~r`4x1lRi`-2!N4xx>K-)EsY%Cz#4<0 +zx)mcBf>33aD_x}oEruDb){c9JYNf(aY=KHJA;sr50u0y1L!m1%%Ja2dqpPFG7R+j@ +zx~>w4D5CfiFbpzL`^WVw=RSn8>_^G$ZuH<5rugPTdQlo>lzgLuzy*k6;aC?58YQ@a +z)hnQO$BnhJKx=RZbRyIB`DO7;V&L9IN`03&@(jGEhICl +zly;yBBQiF1WU_9mvg8RI>FgxI91Zi*S#?rP0N%YQ;BxukXlft&;7W0T#Z$%4wHe{` +z5a3}_8eB?fiUW-x+ralg>9o-~iBcyK5>=|?)gh_A@i&6qRUglI0V-MC|fEQp^xaH(WTF3-?;H%|Xn?c5aSN*YEc-d{ +zRl)PYpn+};5bW9$xyDa^AMubjEo7ZMh#LA{=(XGpG-x&t!y5Pawtan6Xh)(|1Uaq= +zuR7Zn38YsXQP8u8YLhDJ-ch8A>Zhs~HvjFMaG#Iac>}-Ne{D~=whL~1jSr-h1Xoh; +z@~=sowX%ZRRqMaHHO^`f1jiOG?mrX#lS;!irgW(N3N4sjaix~?yks9&UtM3Ju4hm) +zXHZ3_v=>{53{7mo&^w{1%C~84XuU$!RY!+};i|}1>B;&gO1CQpX0Q_G$rV#lD=5fy +zdSjd|pZL?nY+|&*w)s!r5j8o>CsHc#mka(PONU9`eG;9hm9P5X$sXS|XJ5K54 +zB8H)&6m{vCL>uucaEs!?qzC^jO+QtXhi++-4Bf(iZjMKwp1xPkzV>$Vx4!KR;0R#u +zxEg=LJX;L&ITI6d$NZ3j4SrnIUC{go&F!Yz-KEA?Ip8X_IHzp}6Z%X_7b#BjLng&5 +z78Nn9W#fWbz4+BT>97nUBhr6KMsnC9&>3qSNBXQ#B9JC6-8VCXwX-VIpDC@gcjOP!&qY?8gbPA_+XqP#&ER}snth< +z`(u-eNT};()97AR#jAa-K^n_{`0%j?dg6K5C2ZriJZ!~0>G)Z$r+0Q8kh*t}sF(ci +zxLPV~=WD9q2R4^m=vJNN8+q}4Q89H?T1F5pZkv^Yw=@*%eu=v>m)2+2ahzJ*x~w^F +z*9a#Vp=P+5e1hvaCs+ygZRN()?^FZfN3GDZE+kkL;-IeZ%XU>t+L%X&HEH;rmf7|( +zH4yB0b8k4+@l~#{ABLZxT*0|NP6#_!1MIlnDXlp(4UV>TS1@X)GF2vlJAfue0$WAJ +zB=c-6JGa}QK*_S-YSj?iA1mhss(w^1i)s3rhceDI6E*RX+r=;Z?mK_xv!C;b*O;M9 +zB1P6cb8K9pRGlngP6#GR+-N*zo}`7bU%W0o&SO5gPXE+2^JuMf6zRg;Lzw~{8so!* +zvI+~go7t@<2baL|^;>4f* +z++OEyAvFFcFS@L^fwcJMl-W9hg)-qhL-@v^zesJ16so08 +z+R*Wj7KazxPV5E_+uFo)Z^2mEZrAxLniZa--^Tb|)djnL#TOz4Zqs>y`RI1=>4`Q3q +zlsy}8Ddg;o^ao&{C-AM5fmuq=8CLtvFng-JKym8u0d+Ftz*ZbG`sP9wI$hQ +z!rhgjSjuYOT1W`|kQinMLzezln(+i@qZa!wKmlrEAyij1F{#+2zDMAhWH7co=#54#*7kj9Rg;&1{! +zY!ZEY>~MNkMmyAjJbKnpJ^)Mz7OZ;XkL*&wbI@;}FJY?F6a5_KAiDAX(a~H6n&k=} +zkU6$_p-T>bq=$mAbFb^7)#lt2RmeM}ydw;iRasRKKBjx40MBho4emxu4Mk}{SkL3! +z0fb`5(1o=+g~V0WNGW(0RCZ3T)v){uU^lhpLtbRGGazLft&Mt;##logT-^qT$ES&7 +z`Yo9i{;u1%n||slhYVZ&nCLcl(fZ8x*Ewms1AUm{uMfF{;7t;xc;iVi-mzt;o=Dv2 +z<=*37Yv^O*b*uwD^qY}qvWcO-5`1%M-Ng(oG}g@E>!7%y<)}SZEn(vrsoh +zdF+6m(Jdi*@oj+L#PWX&WuK#c2-@&A;I{ef)VNwUvi)_EFcd6jZO$;S1%Z_I+j-&#B4M2q|DMUO +zqF!PF$swrx`<9DiI^-N=<=KpoDR;-13sN3@PePktFRj#ruv$U|s*+NiiWb<-T#jA0 +z4Wg+3R(Uz^uyzUVhc)i>P3pJHo~(=bbqPG-Osn(P^c?6b^Fr7h1v2j8%l7#YaRruGC4FD!@e~9 +zeUpUy#s)cRFNwHGjrnfO*mQ{1_wraLlKhN?PhpO0n!+N{;G1%AFAk@{nni`)$es&sTJlP +zr{EUZ0BL742^9)XAg0f8T;?0ZbkMp;Y9y@_4bbBtkuWVpty@1TuU{vPx@{6kkW8hD1sVz=))CjJ^0RGTbiGQ@seoW2<>4=AvY6$her{C8c8|YjekNN0q9lQ +zNzY!r0p-{>(NiU#Wm_n1XBIC_$n1pF3 +zwo(N5zs#9gPPlC)^a#CV&6NC(Qdy#k&@am-RNycF?Aphtg+8765JWif%5uO#NLfyB +zKZAo53Rfx&<0%m=l_HE?H@5^NF8 +zqtV^)R$>ERx_}}Oq|EGTH=Pxd< +z>c9TvPyWI``iEcqkic%*j*tilItkx?@*65aq)t(~Q`@4xA~<#KOXE#cpHth24_c}8 +z`gqhesOiG>m9jwJ#b)eSVVf1%%HPPC(2$?V_Eba-ySq(IH$>0-rT6NJ3Eu1+MxQFK +zAh6;628T`$TAq{}CiF(LdV=9Kfd&c9ef#&ga8o-~j6;#k;N9qT{H~(vK7^(I0Ik|6 +zwkLC4{0>d=gnfZO>gA_t%iXGTDZSH+&lJXNIuWdU`k?F7(?u<$HvKG0U>NUciAe)CbDlmN(HMHgl@9B;viGo3ac`OS4HvSimzAX@pXh +z5PUsNPdNU7XzrrUg_5*_gz_1Kq$PMn%v(V*#%fT^aTZ4X@wBtv{I4JVKyPn%>fVa-vQSctE +z2|*ag;s6Q`a;sOcUrEXgmrL5fQHj +zo9m`w3Ga +z^(VKvq~DoTrd!GtsBaVEIlS3gZW&7)dRH8GBJz4* +z4%!}gN|IU$%=l46Ior3>V3^LUmx41s-P=ey1jW!2>7UX;$`JY>I^i<4Rn40>?Gxv} +z>$KCBHEe1#W=uV8d5Ffo`1#W%BHw)7^?%}TBpkmfyM5-Y7Z)3-wM?1foKQ`_Q96TC +z_X$t^9U$14OyMi^5x#$=I<6=$pzTyc5Xhuj9!EiShi$dlE<%{H-z}F# +z${s&Cy3Hfwe)BjZ)fW%hXPTimlBbR=@brm-ge$}sVy@deg7b7za)exMS=lE&t-KaWg29>V(1EFOipZ%RDs#( +zjbqk$;iBV|J>DLLd|{oGpL0BSfKBfqkBoQSjb(~_PFO>}xmD>Q<=$F#N{L_8;5KVK +zuda$`s{l2q8HRoY?9A~h=4BkJ>?xlpe;&v5`nhLnEkjDTeEAh;7lGZmhri1s>DvWiZ!PXkv?30}1qbZe6!Ml6iLIjoqDH^#21xWW +z5wYh{Lx}#pAONi()

X4eJ-v_S$5Z8qffCK#9M#B3g>+G1O+KOVIK!#|-Rl=}Z7} +zqRzo8PMnnl(A3?7xC>0`j5L|`oQyQn)JulUP&&zIc12bL(3n8`_9!IekflV;vZ^C` +z`2<5d5i~X^&N+-tVl}f(r^{!u7lW$8mmG!;<6g~jGlNHag!x3lO%Gg7ByZLgbZVtZ +zC&0JxSg)byfT9It?Ft!Gkk$dWSY#T(ZY*e_04f1aa%!dcxAfi-L=2)lqlJRAcB>co +z+j4t8U*kv~=IDEC0k8_?TB>GU{tg_!f>-xF^a( +zKp?MARqm;8JV{u24ISKO+dZtpFK$0lo>Ho9mK@?5kdo`7(6yN2xq}S00Z!sa2f{*< +zw7*(TO#*{dRuM+!O3Y5seRF{c6W5+4RHgig82a1zyHR@|xox0K>M|?V?&gSErhs +z6{zU95bsl?s?3;Fj5$p|LlJ5g?Ep%&46GYrQ;iL{SVzi0N4*r3)e{h`+4eRM>LQWX +zQEDm{@dL>M_=;RTVTU8KL?yQg&4~&`^tJfG`F{8eaSDY!~V38-`~F +zaIaa`@OT{DSf0ptWjTB1EP5cZxYf%PU2!V@`kvveA8Sk-@M^lq2m#1oi$-IV@s15Qn4Pd +z3{7xxmM3G?jFvg%EOm8N_&IOAQ!7i08xgl;)S?qTMm;tFwu(%~dW{HxQw!!KG4F?wHDQUi +zn9ds1iI|2`H57|y1SAJfxW}{5mB5#8ixdvOncH0hC^^oAx?97+=iNb4=@sIGLZ_re +z*wAFVGOkh?qQg4xBGOZ!*2P1aAE`1gwLf8KJFikNg#nL}!*sn0?dqakd{=J0D&0!! +zuJC#%!jMNgs|$!P@`ll|%0rG<^&M3uT(W%W9@(g*QK-kEIeHO!?^qrxe==MU +zYJ=kudn^vwSzTI0@f}s5yxn0N`)j1zf+9ID4d6=Pyrzg +zqaLWD8U~IjNG&I(*t}k~X(rp7AZDTPrXWBRYD9SUjgAlM(ltvDv-Ih+aA%X`khrH~ +z%d@#uOUs7nIUD>Vr<62Tlb;JClrz-}|NpN!^kq?lGhwx1;!20NJCXVg7Rp$8T1X1eE&U~zeM +z%AL_xzIysH1LbcLy?4rAFedhrJu8R^V5{MSN_{hB?g&0BL1Y9A#;7Y?v7uc{x_^s*558T8Wx9k(k1j>>-ARH$>--n!^j4Ru;;GZ*E2bT=g +zyQ)y0ToUYU;hIA&i$gH}3sS!I;h{Mbx+at@VGZO{hGqOzGyutGL78pnRxQurM?r~S +zM8+dj1eqAr%Ds3L8M7a$+WgLJExFxTKE(5gU9X{47UC#g-KrDP%P~5#VJZ$~dA<}O +zQQ8{dKj0D$F&W6E9Hd*W)Et)<@lw+o2o|zLj`oVuyO-I_vHp^um?NzyJw7jzw?5)UBVa2?B0fb628s2EYZLETf;9%?T&qg9 +z+mm`~jfXWX+`ASlmk_yZ}Po_|}M_do;9ItXr&+i#ObF0)< +zwtDyvhRDWYYrF0CS}yhYfl5NqunxlY-342+rs^9@ViG0T|AIPVOLJM9dXnJ8c+*zm +zniikeF+*WJ1xyGBQDODdZ?l=MFycimw@^k_Bjo7;VH@i7*c*Avr?w};?Lq~-1ic)l +zPZM**8n4fi=)Cw9IljQTY$7rX0J3$y!SpI5G+me7KW(OvH`AgMBs8zM{PGKD%$VBt +zF66;=&*n!&u!VK}*t)Mtya^I6_3%Q7AN4={$b)y{IwpyLh@E6T-X!e=o0I@BEn}bw +zNs+8$wopr8>g11j%7kgMu*s-l3rWMHy|U6UK3(L58;bNnBPqRtN2en`E1K?dpQ&ov +zz|jUm7kUcOD@|KQX(ha!JUvrVo?&v&zKoL`ivy5qy6V_bWpOjHGO(AAor6Upu#z-+ +zBSOy?74Syi`Vo@HXB%<_g&MUF|-42QT3q~{5RK}sB< +z3qlE`MR!Dp=m@nMp$|ziVpUX27seDq(7(AH<%2D`mt+I{U +z6UsJmgo;JA#8C{bGkyZ4+n(SMxpc^^E~(5B89DUyMv9ty4!AYTXI_D%dY7bixiTrI +z0vEZJr&*blIJmA+mmEMv{$&+tS>QQ7A>jM(=D+gXsxXOB5plmNNq~FRTM;alF;Ntj +zFn%-Ro4IPVY|Y&Pgd&V5(nJwZuQ{vuy6{hD>ZKL_d|hpYeYGw|nwG2_Vx`}WczFVd +zN3>R?L=6*$@j}3xIuwRU`HAiPUcAU_m9Z|D)=0H9sp3qj@DC~?X;td02bH75ww1P^ +zjH`%rNZ~-^!v}@|1eYyP%Rw`1IOqp`Yo*H#d&y^h(uc)3yWJK8+9PIm~5byjKXiFY+9X9p)B2Z +zBFEu_r2gDMoj)U%T^f|liKBe})NowhMS6K1P7w~S^%_4l0kQ?&)_1|5tpO$?-|?vy +z_+f8faS#0b0nkxQWp9ZLQ-!83zvAq+$GlZ}=Gp!Nz03%@C>;$6vn}PtE1|_e*_)TS +z^JkNtUz*DHD?0l~hAbg3rrz2ZQ0#7KB2bfu!e}RlBNjP8PioRHSmj7O5AG|%yg(2CkF38ldju=tAN!=1Sg&2T@C|1DfKNPU^A5D5S)_a)xR}+D? +zg+zo{CUCz}(U#jY$n5nbEks6B^_J?^qjrMlxROtpUK}1GUPT(O*9C~?x24p*YpL6- +z5Arz`hr`s+UkYd^p{O`&)(K;Q+;<=i&f9`eQW4Q=-Ugw|>LFlrnD01MwCXO1D7GN2 +z%Qj>Ad*lbThwJriVsauV-C{Goo$qjoS}~i{_->@6p-DT5t)9xsfRL-P8R-JAL|iwh +zH{s{RwhRhN`J^7(CBs5=UaHm$uT%;DjvtLaV{mYI{rasbh)T@~{Gl!;IM^KQ_B#Nd_wA2j +zG&mxNsj_M%Gk2Mmzr!1Ey#48?pN~%-p5D@~j=Wj_w`|Tyup}M)FIeWll%6A=Y6(U1 +z+%e%CUJ!kQX|dC^N>f|xbqvQLEK2p!P0FC#;Fw{2{$my}i22w^Rxj_V%9?LNW8hAs +zpHO0CpUH7G~fS52g!u +zD*j6gLX$v5EX#bmWw_aSLQ-Y|97TIuj0<*W26p2IV724FURoQcW)x&0& +z$ZgaV{{Rgc^>f5`!%?#*viqb_o^UNO#8D)7!@kG!UVzegT5++qz$;CG(q`dGES6Y(a2E%`~|R=esZUX$5T>z +zYSwC-3n2`s*fApi3^6GYeP_cM2*Y@SiYhxq}>S4ppX-;r@G`aTm|slcQnu +z2C!73;Z%X?(-3rJ4;>K-wUmJkNT_5<28xVZ0*7$+W0t$Qj?>Hb01VEqO`HW?n@g?~ +zcC!UIVI1O?9ghRwx<#dBV(dA>co>{&-H+7X3N;=jg_m@FQn09>NZ+B|DE&QY^Jg0C +z1~3BVv%+v@Xx!herGF`z5Y~$|9Pn_GZCM_=wm2E;c{9sB1h;#Frl~xV;)v7N^LMliY2btXYqh0?mm%Ki!pd{^`%_`oo~^eExk@BGJ-t+s(UhAb%?YI+Cj*>Aq2|w;f8Pxu=oxk>u)GB +z^qDIR>iD1j!tXEm+;5q9q?EZV^JV6RGy~WcE!kAtTbf~&HZX0Puj1CxGekT&n^>b5 +zr3u6i+#590f{V1~>moZlfbT0tkDbkHL#-dFpw+_-v}_-48dRamheqb5lRkr5pd+fJeA?T%$B28 +zcRU%swUxVy%&%0rm&PiJ&yM9^^i#q8m~Pw8kSY+{f~p1MEG&Cu+o~rg9ly|<(ChXO +zmdmv6(vp1c91)@ovz#pV@jijccO*KU#5_1yC4-(28Vzfsnux{*FMj6rjS$I{PR;y79E$T1;q=eWbi*6~+C?G_$5UFDcU<7c91 +z>&@yzlJeeRhNqtNVG#-hWXJnSB<3ABT*|2j@spNy1@!b}g74dI`|IcjW3eqeYE21A +z(@2P63sT@G7!#dHDqb5J1OUP0CycN)rF8;mEVZ>#Ln_TYT3Og^@H@D8f`v$**xV^L +z44^{l^5O^@5Hz`M?yyhKs$;*Sz^GfnJ=&)Wc1~_Ii(nb^K8q7Ts +z4024BMGxZWUUYkm{>l>LIG`CW&DNz>t)1%7tlU4k2~)zDHe7zYW$~Y5(vTE0o>(9a +z9mW!)l+;j*=q0!GR0j9d3MOcjNqq+}$aNg1Aji{|X9lz@k-RO|83nb%h +zbP(J+P9g9N6%pbJK+Pk0j427Xq|O}$&lW7s655V1{IP^Z3OLkPRwnWuL$y?{*XS&# +zexJ>uEEy_O{!zEHeTcBzo}5NVZSkzZo7Ybt=k#ssssOWPYviDLP_`ml9*m(UTw){v +zfiddIk)EIQr^5R!i&8kt6g2sw7=^M`uH +z6C#XJ8&Zr9T$npAgvhTD(@m8^DIy4_0D=p@(WyN#)V*JC%>l3M^38^c*S))48`nj* +z(Q<`t=d&s_;4Oyi70~m4hJFT}3S +z-n43#S5b+FDANvvN)I@;Yxi|`JN16b_zk5t<8@8zvR82_sRJvEyv|C^F7*gxQi!UD0>A76;$%=300EAWodR#r9@aNgts@4(a9Kzl)9I +zcbrc^ySyPn2N=w%!1nE>vge>3tbzwmatczBoC;rOi-xLHvR?%7lMc06h}v8_eg-1` +zuY6Tr8sc@=tul}|$%s)wfrutH3N5r0;WXu`sN%b8`P~qDDXkxp1HSwF2X=nUyZA8O +z@*cFwR3SrpY+_9~rb!l%VUV;Y7}#2zDFh!WY@6bBWQxCyIl?#Wz%~bsxE~F_%Fi*# +z4}Lei(OHTsB+Un&ro4g#g@|BZ5Ms#JFrm?ZY05#d(JQ@vzz}+blnIHUDHOeCD!o?h +zM(Qy%=eW6#MvhE48=YmL{QbYYJmb&K3W5jr(xzx}*U*Q*CB{A!T5EEQ-M8J{JA*sW)W>s6ugETl!IJ7pp?r1^>3 +zOgsg3Ng3~TL@J%zkXjRlkSGmJDV3Hr7G2R&%F_`Ks+=he`U>478V|#Sly&?l{5l2q +zh>4K8@nVp?^};#GAga3GRa>OSl$CtbLt)_i5~Q&qA6uQ5lVb0 +zCBnU|(=%?JE$0WdG9%qsqSE%s1#v8!&@I(%FAh7zn#ik-PdiGYlME!IO1ue=mz)r} +zS_8m>nGWi!XEbFt8qKq(ez;fMcuOi?D7JO== +zON9|5@5q92pfeZ*UvkiP>Cy@ReU=(W;re4%rQW)?&~gh&P?==g3- +zW&{FNli)*$q|T@{TQCPVLry7JUzAbv2&AUruSotY*ci08n-%O|K1-H*h362;2+Eh* +zK5|hsW2PZ5Goo}Fj2jRG(}`-#=%s_p^h +z(d%NYBx&j;SI7;z93VkuTW$N(1LZ@f@&;KQru-vEHdrg-ZX<_pCgu`Sm76fbS6py! +zD6+C>*If?-+b;2D6|4Ia%i_mj4r4;WW|!Up~T6UqvNiO8-vkr^bbH +z_C@R=;ur(;%2Xf|9vs3f8cd_4xFAP)%u-5!TJG@pRkI2{-X#Z +z)OSemQ(+|;h2Pz(>p8r+O0>!(&i368_>GX)<_Kwe4Du%vBfI1vG3p_8CFi=w!ya*& +zqOHDQo+YrfVqx} +zQ9t3*cY+YSFeaC6FovG|1qAV$G->?kkJC|rh2{cxhzKvc^c3~y?z>Mv_Lx_v?r7yT +zxAylB-@NL9Ypz`fBorA8@wXn1LXmoG48BKLPCjMv(MKp +z{LPtXd~bxK1^@ApZ&+~3DR1KMmw({o@_7!C}L%lx?$&pY>+2@`sjowPJ@(^vKP4}Rm~8w}-~+?c4&b!aj5 +zDXwKkHI|pdrwLnW`^n(2I*iljxnjsPd$O_M=1+yE6iou8zLmqo1zJ8R< +zn8b{K^~3@pnxGlj(X01r1dm;U8N*{~Ih|%hgTkWw7~Oe`4_<){US84e#2rz{M<}_0 +zRfG!F-Ad?gh?o3 +z3mh|wiA2x3^56i$Nl1s;@LsfMS{Yt&T#mk^)liL}2C#`9+s23kq&tb2(=S$}2+~9| +zZl*~qC(Do~F5qj9{RE553H)XJAVLWwP4UPemO$8_VKUqhP*Hsh0utL(nH}QkJGJpey +zwRc$eA{8$1$wnif$BM=SXV00HI}|pdUYDdhedbed-fPcY7cYLrqJ?t{w(4ak9l`%S +zZTWHEzG%zOf4=IopSuAd2!8vSm%iqpj1+zG;`8Uuo6~T&AN$w`_$&E&U*D!(X68B4 +zUw*~er<`(pj#kW^IeREd{b{EyyYa?9{^Y-Z`HPjSn;Mzarr-SP>2G`6F>_|`nX~0F +zZ+w05{yX3L4FC7q|NZR)4?Oa<|M;Z|PoY@0C4vt48jt#~esTISZ(N-EtF>!49C_52 +zBJIye0m&(segCATOAnkgd$;VHex$tVC#+t*=DXkj^@^2$%Z6pKT%)GL>Jg1XY>lSb +ze$*S~LbQ(EM+TQic$C7fpG8r14sjyayghGki5P8Yq@4^aLAIt!YJO)Hzzv#Qmgzml +zm!*BWH;szL1$m-=u!ta}VF(hP9*}H>LClz4V8(~3_qVld#g5JiNlXPL(x4WR%l?UW +z2c8HwS{6WhkB(XjQ{bdJ6|@r$--nAmlA=LLDQ2& +zyYzla(_CeGtC$9|9;;LmZN_z_psD(`eEMflJutmN1y>Gqjhd0D%-(mmV+ORHvb?;pl +zFIqUS<*sPPjL9GU=sS-(>Q(Rm!1tbgcDo<^_6>&6C&-OvwELWMj=J#QKGc*a=&{GX +zfxk|C$8SzO^^3)Swe;`>7k%@Six%$J!b!gK#N)<~8%G5AHj}~{+uyXr)s95ILlB?4 +zpG6Dz;je=GU$SHoe;s|~bw(~P#6W65`qmj9m=S0!vP!el@i$<)QpXO9SjQzj(;7+| +z??b2ijQNCQkHI}b7n%|#f} +zm_~v&;fq$LuOF*)C&GBS8r8zwXr23G3K7!itqbIOZ5zj4og%FV?Ij +z&p4bKfh=9SOe@_+^I0QI6$n*eGJBAS?m9u%D4t+t1{~8L?HxA(NQMV!$mLL{tq2&l +z_&<@Z@*?}tlFgth1J`z~#5}aRg|wb47v3Rw_LzuyGoVAlp~SuyX{iR>#=c&;3WRM +z>}n78m&jz1%3PK-Y`=rF1a;ncPN;`^m5lihvh5SKMeZln=v3&GSkx<%@dSGudvFN) +z%VdI}d0^PHDJqCp_PUt!T%|VX!A!>*wq(l@6XcN`p3Z8l%xG;qvxZ$-t$5@30sH7S0#l||##Q+yM6QTPCQUbVZ6S05 +z^?G4&h>V|3HV%PMCsZI(^*kO)k9>>M(4-3tNr+mjMpUM!A$XuB89b5l4sPALJs0Cn +zz2UbPopHvOQl$o)?_RKg8AKCh;lerBto-<4ulqcemX$m?HC-Z-7?MkU&YyoCs%S`EyKi8>LT!4QPSF{2Nc?<)f4 +zx{d(h3>#8<{9)URuVAB>J}pNfUjiK0Eft{EmU!A_RdH#R$MC1$D4jmQ28kL9ywP?@KCHPy+>iHGwuQS$)hC~s}=gd9Cm|6 +zA4cf_!z-lD8zd#Y;PlIQeCn0k83VHHcEj`^+;Xs4d;r?Ag0r^1b(-|B0U)X;6@AU(v4e*$Yo>8F}kD!+yX1 +z^(FJ?FU#L-{=6CAzUZ?fLEc$N4jONkxWA2QN)gKU2vq|c;_tsd+4tqI+>{FPFcRm+ +zW@Zp(zY6VF-K;cQDjaW!;33@}&_Vk3 +zn=biE!@;BQG`til-zU%(7vZGYuwfQC*Lf?@=fd9GT>N^Jq +z8{^>9PFu$CmKDD^|D1D4fefwa$?(&HzzG2p^@zPnyH@1Y}(%W5@9y#}upFDl! +z`H6CEANSzbs}ED=d&R%Ew^+KEnkfdrffO+mpHTBk9i +z#v*MrxVMICOdHYvPD3%xUry2T7V^HPk$0zbN~g5=Fw?udvtPvhQFuezj012&CVH+* +z>W<(~SV=`1n$_n~657lA(O-!|16CkWycxtK5>h?M{r9gcc;3sFz3IE(`!vJfUw-+S +z=bZh9me9wjpoufiIGTp6cP(T#3XznHFaB7&LeVFkbo|n#3$mt*XPFlOg5iOj5lTZIkweXB3Yv#G@=wDsBn(HW|1mU4GgtlmhGx(HwA0@4-S3{yoL^r4gZG_t)@z%> +z5=sEDjgfC&=FZza@E8h$Xtdp3^f~7owP?|THtz7e^Ok3Y(%y3X(zYBzN|^h}OHIyu +zl$95Rp~XgVY+wA*9HmVLN4v`jZ#gV7k4*T7VH4wY^f|#Ccmdg}8d+$@l#V93q0@#C +zJmxuSwjM&Tq4ZGt+3J17_7<5{DT!9&l@K|&g?~sN|Vr=m5INl9o@zj +z>$F%-nI}ZFWYR?*BeycP+>&g}exn3^6Yc0J?OX^BMZ~@u#>@94b4#MCJEc=PWyh5l +z$%2|y?;@2F3WJ_$I83ZT55^OyOG_XUyb#jVPQvkD^<&hB-A1mFWUdD>Z&ZDDJp1L6 +zOKv{n%#&J!m8UHiv-S%=v-!H~|CHt@pEzr+Y=7JB_igJRx@yHAZ@KMhnLkUj{Ob6y +zaq_bL-v7QMvc$i6IpBbOl-h}M&Y)7>#%nj@;na8Mgj$6z;dR%oGMVw8z3{|0z3FvJ +zmK>DzlVguPeBQhn4?hymyqrI8#_JASoPRQF)~>tj?zLB6^ZVQWyun0B{B_2Ak9y^z +z`RWGWeeXjU@q{nraEZCn#5sZQ(0L7uhG6^pwp@3;kYChF-r|?%oOS41j(^Ru#~hj; +z{62ZvD^{$0kVM5?432E`QSUgn9kb)L1>|kpCWtN9da0n~9ACK(J(jLd3at2Ge +zQ#z$nMz7RKZ=KX_&$fwOCAA5jL+l#!N{rN)P}7VQI|V2N9%Vr+#*`Wq%9$dV6o`6j +zyLA#+6b9wob1(Y!ufN?gp@PGp)0UsWUn{R!b>SCQW|^U&A>8%-AKXr0wRUT3P*$v5 +z$6x<9t9nX0uPeqR38 +zm;B(*{PoSRKJl@0Ps#cD(MKMrz;~!|tS5Ob4T)Nva8x7qJ32V`(mHyckua^TD^~dytq3QkLRJ40M92*R8|tEKvhGLoM~p5n?g|3AYqX0AGyEGt=`X +zW41on63T>;1*b=$AQZ92|PrvJ11mJ>&FCI5f}tcEN&ulOHZTV1CY-{P;gt +z{QI}AfxIj^%+M5rLcpeRP%iT)80d{)Q=?@%(*5`azv9!moS*HtV9#`U!PbhIY+0yj +z!b@IB4LG2>6A|C6xC%=3rdugJdc!Zk5E_OZfXVnmnt4&irR@B7Etx2 +z)X#PI#}jFD6p~GRnG^I?EMsvMRW7;Y=2K5Szpro8$S>++=bm!kU0+IsSP~gL0llwS +z*|KG@!N6-uCP1K8AE>;Hs4UF3;rzey@d@Cz$*zCG~3xe?%HPAGx2>T!+DQ&u`92O>i= +zQR^hZqonRvxn(aCGc$ihsa&KoD=qw~zA +z8;JB0vHm%SZid<6k}M-kOz)J69ufAvG7q)2Oz8ZhWx=Kt8 +zzR;oyTRem(uij^2g#2AYF=j;N;DZmy`sz=Ax;Gz>+F-b6?|7Ne>%{*Q~B +zTO+lnBH-9>^LHLYkU3ecG=oo)_FD+@DRVG72?GHUwh0)qROx?*Ds7SId`&xySf|5% +zFe1}duDnSsj18t@z05o`uOgLK6A+*cKhDSwV}P3^0_Wx{34f`kTtfy5PrbQjg;a!_pgRHSJY%8$(L0{t}Ec+2UOPU)1FB>MKiD^;-USi)i60;et(XK6rz4T!Kb +z3N(W?HiWo7tuOnb7F5v>2>L*XVFMMo_3Jmj?y&Pd^5HM%FeQrP?-f5gGX~tSJ@L@Y +zj+Pn&m%+Db1Mg(coISF>dL+-NNF4jVdmqi&^KQFMG5_RPJcsbTZr!6XJDWs8eU`Xe +z3sR5GScC*7+$7@bR1DhZm50{-J?Gn39XKm}qR_+{VCqY+%H+t{{lft6hNh>vD^#Ys +zC+1tvEQLvOstmVKz^wJFX(!Dz680CXmVmwS8T1Uw&5ii`tbQ +z49bcy?iSK0N*zVr!{A1O78o&SK9~Z3<9a(Xv%E-YOL)J6(WPDqJsJg60cFpoOG>Dx9p@Ne{lJ4Z@Kkxp96rHKOSFp +z>B+Hg7cZW_XyHBufdn<;KB&`6+YYkOapg^(dI3KAB8^gv2LiVLE{_ +zHH{LCozTcK7qTqjyJ*llNejW;>2bpZ%BBQBu#uI0>(lj73Y6{CqjyTDbV}QYDjBoz +zgixN%yG`aWp)MGI?Ctna1EH*PKsKQv@kE3Ggh*j1{1D-s6ajB5uD+AMP9|T!{ED;p +z+i#y7t&f~?)){ZQ<8j^KCxiTa7S% +zeH#nfRZg8cDd*eAo_IR13Zi2}!Y8IM_6|oy)j&xx3JIj**%6j4TLyBzoxS(WHjd9Y +zHb&ThJGE0grr=?MmLEy=|M-L^Sf#=ACIqb*08tV~YW-tiJiQ@QB8`IP2+vzd@}b&; +zGB`7*p_s)ckEO0^EtK#BOz4)x)-(0;pkH4aQY&pi{S<=!9F;LMKZ?JBQEdW$qgEa= +zYaNXJOEIhl7(MlCKa`RomXhp+FnaV>o=g36z@0uj4#}L@iGO!Wr@Taq>`9nd^aE06 +z#AbCu>Zs$kK|g~e<~R>wZ?DZ|!1R~#DJke5AyiH?^rMP*8(O;>zWJ^9?Xkx$%a*;V +z_!YkSxFv+7gYVB=@TO0G;(fin-E9oG$u(U}nv0LH%bq-CLe94gZyC|fCr`-vvjw;m +zf!;cvr^ezU$(A@m+=tQ7_lU>J2iHAY^tcdAxq@YuqFfOO)<@b!mw9Q21X5;GZQXOx +z7F~F6rs#D}9w$wSWTQ!;PSVODU5hY^*&sS}V%VM1DKBI2Ejm?3g~?8dgKu;QaU~lt +zUTD_fZ%`dU8O=zVqcqb&KSB})zem=!e*C;EPkz@$lpgnQpS$$N8&?B$ZftuwO&2Dwzy2{!d(pAxHQEl`XxGvd>3Pr`A#YqE&6NE*6sqsOzIBWd$H?;!6^>6Djq5y1>ZpeWeXbKFD^lhwj +z7p9!VR>xZycq5nAT)>+|((aJtDyWS{gm5fj?kt&+;Gt>(cANQm=6+(em=!YyqrC$* +zn6dcKIoc5z2v~#Hg#Dtg9EGv#jcGB3f6@re8lf0qrSVpSW)z$u==c7C++c)Ija(-G +z_;D3E)v&;iu6PmiNS}W~1BXlbMtK{nD^-3ER9`1UUo3_CwwD;*yGSC3e}T++%8EZO +zS3ow)}*w4JJERV`=k|nrSx%Ed-*zIVt)l(f5HT1A;mEH&3BlhQ*7= +z9q@|Y1q*ui+N&~Qf<3O+;ve?+yPGz-Pd!yz`@q1OH3JVkFfcq!B7tTIq)x)6tYGyJ +zeI-mx6H#ecHIOtL#t|997fi**CfRbGvJ*w2LexK$*O}W+oERJs?Tr +zDnO%Cf{c3h6|7UX2F*x`-(j_62s)yiMz#i!3=K_6NoHrF>5l2|d+JpCJi4_xLV?j^oDjSC{Q{l+F(ZtUHg1LP(p(t^2P`a14jIm +zn!D(GaeMKg)IkUBpR>&wAN?JiMZ2*OMHU(j*xAQNez7!e-E#ERqv-iHS4W! +zol-70(d@gr=$qd>mA}6C-Feqvzv){SJ$d`>TV%Q?i(WMv695x}lME4+_$(yz9wDX) +zfj4Y6u|5Zyw2RMC5QmPm_6{zGeu*6Nnapp?6Uov4P26F!VP&VPI^`u_5FJm+oFL`! +zx@-Y)8EV3^DR&!>d~5Em@?6snDmnnnu@56g#6(d~(8xa=ac_nJ$ZE8u@P#qTxN(^Z +zC#zSlU9s|^Rkx_2 +z@V@)=>@XKB*r#w{DZ&{w8b_;GxOqT}O>LcVjD-ix&iUno>z-@F(2T?|*um&*@ui5Q +z8(nVDiR7*nU@UB(u4Vy7JBDB;?9;#Ua5E&DXwt5dHbm{9g}RMLDQeOl2c4)`90(Dj +zHYSPJfwpv<9j<~SI_(C1m8Jdn@A=j@_j=QtQgr$^Y^Xi-(9k1~RJU$(w{I8OjguzY +zQ>NJa?%TC!QO~Sd~ytD&OWe+@?BSr9BAU&iix+GcxHXQ3o?35pCHwo=Ktju*pH^=nK +zn+YmHwQmw35RM>J=6A7&y>?z+Z1Rcc%|CMp-w&;OazuzD5IaYazz^*Un&f*}&X_T& +zSalUTm50~&4Gs=vIm{opX#e^9Oke-_row;=0#|traCRV>7)djFed(JXeDM67A3yW# +zc1Y%ujdW5u7J_Z9G0vf-pNxEibnTIhOvlu-h3r2I$_^TTDx?VMii9yTH>OB;L*f#$ +zPEYKiyW9Hw=l1y6$9A>t@Z73Z_RC*x{nf9xu3FXK*XPDfzl@pQ%$cR*j+^whw@y0d +zm`Oc7{;3{*_@ux5dGU{b{M>mTe|YOQM?Xu<0N+H@Mb!0B{Vg?+x25s7rw<&6t}p`? +zszjk!l$|Cb)5)8{()cj>tq2mmVnHE7^M^Z3z4YZ$c0bBzn^ZTFpY2bEqo&N$Uqw#7 +zN4y!oCz^ApY1)h8AUQnZkk?l`QmOy-)aFu%P#^e_3??`MU+k +z`>ChuANk0WGj~~g>bw7b_0?PZ`j`@<0-+~si5H4DzIF=I7hdrG>%TUg_>T2^?0NSm +zFL>hbf3F2+vwZoke|zAyhreNp4*e>z@YE#*%xKIcn(&(1Ct_j|E{FAzd`#N%;B@3o +zM!j@RB@6zUy!!KG;W=ddUXib+E%M(yeQO+f^YY@oWZQ=Lmj0gylEoL2*I!H)eOM%G +zc1owbgoaGzw1EC<9W#Oy3Gf}_8~Lvc^rDZq17ro7TtcsIe0|MJwn +zbN_b9B^&#<8CobpfQiaH9FDn#qAdF2DwgzA^R0F^Z}z_a_2>4Td(Xdq^sy~ll+HKV +zZMVv*n-4no+`at?00gQm=4ItP*jV6`Uv0oaTYN+t3}&ww!gi^lq>Aay^aocNjf+E7L5?Zu)K5S2aA<(zYlYAvqCk@vSR +zK09a2+x~cO?30`j^6L&;G=JX2)@pIq9@9;qI5bFiZBe^>=%Gw1_KX=*fBU;HHiC9d +zoWj}%9?sw3+<#rZ?(Uyn`mM8%ICO3y5ahQEbBfl)U2YO9MQ3*-sQMK@J7dX`MR_-6 +z1U#k0T^b`Y1W@RPzO;f1qxCCj6c>+HDMpcZ%6<~$3XCRPBA8T`(@&py?KSgyd;QM& +zfBt9d`~?qw?|T~^M?hpvf}=?nOqnO2$o2F^#KCpRfBXlB;CKDkf4$&`UMO7jt-0U* +zj|IWrcH6C+kYp|<8Zb8*mTm}eA@`w$0=O9)?YXtKkso2`7}hi{2Yiqmdo?K=?#Uc> +zFa9if$L(bHTgfp$Cwsin|9sP$^gV3S;QOHS$(vS?`R^4(l>JYSY*XqbZ@iKm@S#q9 +zcgk2VOt|SV$xjwNwIe!q4~diPmuxdcLA08+;CM%U*p&SaO8kumwOgoO`!LkEpfUUB +z?|$#I{H5NnS+nlWJHyE9O*h@S;_5q-o#|yic>jJ2_Fl5&!2B!xpI`pTfc@glh7C_; +z(Y||oyRZNC1)sg}r!wtQ6pqEuJNH=r>l5B`=!_YYa}IRiE9c&F<6pJwr_W&wyXg@l +zD_#$$owh9N+hdP?{qrwebKP~T?z{KlOD?&&$PPdK>67=`YqxJ+^s|Q_i3^@wbL}l( +z{QSrAe?EKm9{jcZ{mb$<`}TkQ_oqL9Rj8U~@RSPU8wP=nSxbXtPT6JVl#`e3zhdPB +z=7&p<*z?^dzwU&$95!Rdl>DE6+!$Pr9`@al7Yps1 +zenc&4Fz72urnfxm$0DxbP1F58Lm_bb!4J;7^in?+*m3Y<=RLz=xBS*p^L{kbPsJmo +z|Mc4?(@G{LVy6BUNH%X~A6Wj#4Zq#|;~&i%H%{a-e)z+?+cr7-!w*#|@YseUHg2rn +zdh4do{@a63JTX9gt4pUA*MU&C!o`uMP*G9Nx8L}%IW*2ER99X3>8q}6v2{tpw-u5Qur;0U +z6tE6E0lb=-e{DQE6s`nf$d$k-3p79m#wzZwX=W|& +z@I^vauH3Y4-Mu&bX5sF;SNP^WUsQes)1Wjc-4=T{EQuI-2Y^h&by5ihK)SRWYPgC>|BZCbg3A}ECX=eB`U@Tq| +zeUfQ#^nhE55%3+GLUc+x@~&r}{f(%m#nzgml>+cowN5neGYhH+5_` +zk>WyA5KW+7;YYe5B%Oc}Y7RO@j1H%|bK8HvJxA&4&i(jh$pQ9{x8FBPhnqWZ@0q(y +zi&Jab=dgIwO?T|DhH=%3>)W!Qi4(?|AygnOalVTc8qspV!r}53%jH-6wq?(tw!+r7 +zAGBT8?qiuXo+K(jGc^y12}48Ro+_CFiP}>6A_xo5hnc5Z)D2IgNLG$p$wC*aZEU?g9g)!7!Yu +zQt(ZuNS`A;4g6y)q0}|PPxM$-C=W# +zNY@0-%@*?5!(qlG<{us6lhMeZp}Gk8E|}sqZd_^QihaAfM2GA+`1TVY|Lb3?20FLH +z97?p2Su(@Y)@*Mx#7<knT_j4=h)6cla9J}`U=j-as4mrf9?%sOqX3Z3* +zjS@NxKlva}$owRtn@%teXCb>P%>(B+>~zFTc0xJqoBn!?kG!Lq{C~TQ{A3RK#bR>R +zBJ%K0eGJ_Ived{USCbV7k)Q2H{(Clg;y00RP5jM|yW}gKJJ2a(v@qY6l2Wj#PgM3W +zL2rvBT$+Oe4f8C+E>NrNp%TQ>a01ZmEJ>K|FHIBMkG#+L(9g5Jz4GTbjNX{;ui8Rb +zcLcFrZo}uEdr?lpXnV`&zVN+v9SdT&zEzOa#%)JZ_~dQ*2iwjl96OkMN1h4ng!?z5 +zvo$p>8)jQ#u3k9FlMDwl2{Md)f9~^CwS-LRW4h5@7>K9{pd$G#JaKDZrfsLAQrjNSnzH` +zi*2$Y1dn}!WAXv~2Pxe%$kc`Y`y1YwF3vslJn6eDtozCH$-x(p6K){?`~>+>m3$b* +zzx+M_gnvHSa9r53j<{)~6Fi>!7mPd^}>e9nk^KLR%6t`HquUb +zxn2ed<4b +zO|rcsf@_#EoR1s?zpTP_qk6p!iR=Y+OVS+RAr+t}w$z4{ND>VvJtNcHv-tDigU6qB +z)(rLc&wjS$M^|hGp%DvFYKpJJ4HUY%Vd>JYBaWyXbWmxZee7L#wMwOMkB)=SJ?CxM +z;M{Z1@U6EE-EzzJ;UVSwDEZCkpTPe6ci($Yy5^4n-;g|i%z(m0Y96Ca!Q8D^tOJNy +z8s%(Eqi1M!)}7j0N<9%woL}}lmMs1^vg?xg=T=21g7ep2$C1~5g*>;K-1$ZFv|r0{FzhV`{fw&Hq9_mOG+&N;CI%neWcm_uU-4-9d|sC2fnutlTjuEuDJTn +zx4!kG?c$$IpPnb-@{4QkIOD9(Job3&f_k%N%`{ehBda5$f!$&`25lcnSFc|4hNC`{ +zLT4J`fgonfv~#0zFCD~RG#(ldJRp(In`Pi4J>UVgSr|nlBn;a1-FStjPLjK!Sap`+ +zN<&c@08_a^XghCu)=)p%?f=9-^WZGM^X)wq)%(R4-GBMl=LuK{ieyrf#ER;B +z{o17Go||>ub<@r}Z#;+Kd+uqQ$Xj5e67Ua?JhJ=aAD?plb-O?R-2AV9W7lcZ%LXqc +zkNy9*zYX?ntYcv0i=kLypk@dVT#;o;m22`LH3H}U5!Dq#xcn-)H2%;1t|aEw7QJ_B +zdpq8q!Js|*NuOn%Esf#2L7?~Y5<}q-TOk<>=QQvPaR&VNhkhw@v){ap(3 +zP8Plm-;!_7f0b31d|eO6&yf1I4$SM6u~@CPo<_@lCuTd>aumYs6&QPQUIEhj9^v477gYu0YK=Gxo7{FR#u +zZohv0mRB9}smm_?=hK#-P-Od+*WC8Mzx?aU|5;~Ka>4nBzwe)po;`cFhA429$}OuN +zdF6p0`s{@#zW@Cv&Y81E3wv0*_MtoPykEfUm3QQK)GMyJW5u<1Tz<*9C%@~2W<%h2 +z{P~{Mcib03@1`v-M>K@A_b%M{`#=BJPi|VV@^3o?QSMy9!Iyc#w5)`r?Pb^t8sSqj +z(FL+CEsdREnxtSD;Rydc;)scd9p*FiKJkg?wroK&&aH8$INW~wm2dj}wB2^In!4=q +z_e@8gBH&J8D$=l&Gm;VaH0bKdU1zwg_fo6sp^KXQZ(b+wLA|FbCCmS@|n +ztBhS0=p|KWjBschGYQ +z6C&e)nA$VqSHATg%>~CSME=<0&)jm$J^be~)Sboi^MKDSgq#-B%xfiTE|ZO9X3}Nf +z7aXzEmLH!0+_(1k58ZeFMD`<|MMXS9yoi_#NHF$`ugA}-@E9) +z@BZ@|#yr`&&kUTx%gdf38g^(^0huXGn`}yZz5xecFcRo~%G)P2epYf(w9=P9v1^X;{?ZL^P{O5mPqu$)V +z=Hbh)yjj#WQ|V&1#b2~!Tcr|z@%CZyB9s?6c43H~hYo+a#PNvBz+;q&K%>8e&A(^N +zyyGRlNiA>YBnD)$RI0Zm4>18gWEAsheLp7d8h!PZn +zEajAM(;r)i<*w%Z91x&U*bL(5o~hB1eR^h2VMInLJi3+|OrAVM_mG6J#P~V&_Ya26 +zO-cpQ=xPjAX6(LsZ`>9Ke33!kdeOff009uEy3T1x*Vc~^f@xZEeztserSS* +zv0^aN#2iWe+Bf>RV2t3bYgW%b%w&UK}pB-+8CAdbP85t@rrj +zUjKI1-!IzOgb6TVJj|YLEnHMu^4jv^#T8@w;n%$8QSEiiN+sNFR!K|gG5x~Ln``~s +z>!HS!g6B;m{8h` +ztwgJi0y4b05{C<9Fr)p_E6A(QB3~FifKeJJQ1Zlm#QWhs^7Dn_->?%tQpB)r-=3Ac +z@K^HZ&yuJ9kh!-#-bfDpGMTBnZFg9xojkoN++gy2;k=`G-Wgg_b +zmrER8aYVup>UC1BvVma%z6Xaq0lurOR!0tuJmI4$e0mU5alcya4GcC_FAKgI5QjTd +zD`fe~xMU>YTaR|>hyjBYYXG4NLkYjWatSJBKJlQv-L$udPdu#NE{o4Y$|bc*>^XG> +zzN-Tqc@NbFhYaw|L7|#^;OGZfKn#IE)j)`GLUfbhTdEZJf@OpP2FmULhH;KRtf3lz +z75E0*1`d+T3VhqPz}^&mjbB&5Wd*)LfN$i8ya@QFC62!h@XgObtm1gQdc_3K1m8wg +z2j?jVcw{7vWmPOZmI}Uo^xP!)b|m=rMge@&1YFJm-?Xr6BhmUYFD>v*)8eT?u3>O~ +z7SR%_x!~Iuw`>V~Qv-baXd594&A|$`+v-QkKXv6#`vXsSpV}eF-!^~K +z(_;;6_XCNmSG(_i_x2~BWJWX}_54r~YQ!ohe+u^8)4J+s)0QmpQ#r@=t{WP56)Z-D +zs(p~E(6i^mR`5c4oqCi6`1WLDN(J8 +z?>pd;bzUC$w&MeDm`)jjFEHS0)WS0O5eH64b;nOKZC65HduhUnI#2*R*7zgk7ZA5U +z2?-UdL+6tdkD0kry0?3IFbE(EYC&Qf$XegcVVYvFPowFP0Q^IuHNg&HZnS5i8VEr$ +zhN&iyg1=jSpwe&p$oB?qI*lR{l9(+lonxE{iOB|}`&k-X@b|uFs%qGqH+#QWv0d4` +zV!w^nvaW;5=*M!rMK#x;WZU6~}_ +zdsLPDi=_7CE2+i*&qQ(-tFC}}QKzeo|!!MA>e@&jgMb{b=2!8WJ%#@xZ_k8Asv(qNP|A^e^W2VoWO%vS6Wliyow8sMa^TE2ww%4~DgUn+}Yp+6Kcb +z80k;gL@ULJxl>~PLvqo2`-i^>It#7kaik9;jA_C*Lbf;{w8@Sh!l`OOGgOR&R~*qC +zrYZcLHfh8hpB;nx0%kJ=qk2tAC_fN>(mSW9jjvv@t?p=_`AC4@hvTtG=;Fl|f2sHV +z{kU~2_HP#t=Y$C`X%g^%(=UaxFl-R9g4d}$eyS+ZybnQx*TDrbjnUIE|LKX6L_y=dHq1TTq0InDFucZ;5!@|fEaIsP^8od +z&^GcR;)TFQ0en9OK29hlT516JU}aRSA!_8!Br%u;;#1gck5+VoQD}Hg+C_(FZ`d;< +zBm}fD%u@Xa>XV_!c$Jk?7X48xz%^)lSpvVX!!AB8rq^^Ued*mS>rmoQ5IujL +z25Q@|c=4p8j+%VgLlr*z6rFU+@q5nYo@iRA_e +zl4OAIFeZcPfg$a-!=kC~3V>UnNP;RiNTe?c4tc170XmyT#k@UMq}(q!|9 +zs(>$DI$k|8wHmIzV@St(*_*=Gx~PR@SD?@0vWh{Hagf^R=(}6y1Xlo_6P5 +z?@;e=zUk>>-uP?&X2ma#J89Y6uYc{X3of`_eRbzu?>qS56fcOyhy3T=cRwrlv+JFA +zof-Rf%a-9OQ@&_^^1~m#^UO0}6a0Di-A{e(YpYhSyicFZ9(Ub!p1J*Fk8S+g*Zy$X +zW&ao3^Y8!g(W8&vPrbkCrib46#*2cl?z-~}2Oqq5@>CBw%fJ|UG7k74dBgX7lDApbYX#s}obmtJyAHrAimg4f_a=b^P+Dvh30)~d +zKp~2>C^p2W1h6~{RYf1tvHL7fP=RL$1blXyiWP)VY#@@L6oo_xRYiJ9zjyciGdsJp +zGh1#+0tEj%u3_)q-MO=~voqhE`ObGxToTJdhHCk$FP*=`>HC +z)=i>hbe^u7N52&h_RB)asnQYhv7a0pdUqy`(k9C9;Cz~cjii3zP`V|j +zx);VZAM#tPC!l@V)*TIT6D2A+jNYgfsw&9DrjOwH`pFeEXWLieK~^*5BRS|=Jm)X+ +zikjEKDzNK8TOxPFXLO`ONVSNGmBd!JD~8bm*v=ux7xxR3zxDQcm#54~l5s$omZ09( +z26ayr?5*>SZE(`SQyhQ-=9=2FxdE8Zk-|1zHN@u!via$TIIOyn=+H +zad|JqGUiqU)kQH{GP12+V@Zwdw8I+^@tMxKkEpK9S3tr%OB@ln$H+2%V~2SWpWG^n +zCGV%{>flka*^BNca8m9GN7gO`y>5&`^a27o%P@qrYGwFAW@Qx;{4Mt0y3ab@tjO?! +z<$K8zJa{lPZ=uzyt)_O+`t;ET4pfH?3l19=7&x%BPoJXH4##TNI@qlF!NG%%E?H7y +z8yXz9W`$=UxIZVSfE~T)q8eqGe9B(hsAqb;#wj(x#r|C}@7&U*gGJ=c&^FmZT#}Mf +zXZmykh%d7pPfcy;x?ko*kat$rvmAMol%C#t-rP~?>216&$>^I_IbZQ}(onb8?Z~_I +zIQn%q+O^pD*vyPT`RhznEJMTdP06u?o2VxxfmRDTqeH(M2OC}^olLGJIoR?f_;2mg +z^b(uSNr#8g`PYRhJi(MU+;-v63aAr;RtefmP7QSq`Q00q+JQBh35ZvbBYl>J|1EM( +zjg<11xo)cGM^eKK$cn$h%DFq!UKnv=BYrGTWs1l+k~~S>lA5f1gCRDVb$*@Tp?fNT +zODHkFtuu64-!%t4-FD9X4<&OalL=rEE2wq|PzbIVVq3_fod9sra2=^L!;Z%KekjXo +zvQ*}B`aarYOtTA;q3e8w;#={Ydj>2Ke5RBjaP>XDY(<-%3@g7{xex6n_2* +z|NIkgUMz}@3PLpFDhWdfl)(fm0ICOu_npOJuTex8Uudbs&hYqhZTezN70n0Wa8?{sRdvE^y4UE2m +zanSWCbm;h8_PU+qO^$;S&-AvH^98$Tlu@b02dSZY-#T>oS9DwmN|tyw<)Rqv`E3{5GfM=itEKu=EJc5Q +zhiYA*e|x6=e3AqGMMU!?Ia4P~Kx-bQn-Yg=wm@|*LYMrT8oxKJrBFixh+8$--WcUt~ahf3`~|pIkww4dndt +zPYF2UCpAEBkW4eq@W_)}wVCz347lHEQ?GdZ&3sWzBZP)^MJc-^7qff|lw}aijiT@g +zho2f2`O&(nocULmr8Vr?)<%FhGjiLG3kGi~p1o*Vc6Hi35tStdvU3=>vB7vZquwF+ +z!M6exA}XnUGb9sS5Nxx8Uh*f3Q5blG9l*wLcC`pC5P@av#Kb|W7{!xVI$_8g+l|lO +z57MUe?Ap2o^8%A{!m_a#1VRWz@aQq`WAvU9n2#WC(!>DYITU=`1JU!ztl9ZmeRt+k +z6(3n&4jeQGk4<#obg-^SF`^AM$x9MX|@q$x8qN58fKf0AVDc?Bh$5TH!( +zH~Fh0`<9-~D6+RXJ-wCwa~m1*CTYfuO#P=DJ5MI(5d58zau(St;XB4nq~DH2S^uFJ +z`nVhp_^gh`PSJiUgklHNZ_)FQ?XXPR1W-1-+Sqprn2;Qb57={NNefU3!kl-|_hXGC +zHCsjj?%QWnQ^pqpS)?S9XSo#}VzLB?>NeGER +za1#U!dtv0F?AWq#Sn7c+_&Kgt&A`+9_p6d*ifzFN+eOgNJr_Ox7~S&o(N904?c33T +z1NiuHdSUhIsBUfL{PU}{Yo}DJ=3024qi2;~lRy42%<##{@unOhmiyz-K9N?*Gc$i5 +zH?E{-dcBbK@-Ecr8I*L6 +z@tn7P#429d43m9HMrXz3i)rF|SXeaz(vFAmO@F_|N +zuwKqOIT1+@CK$vT4MwB+5OttY{WKzh3;340K5*?3v1z=)j;TN9mKJN!z!Hrci%Q|5 +zf-`3EbtG~DmL#`NCVFxmcoltm!SoSPh?Q43y&Wzg>iLSWCqozDkslnEZ^t6H;ce>- +z-tD55g3Dq(i>1F~!eu=p`q0EhwfNTfiFYx+GFA@bo +z8GSFUgy1_o$~2=e7wr#oW}Exb3^Qlt1yk%S54|UUN)&$bEA5S-@ +zk7F5tEXRvpsY!;Nw&9A`8GH-@HBo&#t>~{jbQ&W>G +z?jK2Ix7v +zhWsT@s%|(o3;Es76D1jzN&%Mi#K4NCOKa}Wz}jSOi;^H>vARMvV_V%8@Nm`UJ9>nl8MMatog*&JqOpeu_%eV<>*Dlno +z8S0RV8aGDgor`MMreadmuRaI|4{Cq>u5Q~FT$^3;TW(3i21o|q;L**QBlH=@ppc)h +zdW52k!t%Xf{?=!oy(B%o{^7&LZkIzOorLUgi3D_8#Gtc*iu%1bZ{95#8EwKAYtp2p +zd3gu;&v9*&rAtPNr;+2C%Qlqx*)x?u(a6pC+yr?$IVUVF%UnNX=#`b$?J`8-B#^2h +z=Y;-5lxT9=KWJkKo;VZFCqjBjBoLfz*^{UfWcl$T!PEQo+(OVEw$8UBW_~g$0N+2u +zq)>-Wt0$DV1{j!yWBR}aOL4}hfC&Z%G^Vv +zvR?6F9EW0hHEJ! +z7`1N7LV*gnxm5}*%~LsbIQ8h=aKJUfFGUz2Bjj8~cMp*5=-6o$jHOt@5x{Xo7;M;(#(qEREWZqk!3@&~MtlUhXQ4be4d-k@WU~w| +zMi2rOK`BtSp=t_);E>4MVIDifXM*pbTQx#B2rfmK&&xYTw)UyX>$3MnF!>3)svxn| +zv$KEK5pAvX^ro4azlFXprgk#%KYhlJzcM4E-K0rN1d!dp^%4_&mvO3=nYk%Fy>&)L +z=Sh=3WoVn}d1rgGO0w5&8-h@J&q@cr0|hAl41JxopxDf*BoR(&`-z38T)0~0r3W&pU6+(z@GdVv}fYkAZ+6i~T +z+@I~450h1K%ArJ?Ts4Xyu(J!XCJQOUwx+Qgj9(zOWhdlEZGm*rouC?a~LiMg;m83Nj+HhnFgFJZ)8@d5s=YBf +zHe=PgU}y)FXJOqz2H;qvf`pB}X}E)6Y{r&kVcS9Z^UnY~qfw(cGg7X`of@fJASl@A +zS3raqlP2Oxli;Uyn8R*Up@r+TuxSIdZy!HlTq2T6PH=fpUl;|8ZYUJHaf)Fk-?h6~ +zs8UV8R&#^k$h#)VEuaPSw~ZU$u4j7vC|_0UE6({wa*&EH<4%KQcE +z2>2#wJ3YNcW@Zk1lIcAuy?e%tZ|@%V4y%;u)Bibi=;i6@7fgEYGv|~5NA@bun6Zqh +z4Q|`^l6ZX5bDwx!vS9wIXP^CNCA54Kpqz9r-Rbl+3KmhMXjAh3YpsQe>$E`!)_Z2P +zd=OeO)K&P{N+gFWb?iB_gv4{4XcM +zq^k{3<2Ocbv}#2HodS}!;a|(A5J^mK&OpI-N{LJ_Vdpp`D6o^_5~^#C+{vjzfsV=G +z5&B%gsBg&=;?pow|Ux5RPInahYuHAamCZ~ +z=l{TuWM*#c*MEvr>M^$+VH_{qOZ7=uYH@q0 +ztlIty^;=8-hDbaIk|z@)#0pBAgl^q}?k+?(uSe-`q3Y(t+3-@h!q2dOv=M~~{94>k +z!g&PmF1+G|C}}V_D4LVWk#ea^TcNAw%PufiCV0v-KO4R +znKe)NtiYLV=sd|e3$H+xGDT#HC5Wb*u4GGNPWt^?d>q8bL)9ucsj5P@YDxZTiE)Wl +z;}hcIe11R1K261?0Vpokii)(tLanF}ii=R77^@{%EA@fuSIDOMeL!Paip&$;bVI|- +zt4IyvV1R5W7yva$LspT4R6$%*=tg7IV})z40D#-bp<-Z5t7Klm2NGSzi-v;JH^Wlx +zux1Gek^S#eXjslTKT3$BF)6B6A@}a9mPqd1pIFsbH37%Rk<&B{)Ie#VxTK`8s3gCj +zB)_nJu-sQDOjN! +zX$pY3f~28u%+@!6naXI^pbCK?lm=0N +zY#LTIMKxRx^xQO6Q-hlI@WH1)2)_@<`IY!Mny=qSeuBx%LxAK)D_J9X27@T5lIMX1 +zLKVMT4L~(ld&)2kGu{Sl#rg(d%SQ|eL4<-2KpUqP02bYfwSCj4*8xCm5vIawWzy$m +z|25Cc_4u=)@)Rw{9xqEI#S`7Ct$+etU(bpk05+#){_9u{b_3G2jtqtK-OI0FS(n=Q +z$d>lNsaMTTP%Jfn!(w0ryODEKcn*MlJQ|LkKNk~J%rkw`g_s?TyYtSo-kePl#GylK +zo#f5B7OamwFWUUT=*K{BiZ##l9XeQ}oZUvP+PO!LkT$8&HfdB?zLA}3lIeG2VH1bX?#Zo0n +zos=FyC_WP>uSGdu;Vl6Ted<5ESWCrfk*#x3oG&+aifr)!e_W~C#aMwu%j9A!O0-N0 +z2ZNv@g5rn_Nflx7wy&W&z>&FBZ1$X3Ryz>`p#Og|2|6ntdmziQ8-<0@1fn)0;|jdx +zvM*@FjNO$z;qtcqvb;b>zxdsE`Coi-Z0xu{dZy>uUL_--m&O0qKIcd)s$eZNGE$)&v9ni7u=(joOqpmUJ9ZQvTOwrBCI&@TY +zgPtQPwo5pFnU4{of*!U>>$%XQJqRbE=_qbdo3VFqJNLbzTFHF1^rK+uC&ALs{@ndm +zMRl>*rt5_T>}4A88>F1~`SQ0{teM-gbt6Ia#YLH8?_UcvSn{OUh5jetiMtnl@#230yt{bu +zef&s|9`ymRW0h@%q+`xrz&E2hAORnp^?S&Wi{rqzg +zh_4c8riB%(AdG^=wBsd3ozsfOPbi(gAefb<{q+}=nDOb!&R>6NSy{pP3yQ~2INCXF +z?4zCdpJDy}TH&=YMO1H`8=F}ypy +z8m0WMdE7Xd@()x^52I9k0R24KIC#Ne)O3JL4#7eLyOX~`x8O+RstX1g`y@9O=aS^# +z_(tR4w-2CcqyQ<#OdytGsnTI5>Jbkb?Z)+$EN~~G_`L@vqete0hK7Y;kXQoEmd>DU +z9ak0*G?$z)kH~|NoyUvadSLO>qR&S3y0VkKydX^;A_=2m;5wU~9lO(d|k*d?(Fv-JsK}t_8Qsg +z*>m{v<%TKr(MNkXYa!EtSx9#W6>bGIZy84-6m2S6IO^N<@5c7}#DdrN +ziF+R~SfLP{4;Y)>2iRW@u;%nml@)X03>dY8U~C0whpJEgK+`=w<7^I>NK@DRpsiWM +zFVy4KQ(_p>i6243ty9mlQA44$nqEp;9>wI1@I^h!VY}@%LkI4&&-Y2XEA-W6E^^HC +zQZ>uNE%d6O(1PVS#b$g2G9DpSexb0=d$G;6G?Atf^3~KYCo>9zSjD*UezPR1b7{BS +zW*ThvPXB-B0OZLZ%cD%?Huq8YN+k}peE@wwhJKaxENapp)of1puXq~;^3jgZrEAqv +zwCE<(>}Hhv0o}Ky^RJ^p90LJUTTEz7#4A?RuIHkVbcY%q^e?-}cv +zrOPg*p5XHrEb}GY=#TH?kMDg>y*tWbWrWa|VvKBdS7(HI{5Lhnq;gYzxFB$ +zp$d*IASB93dOB2k8yLY$Pr?}p>GYV*gfyUfq)RVtGicC_B!iGxu6NFZ<-U{0%@ +z;MNsO6_9*YEdELD3r%cYj2360(&IX|h(p&dMD4~Pn}5pAMQG{m22I>*2MTIGmY&Z* +zHpzkH!x`a5AbMTuB=PK6-N#bpO&Uejy4#!H)lm->P!zWgN|B6TAR8EELzor05DS{# +z7XAk0f}SyU&;%UOE(J^*Zb0nbtwB-}9UeYf`2C5fIP4O_(fkW8fo1S14Bv5*lLtY> +z$rS+)y>lE^E7|Z=wHCo$)WY%UR%vDSU^w;jguk7|t}Jc63>jG7gn|W^=M3^!nso$> +zunf8>R}&1+qyrBgJ65`Lr(rgpHZ5uA&NHV@tBOhC|@D1o! +z^}kbV?%Gj*+B74&W5UNAm5U6(w@_` +z5_Coi$${j>?MmIM;aF*YEb~x1xh*5XQV_gE}}+G*TwAgWU_Co;M7DqLnei}g|CyM=jB3?|7 +zw0!wCjC(~4DWYlV5-Y0`g9Zo1zv6xeJSxqV22&nV0T_DNls%#wL7cX5Eb4aC5CY@J +zpL5UMbsZ(a*IxVQufGQLQz)Tg_1^qbnFtBq) +zyjZHdFpB&i#3~rzn*#AL;pL^V#{r0Ro*-zNzK8_KBou(5RtLzY{DH9~0VWE1S;1=r +z+h#aYt@KT9?h)+X(?S`Exx6QL8=1wK29{0tNEZ)7<)TJ%O$Ftts_@OVpEWEs%I{EpUX=(P8Yt$f^+tVJnYIWh5F?(14 +zkZ)?{+rs5wzaL(ItqD7M+qR-PbN4zP0|I_KIEX$n$U9Lb6Zo*rIitrsA2iXMa9r>Y^<`98W@h%-317I@)Qs0N +zdSBNmIoXPTwP{n{`k!;BJpZX_Edh&~u1P}==JN-Po_O-Me~q|v-@b$Ao!i&>D{sua +zw_d%od-dwVkIb4i|M}nr+ojH7X&+B@370+ZRXJ)RQJ7;a^r~c4G{nOG?d-dvS +zT{wHr2Xhy#SZM^I?w`^5jp_eMN=lqPd+w0oQ*D>;`R$|RdJo%PUqwXM0=&ZBoCF|G!w@sVo?Cf5> +zE(2I3w1hor@i*L1wQJXe +zwr%5+lH9Aepg>!{zGUUf!iAq4%gQPMX7I+`y%Jf1Dxi%UTkpaPjo3O9CgiFCx{wK$ +zo!&y~`XXu&*}oDk`bhA?v^XvLmCQli44G;8af09{FKT|<2Q`NeE(mRaKU14eCzBiJ +zSDbd%k;tPvoz%p`vV1?*)BTZP=+Cc14SJ!DkD+tY!esd8Dzx@VwCk%-HL+^E0lsTA +zLh;oNW_c{dQl&~h6&E2)I@3}F`FaEhtogxBYtS!_P1x*RU3F;<=de-Y$Okl*MBqcADVo__yLH`>{JH{Wt4*&cc5jgLNFXN54; +z(};iF;LN1&P2Dc<(zeGH5C6992p?gVE_tj~tH#cg$w9Ia@Xf%F*TVSlyDxtE#rtgs +zNy8v0c|ia4!NVrco&SsdF^zOl#>(j1wd>_=y7hcA=Qqz-XPL{_lWbEOo!6|{nKoG8 +z>5^7#Cq2D`0KRE;^dFGQyccFpUsTSweblIbx|BTQimqK#FYhwSRwQTY-TSg+w-<2G +zpx(WEU)rV1LluF)PbN~qAx*8|2F-28SHRZGEt)1k47zGjO3Ww#7Ddha6%csdSYT^$ +zc#6}~sxu~u0UkAU0KGs$zyJNe|M@44{IY$!j%z?Q%;caj(43uBl9g3LvA=?n&q56v +z_^MUIWFzP1=fm;iuxnRf?_Z^wCXmYwS56T8dkh==WnHR0`J@poaPi`UAAY!3_8+xj +zYo{`a!!!=g%aLQDK*aQsJXxk*f*b-SPBXkJ$L!Qjb4Q%YXtvh^NYSxF!kJ;tBzT%^ +zHJejK!gDW2wJx9@lfDEB*$eklKFJ^7puCT%wn^AjBgLANI+aplDV8cjQa}k(unYmD +zl_*TLibj5PD#Iyu%eS$vD3J*mc?28+-GWOc7I*G_{wjvN=gi8y1dk+JCp@w<{rkY< +z_s#lX){=w2=W|NJ^jAKvqYOAx>0jN~KPj$%)%XEb5^fnW;$t+@wZ!Ud)k+9t1sc7zJ%MSOr6Id_>9;4iFZDB +zWG{xiXU|?#C2>%->VwX#H7NP4!3`P=dH0>A;3Z3o?PBCOT#TI!8@9}vHNQpk3glzu! +zOVWGYv0>w8a&Y2*#x-wdI9-jMFq0fiN=kh42}`QEdza<|@1iAnZQ8rJ+v#MWL$`Yp +z>h@T&^joq|{wAK)Gx4k*NoRE@+wifkv4-*VV*?oSe(SBz8Z@}AY2&*tXffoL0Z;z= +zE48*h^vFNYJ*T>JX7c7+Oa6J+i-~pbt6KY>gqlPD^}uV!gMQ!|KE^)&Xm5tR-+5z6VH;^Y +zdE0*{koUzY_qtZ&tl6L4eA_ch!fn2UJA75{x_^XGwlO2G3{m+6#}^b(_o99`b+CQa +zwrw+`hPz*E`>JPpNAfo>Z+A}aLDy{CwtWEOtH1i{JF-vyl6}4n9z0V#GcRw?tXUto +zXnwnbd+Xcvk3BYxO*Y1kyCH06@yaV7VkJY`aKHQR`!CC3+_-B`H}n8ep6u-c2uP0i +zjyzOrBL78fn4dA@eABI4*XmM_te}AdYksxl*usTJj~+9nORyeb6&oIz8mOReB>nkk +zV9lDs%w+`&KglN>*;(^r;h%d;G#bNF-&lZE2}4_2e&;tzm^b%ApO3ysM~(#V8UAZ| +z>op>#c(jBrIrM3mV&RYl_@xzf0 +zVc@u12pWNA9Q|BK!);`(+B|j0=W;Yly!f>ZlZSlzSMG71&#O-_Lyo|f +z)2FRjwTgN>w`kEYT%>K|--jQ(hG2z#`wq41@Zj798+nPxPWYVR?*aXLh}W@?vt}q%ZF*bUb-o=ONM~U)Ggl88{F-RtCLh20>RTO?S!@jg#0e%YC@Acg +z@u-bqvSRsfD?)0A_vu5?;nb-!hYhpHBr8^KY1iS-eftiOY)9+l2bM;Up~1(}I(K;3 +zg#MGCqYS=PtFxb-`cdQ~)AhZ(lfN&${NDHn-{l84ZT#bw{?8vca3nFY%3Xtc3R;6S +zz4+3?`^J3w;pbcV`O{`+E%R6 +zZyUNQ)~}~er(uI+@nHXq)}$B&8IzKbi58h$i6yR4gE9@Wvwtc7+rDt&iXnq%=jK|r +z`KO;+G=Kh5y@7QId-+pOyR7xT`s(Uct2XdwaoXAp0Xz}5I|K)p%Q>oK+zF7D{M>&w +zGzMjo-i*?wb?at;?*j*n!0D-}iJyOVeqtgvA+l<2L2(0PQvr$e52lWy8h^2BD06f9 +z6wr(fX?5!=OBT02=NyAUK5)<`Gq8?xF(B-Wh1HMEfn5_E_yI)|4Hyi{Um0d@xZ=)? +z@x|TKn#T><_xKvrnbL;8>$F7!enxlhMgx9A&2Ocmgkcjohnz{yzx7vi`!-5eu_15r +zD=h3KX}PN(j6H!^sDG%Vwjo2ZflJnJvo{i`7g#WXBV?Jr +zg{}*S-4Mo({Ak*;h1z&rzy +zIQbGQR_7V7zK-a=1n*+RmpJ$q1n^z3z;*RQAao__r=6~9eQ +zrCj!n8@HaIE@0!vZM5WP)h@GDc=Kj@Q`M>^R#IGD@n^c8U$)C30!46&suQc?i!V07 +z_ucnwU%c38vE92@`{Ij+HEJ-^2|?HaT}hByyA4RqHxqX29zMFCkA8`v0!}u*jL9tM +zroLf=2Jzp1)3#|-ql10=nY@n|?sbqfu)w#$GH(ZmMYQ0q>Wv&Zln3DAay)U@8^IwB +z?Xg7D-qk4c4nr(Q!rvHOG!kX}h-&MEyE+%4E8aze{z7RJL$#N*N%S0YW*ypPQeMjS +zi&2-Ul%3*4-kG#OpXb{TDCASXoplv +zA1f#*mVD{JzQ_z_+&XZL7h`%{+B)z^ivIogo7hgf_67=U(u6{{J$v>>JZu;N(3>=& +zSTiqgr|Wsgj#0OibIy^BvP18kx^Lfsf1KLS&N{o6plsuYs`ZAob=zP1)TksD5_Dvp6!N;`M$LzE~YIV>_PPC)SH&2)Cr +zx;6h6nm4OO=3QiO)%U-gpf2F>q2p$)+5?qWkTK7d(RXGWV>^=OVk0YGblY25q^ +zoM*zz!cX9`;&AcB)mD9fQS;`;%xc!GKOTFW_nbk&+#WQWjedkh@DV*GrPhUnP?wsc +z-oO#JlJguDj|UXRl11n@)Z^j02GR7=Xpbd%RDF-)V2;0U$V6RUL^pklE}KF_;fRTR +z+kU*K&m}qDew=}=#nkozG+;dqc=?az67tS@FIM-lRH@;&4=E)WN>GU(p(5e#MjAh0I#dVBhrS6+JY +ziM}^cM(>7=o5wve8#4z+z+Sf@HjM@i&e841%?|waQ5ee-w$Ds#1LpqyhSz$xE)Bl< +zo-TLHn!Th;my7Dwt$FY8o5)6vy!Y-`qzP`=xZ~Y-vjmG3xQ??-yXNT8LXX)t-WDVfP-5xaNsX43D4OqkF?!Zn+$}X`Yl7AiI-g4O+qp +zk5KB=0Sr|t$HgGbr%kaV1XdSd1(TNrJ#?%FqPV1G$^b53Eyga}yt%MRlOOBVtJ=PO +z^}`1PCfhlFKRPv_vq62t9B;4jQ)! +z#y~*}0V4EQ+>`-T2U6$Y7(1*($m*J1TAkkvA>`U6If+HsG`z4|3r5nCV~OE!lG5L% +z2DZ3rsO`V3uSyQ1AODTc?o1WIS{*lq07ifFl?<-gS +zM84?Iu|@0FjUzGu>jmYe(`b`zl~nAUfty{ykpC4K%vh)gyG=KGu3}QsNnPK6efr`d +zgZmT6PWIoJHP0hTMY%1L-fA%5c{*CXdiS;0K6c-ISNHAPBQcS-pIdJ;IDn5oUOZ*W +zyvhGvS@#n;yrsxuzumuqgt=4etqkIO*1lT>)nDf +zV|s(T?yUX5$UQ&)SYQPi7AE`5RR;q?*zJj6%MRV4W8$kXH|9hak|s{v@zBFt0Ypbk +z?BRrpBYW;4$Rs#yYmBmu;piJA_UwC%6 +z|A$)KK@Zltz&(drrj~5ZyJ*=!9Rn;xU0y;h@3hVdO>;6)0;mkelpNjjB% +zxOPAq!Q!Ky9B|}N{=(O?$mwIBzm_5IryiR%<(W(sBTd12uuSE(*9SxZzU}E>|9au| +z>8k^1E +znA3_Gg-6pFfkH$~jEaiX{sVH>X4U)8Gxhy`nsw*SNo#&+zF@)OmtNlY?Y9L2;ZBUW +zEB9VfW7gWYPkQu`dVTuT=3P~OzB**+uXE)U`iEb(MiEQy>9@J)kMB^6f1)#+qhJBr@g>^1$g1W;zt};x9ekUh{Gh?a +zqypZ{?m`=0MvZ#Yc=AWLp{?_1<fawf`NYS)u6%U=eyZuw<+2My_o#j1hp-Ab2=uS98H$7g9lSvU|NZwTul=!2c2?UPZm^K|H{Tp- +zpSp%dvg8HBV)2w{L3YSG@``N}ZM!--;5cULj(+g{ohk+r#QgPrXy=zw6>>;@_9Zl) +zyuCL*-%?6Bv`PAE|2j%s`EC^2_-YJ!$I@w&7&}l!P{I^msZCl@z(s1%Z=3VW>w>1y +z0}OgCHp7sCAo#5q_**A(%jy<_m7M;6Ft^~>pSEA#>!NBk5*cu1)Z3iRyNpQnd=*vh +zal?0q82$Cv!IYGG_3I}`(syp(u}=rzRhl=ek^9?m>9@e$&C04hg#&EemlWeNP*|Hb +zHBcHSfA8J9KRLN}jT+UW&1&aP8jUwOxlZ%u$vHXuBDrMxYa{iLItNCNojmBS>uK1X +ze!b_+Te5QXZ!-9%jOXgrUBd6}+V!XYqqQ3~thr}TzVx(gQjG4-vphl$M)pu9cC4-d +zoA#mKe?PW<{nqsKj@7GIwL8BGY42Z$l9OxJuV2^IkKw#?De%q7*;TQx9HV_FC)aA$ +zjE0>^X>=Z$P0d@dk=_5id8?j$^4_*>=~T1-fDTLvaqgV#2*J1OBdCzX#7vm5Nk}+y +zB5+S6*?Pri35(3Yt@FULGavRY5_k|TY{p=jT+R&Mc5g!D!9mxIu$N#My!9hKi+)U( +zQ}Wxj-!Odm*^fR_uXb%?m9l;NM6x|MseWEw2{~corox<@;v+|bM~?$g>OG02UJ%LNlcJxZmp`lhL3perKxC7j +z2=&xsrt8X>{`iJkvg4~$F~OTRpabhIXJEyLYPU7KGfR)UGs0sjmQJ&zkN7H+S*7vd +zNx$U7D1^?pAnuJVDO+ssPE8|@iMEj#!cb&HW4q3v!ccmWE*)5KtVm=^H*eWMFt_Wz +zm_j#;AtGD&%9YfPc=_e24E=;Yf7$Zff&wZsFnVM!*Fl^c{K1s$#eghJw=}nqz;}dZ +zlRNMH2hwA#@FQ#2QeE?FuIcJzq=Zf%ez>BbfSSifjk-0G^SgI#F>oM_=JV=nZ|D5B +zf9%7vSlFE>9&-;pbGD039X|T>J7%iCZ+IV5)))-0E5<=(aKcn$w1IQ%J%CzE=OXLJ +zY*f{Cuz37S)ZLVG7P@-$-YB4;|PQQA&3% +zzcx4b5P8hq5ci<&7LjT`Wi7r +zIq1A8-bZ+$J?Sf91M>>uVG+sbO{w}ub~LIJ!d(-M +zpE62h+`b{gtyxkbMtSMqU_g8E#XlRRtef!Q&OiQ;T;@|!5;8JsKl$(abLTYuYH`aS +zR=56fO{?Y0E+8MDdAh+r|5?|Dym##?9)4d=O5^X|e*1SooMfUIYARN#$iNX)G*v-# +zGX=$&bv&qVnkjTh_YDn1L-$ZMAFHMyvQcdoFlxzAE5~$6Ry9m5z~akmU;uiJiGJ5QDh=$!seQ?xGPV;u7M)il> +z*29*`*6jzrUqubKciwTsbI;!H5&{s+B@u}c9|qB~`o6yRh0i}XfCnn!XH1!T>m@o( +zV$&}>T>M2cX5&0-=TRQW`%*>GO&syWoJ{+-?~+! +zPM1&`<7O&UZ)pZ+XVch$H{RG?C!e6roAV-D*4V4R1@(sy?|LG7inVL$93U;N?eO82 +z64-zNt!B==t$TMWL(sT!J@W;GD1(7Vq81kkImC%nBGJ-DAq}V@P`m40IBqIb7##yi +zW5kfRtAd`5a3X5kad8rhJ#zebVA7;L4bRW&bHnDh-`;odU@-DWeC(L|-g|%bx@vu+ +zlvS_2w!5fU6|klz-I^JT2fMF6f_EiHWyucRV35N{B$Dk(|mM^#}%eqT@aQ~xYOU82UiyyE)B6g +zFeRmQoQ_*{IKTg(bh5erjbN~Ls>D?b@fh$DiFb2RCae2XE4|O8KQKRl6o3qqkef8~_(QosQE0+H@Wy+i6 +zOoFste&rFei6@h<#FK4l^ytY=n>I>GX+ZEd*_BDrcvt`7ci;NaC*S1mIK-}+_|nJs4!b2ex%P{bA0`_+_~u*l?;HI(*%|lX +zYfYP+->6Z&JMOriY|bBj^pQ6fe*BY-c7h$N^$yE7YTv%`9d}$yHrJcY%v}4@%ikaw +z){FV9_aAbn-=w{&+fagKY0YNyfT4o?BJ|f9}O8Yt3rB;_uv0|zFjR!GqtAK6|JLzBqR6io*Q_L@c9$Pryw%W%9TXifX}GtO+9an#pYA +znxF=s;UVrb7UcJEXXl%R*Vdt=JTcOj)_oy64d^Gf}-BmZ_Vi +z(qm}P3aU#OOR@BK0pHlC;UJw<1_N~2&gT$N62Z4)G{N>b!1_v}uIde%3A+_WDgYiW +zg=_Kc*?wT|tjx9@o3vRQcAUWL +z?Rmdn*Sl-4UR`W3omnWoQcljk=FR&}pZ-9{j%~Sy2}^m~cdb~lYV#J#vgn`DdDu`I +zQfKbm&sKcBMO^L}djE^pUE4D`xz6N?BYF>b+?qLzpEP{ffX-UQjH>{Si0PIrI2gi$ +z$k5xioFUkYrvXzt;V%LfQKOE$F-Wh8SqL=k*T&CQFZi5Q9yZbK#>ki{wceHe|x# +z18=E8PDdr91SzG@hx|SiABPj-an%GRv5Il;%i%Zl%KnnyxRYBEGbYBfR*^zD{DOUK}TVjCE6?7R%FynM$g=`9@ +zk4r%Ux83Bqn*lX+UZ}2}<0I|Cr}+I;YA`N=Y~&w5Nj{Pbrfg6Y)Sxt=l?0$Phyr9& +zv8pO6FchHEG&NGAK|L5N)tRJvmYw21kddR#!AK}&Aa2t8;J5|Hd^YSWj; +z5h$-={wR%~ay!BG(d+aAB?P{4gmDS|(d`5*hk*rgqJ?GgcTNn)E}fGBLuF-aYzTgW +z<@l(0luCO2vGh?fKU(3}1(gq@4KTkJ05J})ej13Pf#wex?~;if!T1&og;K?uo*S7c +zJZ!5&lG9dik$74j{F>^LQ +zvc7_XZ`GtLssdNuIbpL1HehLu^GQokzI{z@(Tov}!8Vb==9I(Eppp13*eDpkT&N=B +z6g4FH2Dbp2UMFCahVJ<^F$AS~nlpcy=j{OB#`zbbi| +z!81wY*yvA$xNr`P3?5L@rX?Umc8kg~DD`k)I$Htvwgl7or59Zk)WepV2X@49JhA9I +zLVIke%P}Anm9f$mZbWoSlRWAaF+3A{-WGjF1Un#wM#T<#tO#?BNrU8LfK7!OZ!>I} +zlj#fSs=*UoPRJp6;S`3)ZV$I28c2DXNre}~?d^?Rn=X_k8$`WpIc6_*bP!08H4<&t +znp_~U4Ow2`Ab6GPdHT%vNsu}L%Uq4EIG5Ohc~~ZtgJ2`TGSULYG0$;=QSicN=1Z=b +z^G2yAjA^UIKS2TlmP?4a7K*BW*4Pf_Hv+Qn41m3aRz27h88r`Q$CKP3PeA_I={A5* +zX*Eg)&|12^*1z=-ug$yuFHq +zD|$L)1!PLugLd|#EOh6qfh5fF^H*pvfDLO!Oc+hn(c{OjQ5t18D-5DEijZCAL` +zcB>~v(ms}ADV8b?_@=^7C?5ytT0Ic_?b$o|J?w>`n|C-EHGq&!QqYc_O&3gLTUNJ? +z0)nrmfyGVhIdWSx4QEqy+RDo`fD1z)m{uDmFeak{LuFAhN{`tpIG;{LVzsNtUKf|K +z7ltxpACre+kvRY?Be-yyA_8R`=`@P7G_4>zQCgEpDXueD;c~`B0g*yrbHUVvvU$-ekO%Dq^_zSm{~TMg`0<$H-R&@)V{G4@6oVxbIZ5g;4PXku?y={SArGF71n-+WR>VB +zpeRV}35#_i3jfkyRj`m4&)i~BpGs^Kbu%$gLYPq7U@$lxgC`go$QEV>Q`46^i>cxS +zOXjhCtPp}3m%-{0-yl|-nrqWA-h^)!M##6RAbpbtqQfJ8A61bX^_BD{~*_z7R}?u +z4of+X#9YAMegIUCRYs?A1x|5qd^(LEu@p^!GY(rRuF^Z7=fC^6%vE??W*64T~}(Y +zMrgHKENDVVQ@4|;U>4oO<+C#8v}e-CV{63`Vc&|n*0nu@TlmQkXb-$6|00h9ODzP0 +zgyE$mLUY^1oySiB8DVovv*L_LU=>CrqF9}>sdfTLFoA1wAqClQOAFj*o(YbkVlRRd +zxNvp6UMJ+{DI3DbVjC;Go^K@0LvgGUocz8!2DM`;mi|5|s8M;m0M!&hD(yVuyy(3C +z5aX4_K#{45*kpby*xIla&(K6&U?&J5%b!SenKS;wUdjhx`KEX|jAaZ15+1HF3Q%oD3OfBLQHV~Gt^{ExJ +zV*!iLEkxWiqkmw-5-88|gj&G1`B<5OxkOIIvI!L7Xmb>TzPi(+{vVFMQBlJ{sJaN* +zBd&b+BxJdOw?czNF(lr#12PE +z=cHO}!is~Y!lgo3Zaxc(0|)M!C+;^ysKEIixpj-G+w%&|Ul*^!ZUT#u1dp_Nf+EMH +zD3aFeRlI0>2UX~QV=0zm>GV#1>PAys44TH)$Y~$z*BK}%B=`nFcmzZXB>xI5yQ6?a +z6?2HtB(NdjE~~%9PTGlRLkBF|c~B@ACE+f)YmC^4D;v^8Z8`u+6G5@&9$ewu;Cw40 +z+1=AnUy<0`&= +zYrbI~`bZiRMZJr%(>%bgN-k7%M5rFi_h>yi{5Q9Lg)m#n?G=YKV1ulJB+YxmdX$0( +z?8XkThy|S#P>4vkV +z%k^wA;zT}9)={N51&h#}oFAZg7kKv%G^)Hs{$ahIX1s#HBEyT4=9*Msqqf0C)Xyrv +zD$O^r&=`!{5k!(K+KDQRTUch>i~XipIT|>d1Qvf?awCmwZV=s@g6%Vqm?1otV(Bza +zaij@wtQnRWK+@o +zl&Ekbx)GYTVnC+OiRocUVWna$0$|JE^dzrZMsME*r>7o9rCbI(%h{$> +z=qmZgxl*BAZp^uOwT-w3!vG+Hlh6ObORKiia +z(SsB}4g^P207<|XD{R(b;BLiWeDed?2zYhs+rsY8EjzDRTo~c +zk&D(^46@WTG6lb}hsGb+@VBH6?%lSHnRldcQ;E5fY<0T^?> +zA~^;KTq4ssRn#@HaE5HTwr~}IJPVQ{Zi@Z{*u!8372uEQgmq={5;VPs?Yyd3s=&rs +zf%91$aUr~P#6eaPM5b9q4px%JR`sE@T>`=Z*hp@y^?0#cyu7?xEuRLKA{p +zObo_1p__sgE8vbaBZ!1EQxTZk-MH(doqGwHXvIH}zf=D^bL=Ctki$JNco(*NjVL@j@_>MDP77i9JfX2K?=`@N6%7e_Y4QLrjh9n3>^^pKb9YgK2I+EJ +z!MKYF@UZGwXkxrDc4P?_?i4*5Om77`B{zacBFh(Dbg9%NBP$^JX#(a|V&pGQDlL~| +z>7_C6lAhiO`6>XcGA12R&Bc4N^=%ht*Qdr7O0Xnt@Wp+lrVt6Q) +zV(Fx%s`$esgbx=74nYYhC?6#t2q3bLe9msgA7Ts@OurWWmPUpE9dIMd=FP0&8VfRE +zf}`5alAfA#d-FC8T#A^KkTIwmg+aqU)1^YV!zIVxs8O>TuS_4(Ijt2repRoBSFYUU +z?W$%Re)z#_#*e)-DXHpLOIBTT{nUt&4Q7K$kM6B(U-a&C@w|6eS{TZpJD9dwg~4z` +z@Y^tlqm%4#83DvXWg1ZQOU92GNd9i$zS~6JE@+vxjT`^bg?uh7EFLmwV(yl`aXwl* +zpfiW~%79{Gcg9%)9`nS)rZNgQY~Wz{yn>|wZwob#1o=WQTzuZSH3kjrO?KX&`<)Yf +zM_@>^tx88b(F@^<8&(<*m(@UChO5BC$Q@x|NH3#!*lZ)uKdkNC_PbtYb%@|s#Mm^7 +z<1u;7Iz(ftBCxI*)>quBTIO_F6L&=>^kIj2UbFJYa`!FX0$|gKA`(%+@kC4j4d4iY +z3Eu6*S#?mB=ZN8?1qlAzr;pH#bJ6(?QS(?;#8NDsgj55)UlskJ0xDL50RWXk7Qe3Z +zjUv$bHalc+v58m`Aj}tEil4$Q--=~kpD;6nA@3#gv%Z+NZpZS2EN>NQL8M+Z;JnoI +z#)`n;r7;oB-y88@x6xz!CnZ&h06fysqFJ+=GpCPCOS`B%IJH~1w&dUcy|w7!hdz4y +z?O{E8c4*tK+1z(l5a6c)2D{P=vw0(K1-FNAsBY*zK)bwIDnHedTRS +z99(t@GyjEi&#g=LH*MOwY2%)Fzt2!!;1!}^(X|#?_Bo5L#HGH?)ofsbCz9<8I|5r8 +z3?BdoEeR^DUWAIqs0>tcuHxoUMLb0ltg^S9^0c`~idvTZEl!dhcG_^iGy&kj5p5bg +z0;9uRfiuEPYJwTtqT{)HUs?qMkQ7L;J;Ez?sCGz8W*XSpN)C+TgQHk2#GrSee#-f#y_Xi6^KA+3Nd`!edr&>v +zf)HW`OaO{hY+5f6O24~R`!qV|{&?26Zw~(2^hLC+E7@~*uAa9|7s(c6PY^!8S&bKG +z4(_BIy!Y)poSa+}g_0GdhaZ0M>T%=lNJ^@zUvelpxmFo!uvya@jT%w1^2(K)$bJ5} +zW-|fb7hI6SWbQO`q*bs^@(J=mqEI)!DuLr9fFh%5+zC@*QVoktL$9>BXbVHcvg +zr$O0On?(!L6tPp6TJ>Pei#w{P=AaaG6P-lga>YX$JnZ8x=b5K#3ZT-ZXfD}=8r0+} +zP=#fXAmAh%Ux%UuS~sP%$t!+xPEA#*g>jKj)qq;cf_g|a&@>JEG*C1$JSrF<7z6?* +z+JJJf6#s&QXCtM6M*4&J5DvIN#s*D`Ly)MDAJqatRn~)`sS1mwT@_Qqp=LF7(5fj^ +zHn|`OrE!X)YVjor#bo5i$LbZAY>PkReq1s`jaQT+zp4aL6%7|-gBcYhMfYhqs3}#d +z*YQ<7BS^LB13r4QzLKJ2!9YGz{0gWV`RRa~;X{{WUr|XQJ|W?42(D9uaoA68U-c1~ +z6NiHbFLLW8H1K)PVSlDkXjnlv{KOJjuaKD(mN-4QGT%P +zJ#@~;%o!&OE3H2-ElyQ^I(~yw)a?cljz7ca%S1<7sAv9JrFm7gIDirwDW#7o!Kbvi +zL@l6VpNfpz1Lv}@T}H_^>6TSMyEDT*b#UL&SwmJJyVe{Q)dt0E?tQrH^0gBg^8VlKMFami6-fpnyFs~GvopV4`NY5f +zeK$egd3k$ox$V)Pe%|6`gK=*{CjIfIf3zci3kr%q`)muj<1ZJjCm$0NtF*tk2`3+G +zoOQ|O8q2y)3+0#10xE=WfMF6+haW?r(5ysuw!a_xeG!qE@C1fsFZ;v0hy2gf*i +z{CEM_enPS6Ng}~SbeeUoE0Bp#$b{jRfF*Bx%+~+|7AI=ueFiR`WY}JFIAS?r?6}aQ +z$2obJH9|kRlkn>mRR*YtbG&>Fy$TF&&l_Z>2spB}ZJN1>`c +zT8IFH+}E2Ui?y#x!Rp-~mRD7Tc(`Toc>oXgODt8`Td62Mf^u{Sp--q3qsvWDdqLK_=3_0Qw6tk_6}76i!$&Y# +zQhXpt3a|MT?3niI1GgdpT#}utnlofYhl@(0&#$OtE`W;x3dswh__4M4OA#5 +z!Vn88M$UP(j>JJjf2Y|V6(~3~al5&ZNBi#eMvm{7 +zm{euchHVdy`QPfVfA7?-o)=zZ&Oc8*esfwH<%&$1`tF$Vbbf!w?N>)Wd$HIL2=(gK +zp8VagVJp(@+6NvY4i%FElmaAD?{ +z(QmsLj(Sla38r^tfcm89ae)7$`Z?DMC-Xn3o^|HPGQr~N@?ZlQ!jOyCBZSC4EL+<@x +z_^^v#esKgp&KxVP38-%HeqmytQ6mTJ+jr>f`onE{3olH(Ha)#vo7Ro_C0{N1@%vT3 +zJpF8@ZCzpS?pI04r%au5S%T)Egs +zp^RW3C7%*hh}V3_eJB_g@Rbs<;|nAlsT!&m3sk(VSs8A@PB?SD1@o`mfVRETb?APKT?r>1q8&^PH +z1dYrqD6f{B7gV7{N0&8#qOM{@GNX{alweL_t(Hz_^t+)Jb80jPMboYKK1{G7V^mU9 +zj&a0mHH-{KR~UTycFLNTLMkMo?FN`85rS^){fG +z3_`8QSA{$W6f7-P$fS~f5zSbb!ZS~k(Qz(i5xpzw;_3SOs4_1ej2l5_vseb{x)Qs9ak +z(ILt9^NK&-oc;wl;puT-XxOe*;ZPf->Cq?Vko{?Ie7<63o@d_}*_w6RHciOhk|pc- +z?SJ>(1_Hh>Y}Ev8HYT$uHEY$J`Tonc92+&NKjMKqYt*PVZ0M^tvIoJ?TXN>x&L=3G +z;PNxhs5WHqYvS?#13JF=;&=|bS!&a!1=-TmJ73iH9(LrKs~`Py?}y3Bb)I-)*v&UT +z#m{WsJbCEQTPS*-`{}%St0M_$4#HqDdE#g`k+^rvYoQlu!`R$~*xOR1Q)d~loew=? +zM1N;~*Y~-+b6V@Z|9E=Gj-#AJ-Xx{QM<0%3tRbnoEVx{Te!yrOKW9BI!fuv&U3oFt +zE={}O>fSFo;SK@u&g?S!rgy!({pH;r$lbD^4~svof3-~;7mp}%kZc5epGe!Y6y&{p +zX6AANcN9`V1xNS_m#G+$C=z1Vp!7Dn2)K(QVyl8db}$72g=6oB<8Dz7eN*5-`I=)! +zB){+ub2S!yI&^#qF5*qR4qZnsRWQBV)}$hI%`}HPtEwTI+9)$*{r_WJ2WzrHun6|a +z67{t5{TTbGngY0}2^l&wiUA97f~J)agoJ5SKUGJEN*IDZP@L|^1OcgnPct^6N!#c0 +z1mu#!P%;BOF+fib`T}&aplOY9{9h_QOyI4L@?nswn)5DpM}FgOeST2<*l1Uz%qSQr +zWjq)2UD3|KN_FrTgO-R;zT!KAgGi0jaUd%p`Mp9iAyIG@om8O;L@al0N0L8C!~=Z# +zH#7Q->XPXS_)0LN>yR4Jjs>;-0Ush$pYlU*L7tB`KDC5AS%l-UlAvLN5H&aD4bnh@ +z@tTUUUqd`t4d{=|IKcWpGFJ#vvXl=LC`%+Qp!3jVm9#{h4{?5^2Fd(@5^TvYLB0~C +zL?hbm#|s^x`#e}&A;gB*lyDHtE|fd931)9>4FRctBgQB+mFa(^zfJU4c +zw6%q{75uyXW$+g}2*DO*YQzRqL=;CrhJ-O82^nr~?r?^^*Q)xuzM598aS!L* +zbAz&<#bsxoz1L8yR@GbI_kQo&$&vte-Su}}{sUKi@IznfUgqPx8SSS&`4U&$`N!}0 +zr}*KAKm4!e-*e7Ac;M7M7+F`*L*BlwzwYyYeC@j)aoJNIdcW_x=)CVf=in1Q`3Va4 +zKlSqOy7-dQ+Xwpi$3JuR)z@-(bll7*=JTgL?THs%RQtX|-sZ1QfBG-PFTecdzvm$M +z>t6qp@tZGxG2!DUKlzDIed@Qw4`24O7p$$Ve&Gu@{P>T*V$pu}U!M1*2R_i&S-$d3 +z^Tbu2`~$y!>cQ{%W3AC;S~j?Yj?G~ +z_{KNB>lx4Z?`NO&Bj=s-%nR>x#V`HmSDO#dIOCLO{rF>f(kFiQXCCj6_Zxoiz4_V| +z*~%4ie1#bQm>56fb+3P~`O2$a^S6BT{f~M4e|EbyZ}{lxaT~bA*Io5AhrHkLhWAL? +zq1^ypK%u|w=o#0({X-UlfAdTK$M<&r@ai|b^XWhMl5mKp{q)bi!mhqf{rMOCr+DQr +zec2B>!Sn7(j?C>Y;baH*-$|RPA{8wTN!0Aa +zgvHV3oD6JBf31(llBoVcd()xdQio|GmV|Vk$?&3On{_a}Gq12)_xj&F_-278m2sZc +ztTk+R7Usn{=uQ@iGlU{TA5<%VIpRi$&t-#s!^c~g4g4}5)Xtm)KH9aG<{jq8j%BHd +zUP~-%u0<&)RB)yrAjRK}x0p6?M{)wYFy#Q)$j6w263K<6*@Ebh*4j_+2Ds7cV{$6O +zm|OZbusgs-nk9u!4GPyI8$&%Jcy16L)*P&0IH>S%sbkTqtAv9E0#{1!G0QC_CgV~Z +zl5m(>i7EkhVj1ifJca3FicQT;=ah@fQOhKL5l+cZ6&>FHkpm%d{hvksB`Q~?g`vYyD_vX)i +z;b@#cKlp*`Ha51*=a2o)Z^CLNR@tl^zVq;}JntoMxauvAh~`+|&-~HD$KvNNc>eD@{B6K`yk)=p +zyYGMB`~JeB@aMV@ue|a*AOHAAQfA;qFYmwTR^%_V)^o1>K}rI=|1V$t`~PQ-vAdGw +zjy*>^Q|iVFs$zb3h|U8v{X%~0|G(zvp8J+}zVlPwYKO7^b?ra?>7V?idGoE`_TZF9 +z{*FXi`s@4e6YnLmPhU-{kFd~7>U|I;pij78G#e%4Q3o2Fr&_5*Kx-=F=hdG~$a +z_pR+;z5Eq#eb$w4zUJD0ji0>g)gQg~?bMi$e$-{L+3$aUg7qKy$Ui>oimMtO^;NI> +z&=ps__PXm1{kx06ZD$vu1fg>{m`5U`kDi=XH3S&l3vjXap;PN|j_%s0`=P$Y6OWZz +zZYTZ=^8@s-Mf7a9#@_ADZ5)Ua?sjA8rY%8Lhjf3et%pR$Q`N71&Kr!OaD8S+sOuZK +zqx%}R{`^K|iu?7~oVNoLsUHb2qH?sf0jMD6f|NOB#?`2fTuy!$_46^>UK+!xeGs0eSwHDp>-1*iaMb`UPOu=E3` +zp5PP#xKr7pGCKOWI33wYb7GfqcB|E?klO5vs3U+QhEvAxvgG)zevLKx8gDw`J1~*j +zcW&Vb9n<%257)GMx%b4NZ(Xu|5`~s(P4Qb$-$H+v=5vkRVm^rTi2OiEn`o+TWK-aU +z%akA$=!(vfz^$QjE+jS#vk8-Edt}1soR>~V1GU5G%ZwVR??Lsm)8nP-?vkkJcIcmg +zI$BN&Fe?V?#@JpZG{85e#_|>O1mnNKW+nupEt!C)#1Zb_r1f(*e&!BV(_@B+z90>q +z0|cM&szY@~OHPoK$fF)b8igPH(7&X{E=Zaugr6SppbNsl?sIHa!rq(gR8F5aeCf~^ +zzepA>=id9Qc}P#!U3bS9zCho<_r1@GA3os;1nJ)S&JVP||Jv8Q$AR@nfBS{8U7!2h +zSFEpZoPYkguXzpO?-#!Cr);qHtwcB(Tyw`WeD2R(QEvQAx&D#z*k7M{=IK;t`Afe& +zJM0at<}+VCT6U>|n05w;_`ACjGU*@@3?WN&=IKzM{?rXNgnUXo{`Y*h&stn_?MGYv +zV_W^@@~7P2N$9-n75_Uy2L8xz`uz`@56(aD?29hiKgT!%pZFv(qwaB!)9!9A)+avn +zJ&*U{jvo#e`Lgb>0UiFl9a@gyF^RT#va+({zv>H|x5D9=gv{sP+Lxo#v}QOZm97xn +z^n~sV>rICqjO!$~-hlhi6AI~!jNmNJN#py&j!v*Bzkf!^W{Jq$ZohVR4vcIP!C}N2 +zID`y6gy53dDhH08r3=crQ%P76kSo1~tRy&$W@4OUZN{C+2RK>_5SpP%u)aZ32njlv +zM%nNyL1!$^!j;n}lTQ_gnONh<4LZx69SJ6ECF;2#MQ%UjmU2$BidNc+W|{Y#$P!TO +zlQJ{suTg=z9Vd)sf@NSJpuucxOwR%w6LQ2co3qGU+X_((IR^Zi7`A7hLVnOJX5>`y +zJ!aK1Ws_AVk70ROn06FwyOD1%FGnRJTxlc;9MerW-M*1s-9bYK3d1cn=VZXQh~;3) +zBM5NOV~R%`2(GttW;9Mpv1(4HTtCiBk&Ork+AcgrwZ)1F9ZZnLNmxP*M!pl0NwQTE +z7wNS^hjU@bs6wL}rWHAAjwJv+12(JUHW(a!qBZ%P<6=y)UVP#H^DSxN10VQA6%(+p +zzyBC=8GnmHu&vcU;XOs3ysgU@7veGgQS`L&;Rtc(q5yF1_@8W@TzV{MR?tr&Fj2!Yux}>>Izq?s@Yw +z*B@!0<3In)&F;-(zx|SVX3Xn9cZ+S)Gslt+hy<1EOllTsI5XO(!-QGa4yW~h(;;ff2jv;F0X +zA*}s*DmQ}Gpv-L;vww9m%R*c2tRdMyv)o;<_{MJTeT;_i7-_cQ8rQ@TsjIF~H(HHZ +zv-1!*rz-yfiID38|H^IkmPzhQ^JXcV){jSQuT>!VmHk33;N9TQv}3()|JuKSy7mjS +z!{-CNMRimfGzdI>9e&O@eTxx9-W|2|+sr3@cq@bY4QZW(tacU06;K+q%Qb=0lGnyj +zLKh%Vuh`=G$nwvtF^Qb8O^Q2`DoTNT5~$cndM$!h6Lxpzi8M#F +z$|+b-jj50vODkEIA1qV}lP$@3!8gp>Lnwh;%0PNG=4QuilP)VW*Nahn-aRz!n63|o +z>rhpxQBu1=_+CA?pTzaMJA>=2Xo1~HEx0r%GS1amvOHR@3Z|#BwB1wOD9vC{0M)r> +z8mfy~u&yXR=A~KT2t5*Pi|S(4D$$C}JvHx}+P|bENlhZl)3#`w*|Hs}1f>Nd89-)w +zm((03nkCd|gTOh$(o1lFvpAfKn@nX>D&Eyx@eMPiawv6qCn&40Y1JobEvh@cNfi7(er&`1^f{fSR}+JNRKKbaUQFL}xD%$ccoZ(i|Rua~R;k6il}x#!^qxSLO2{3|~* +zZ#b!@l2e1^X-Qg?9fX8@(jW1vVYav(I&|Fq=^@{Ew(ETR_pdpKTnnJHw!p^1k65zj +z6w&y-d^RBRQ%>14Pk`*U+mE^bdi0~ucT34vzxq#ZyN!q?&wJjFD*SVW?|<#9Hpm=UvD5zE@Hv04K^VJ!P2 +z5_LA<2;ev{Y1ed0Gchpay8RP`1Va5n(}bV^Euo;azY~q`XA~hXNp76E0H(CiS(pPp +zd_1{T=GWth9Q|E +zZYkI_r$IW46I;YN0@60wU?M{y+5n~tIYS!6WK<4n)w!2n)W@d +zM6(pwqPknH%yNxl-&859xv+}hY>L??lQw@S9XgIfYX$s`KT~-s--&_p}vVO$E&@#x(nb;*B#K +zz)#SmFVFpY!s8xh{{5GK`CJ3)8MJ-#Eyr%SfdZEQ;Smqj;en~{xiwDb?q6#)&)mPz +z4=3jiJTK8FUiUh0reIL`Rad=t=_J-m{$FCHpLgClSH1Kn8~7S~N6}(9r-!i`_OAr6Uv+!n!q5ZaCTQ!V +zO(&(9Gbk~02L4+B(KEu)RzxY?+CQS1JQddXC-c`$LRXC$pL;CCK}Gx>A$~xY?*4XW +z;oZkQJ9u2~d6ZmmE}QL)I3ghn0_6_1Ks)UL6H-)D2Lw53uOmj=7nn`2Kr6au(Xh5P +zkU^LSx}RJMaS6*8AlNUas?e~Wo7s2su^an7rBG3vo36-_WI_dJ#Yzx718{U<`)F`h +zmc;&bQR`AjHr1z^DLgZO(<3EsmFke18VFSibAH5sFu0&p6LSDToNqoGYPiLX!T7G~ +zZzpLdCwIVBt5d$G%%y2VE`tO-9G;f8;8i0pw%1K{Sb&jmh}IKxL<)3@oawAXVaYLI +zsh&lc`==?zhmH-6N;xMZ(9VIK6cRIZW9R#mBnut+(KLqNDq2B* +zEF5ZD!7VrD?Wy)W_`w(0?EeF%8*k|Q&L#If-#S+DMp_60;lu{N83))wZ=Ik1sh7O! +zRsU!3*{dDxSx!$)W={I@r#Qx_NUwAg0nnlB@& +zxllP5<@CYR{5Mx9xz9_@8m<5pm&5EJ17;P=?Go1<$DXj2XECtNoJpz9lq{1ZE|}~5 +zhOAhh2!q)R(&$FwY;kkFQ$gXjQQ4z#TJ=}};(9wyxtob7V!z$VC_JlxCvlKv>Y&U| +zL3xCd7SgQP4bnWq*^RWYA4yaNafh<)9mMHP3aYk*P3!W+N$P|G;gjwjrBDbM3F*x* +zE9D*^OAthJB8BkjHVkep^ik(d%o2^?z6bS$ayL`Pa#Bx$!`v*_*eXH%jI=w!h1hkA +zW|9ysS@W6YT6-H^9Hzl*1eXq>M+@>uM +zpUFk3Bn=mgJH-GaAgSpKQo$|>GU-(lO2hEweqb3y?c-e2g$?R%vZT0y-`$K~bi7u%n)&Q9XKe!{!QB>Lt7#mv__6M;E#aM=DfZ +zX}QD?F1~P|dwcls@kOH)&=J^U*Sz%~o_)ou&34(P&vbN@M?Uh>U7UlLOOxzc2z=>X +zE#aWqripLoDpJZgVl%|i7m2r(_*DfYwp0Rj7m*{On_F_Q-E^IbiuJXmIT01;>?L|j +zorRo7JEO=j-`#BgB=r)4yG^`#$MG)QJuU?Nl+Gzh4~(bxox+TcmcpqZva8@y69E7f +z$9>kLXLF(0lNkmxkl@SYnC3A^hwZ9gLe3;?=mdG_v`S&%GG|k~uO7)g>wjmuF4?>2 +zp58*aSV`d9Vjj|=F3q#0ba))>)FBa01Cdc2Q%l8fA_U1vP%uMl*=P=J9*}|p=;TY! +z=N<^66dc3t_F?RfrR^&6rW}Qi+^)=VL^Si(M7jC=l4r{yf6HE8{4}SQw*IfH<^X74n{kEU@ +z;m6E)6romi+$bf20KU&Y`}C*}$XQeByKgQ^iBFj9H}-%pf9X~WzQ^Bi{=Pa1D#i}| +zcHMQJrG4fZ`{rqcFWNnydFH7XU9_)W;YYiB$b-G7&-*{{*##kG?fhDab@=RchyLlG +zK5gFZ+qV|7ly^fn_=UFR_SW~4`A<*JvH#_+1s1#_mWU4qF~QVZq1xKetWA2JSrN#f +zrrznQE!&r@6ZP(fNV)DO&9~cspz3rUo_%{&!20i9@;NSa2j^L&o$yB~R=&<+z@N}( +znWgDufSiQ$oJb{^T$0tLna0OxJ_VZ6J7cW$TWRl;0>0M(5r)TGw_^tKm%?H!SA&c? +zWMhQWX!BpPkkuydiS3I7W?Tm^Ihgb0m&oFX9DPzx$=9SVE*QGK#VA}dncJj~wvvYS +z(BzH+-c*XjUGOy0RfP3SD&(7mX$jhCR!SSPHV|jRaEpsf*N}Jb^u-}QfXq?6ERkY6 +zN+3Lde$7tC%aYA$k#<(53btaJwd7iBzNXna@LMH!wc4Pw9q6lWSL7f%wRWneOPXzJ +zs|#yVGvF3vz}HBtvar7H+>NbHP|zkiY?^}$T0d>;Su-b=9V8$>nd(si27POV66l=t +zAvT#>TVQL<2^igd2EccFFi+?pl`2B00Aj9+-&HJAI)w*q0&^!oz3Xj%Wxjmwc?Yk2 +z&EpCvs*NR^h2RczVye)>}+ +z5_iA*Ul7fPYEpw$%-c(zLwf#8;qMQA@S`^H`ArSyo%Yl2SoW`Y#dA|j9anAHu-##O +z5rxKDA$;Y^pL?a#O#J0vyt3oa=y^t!zjgw@b?h%TSNY{H5pVvigQq!KPKCdFV?s%O +zEkWI_LUP*MUw`=e^>qUGKl?L}?VCgc$_K};zVL#%RyFVcz-Qd|pZ&~7f?r}(d;XCh +zezaS*U3cBlS#hjdpx-G>u%;YC?VR`SB_8?FqsIdp>*FO4#ItIG8rwtLtV=#< +z>6A0wkWY!oShE`bPKqOFSk?1wSV^gbq0-LP=$=?k0Y8oPtWrETU{SzJCv~D4x|RnC +zM6Sz(SMnw}mw;n^u^yCYz4Rf?o6t}$SH90w=U%(}4XK=#1PrT7EOnp82?{gY)+=o7 +zqTBRI0^i=B)e}Nt4bkB5f?y3wjyVanY22?!-P-X(fjRbQsH^cDicB-93}Q9V%iI@! +zeE4$eeF&_k;1mt6A{TI0qH_9wq&N>2Uh1hZw+Yl$TnkzPHPM>GvQs&A&DMSw@^7j@q0Md*9kXvCP*l7lg6mnhW$AM1_ +zhN54Hm90z(^8>TMIL3qlS1U?$PrYrem%YNbLqkM0RxYfs?W2?tL{i{;CoV!%bsg25 +zcE-F6(Jtp}Ao!b;lHdh+*B!7g)4CKJ=GL8pc>6TFp;+axW#Bkhd$!Y`!D9y!;V~Fi +zs0pYE)BBX^2;wf=EmqQ@SdvL8S;?PL7F=v91O0VIg#-*st+eS}Xu7xQB4%KcQ>uCu +z+iQ>P-eyl?J=3QtHqGeXjth<%6nBVesn`ZRFe6UqWGgSbkaqJUthBH^HcQ+YlA5~^ +z?T-2to^t~3NmcK9!^i&qZ%8Ejsn7h57r*=aFTMQSDNNJtl#9pDd+m1`2wu`g{P&as +z-dar#NXfz=p>XK-Uwn}l8T{jS{B1qs>n2-U>ZjRX{UvFhTzK()Y*fGAMXZOB;G~i& +zECf$={g+NIzWL4Xw=vh#-gfPapYxo@41f7K&-sqWKmHMnEOorL;8j<>H`wkxZ!W$` +zYqjI%p%?wP-*%^wR9^N3jw<7WTBgJ)oqgd8U!k?cqrUM6e(*nV%lkHs^j%N5@a4bp +zAD{6fkL!sCHX<725N6vE> +zuDkB85C1jY`sY3O^56U)-;-kGxBlS|KmKvwWS2?*v@o?JByXN}`K7Oa{g1c5_tv*P +z|KSfO1)fiQ;&WY48&BAjyc`u|o2Q5Kp|pYhV^?^1o;Y+TMTE_% +zwGfon<#BK=QP@Dj9?gnE9cOG22@YZi2ngDFcD8M-h+4p%zUSl+upQ?pH>|sXSYixw)DH6MaONU(G09uDLEqZ<_cIN+0D! +z0$HPAQuY1M+{F(bb +z@cc(U{!+8CH+NjZum1Sk0`oi48zJ20`Z5R@%u;IxT&#OWk-=-O{WLTJn;3)q_!l4i +z_|HA>=_@PaOYVREm#+V!PWH~ddlfh~v)~;ifJ+RvAN;`eFMs*(J@0wXc+i6`dFAiC +z&}@w_eEj2|dB}r(K>9`hmEK%??R&1d=A-fG&wu_)zx7)$bGAE6ILy1(+yC_Me)#== +z`MAeE;+a4ClxyDp{=fL!&#~YK%%b9XB{Ue-qid#m=99O*9L +z?o%K1zzg)`E!A_>?=b(f&wtZ<{`8#l&pX@v%52TM@QKeq`^vX1QSIvDf`|z*7_)iuauIlD$3ykAIua?0{M+QsL88MpfcGWwEtBcJN#;`e$h4s-Tl`Dva +zF!i--_u3%EUf4=u#S?0q95fO*I0#Y!YgQ@Ph>)SzGG~JYqc{Ybdh}j!VPbuIvi&$an^1;RVFzN(Y^=`leVsd}I=W3iXk?|Nlq)Nvi +zqzK-|UXY>-*Gg9&nYP@_B63GjnI1&3YQQ9_Jz9QJ;4!ck_Ml5)?d&PKe^>}5;6O<$ +z4Tbd^WQ#ki_m0hiu{6?MMNb7XGB%^O*pCsz70f5CfD>9bpXH`E`vp~PHnhSw +z;CM(A)Js1~?iP3T)OW*V +zBF)GJadKXhjdN)pVsG23%JM6pJM@&xe)Ttg&>BlwV5C +zV%<-rN87~T9W|HB2N$BqAY)C}4sS1EZ}F{PJ$B=bUp3$P=7>2Xn*z1vCmSDgNCk +zB3kY#dBO94|LITvg{!Z=w*9ATuYK>I|GBrWeDDAMHETqF$FIETb?Ie)_OrJ|+npBq +zWPyO>^MC2LUG?XyU-_a7?{gZ%?xZp|9||Bzk2aY +z{_u@&`m>(oMw~1Bo$-vV_H@nIjbA?cO_#msjc(xgX&SDL6rwXtIxQ2dVe +zK+T^tb{lCVgGBA&7AWgBnL8K~o>^gu+wKWpf7P)B0bpToJ9jg<>l+y-4T~8VnoYTu +z2>VKA;K!Dn&&v#~myh`}g-EquXj0@G`eFy@95oOdu1SI^^$^7;dHL~j!q~oEhMk>5 +zWG0ggEz{0)vRctnocb&+q{h;^3VlVIWq}k#iYW_WO+3*+?xP|z(0&h4Ih}4t0NRVD +z`60kO*mSpi(K_Nq22=|IzNWXR3%EQ0{21utW<^7aH3sinQRk3GHuC2*e}pxw)aXre@P+sg*(% +z$TTMuTbS_xs2o@iknQ@ex)w=h!Q;->kTOSR58w1P+rX;q1X^!2%f6A^Y^HZ)d6thy +z**KS@%#3&xabVVT!7Q^Th2EN?*(Q#1q|B1pR_Qv#PWP5JI}~ecQcSL7nJ^pArCDX0 +zL(t2~qbZGra+_PdfkwYKO0nz66c6$dy@nk#;d1OzJn+?R_XCfU(sImMnLDRqLESkR +zdTUmx(LvV@uAB9Be621X)0n*w22oDM-fz`_b^;)nxkEO5whav+Y=57}?p8a!YLxA2 +zsCe?&%~*>CxL8{)woA9$|5@81be%1$)C_o!+;zJ#8zegHZ+T3@;m{fRhlKQ<_8Tp>MG{X9W+Gq_`?=~Q^y`1k+TF_)H3t**C +zvIKnw7pIqON;-pDI~oD$017)=p*3GO0Qz`|2afZLC+sfJHwubki{Y`)U6W8KnOKv2 +zY({QvAUr>6Mnf~yTOu{^kw)pGm$nj209#{xTIwybUeRIB;;71>8pBVo6pubMy;+2bD^zsVlmm7Gr#D +zXK8B;Yin7PJJ*+IK%Wny{DfA*a)R>RT}%RUW$t;dRwlxnz~TQm+VlS@F~NK~K5KOf +zBbcng_yniUlkk!@`FA6R>#)-72|g10n$uS};CH +zWdDL&H!}PKkzY2w<0ig;q}Rq-ahgx(GG}^*8JBw50x4VbN-Ar>Rm%s5e=vztza2a>xU^6aVg45-lV0& +zgVB-_)5cjWc+f^MP$e}Q%?|U$*g`p6B^|`Jts#ZWWPhqT5mWq!C$!^YLx8KR>Nk=@ +zT1dZR8QJ)#D$0cVgAaA>uLhb&e?B&OFT*4dJ6Q=qsPmNy@M7Uqh__mgPsGO +zCZ`8jN2|I%QRr4z9Cl5b1-@YyN;0;aJ4jDAxhR7o#s;!z3Iv+V$Yd$C(4{O_3$~AE +zQ=waRHc@TC)<$ZnnFMt@8~rOQr>It~qa+`=SvFQ8VqyzI|g@Yr9eP|yZ&uJYYr6br(O<@2@Z?hUaI)a8RNU&%?z>=rsXDlvQLkW +zY`*y>gKcV89r{T;)xNMu8;I)H8e5z +zoEK*ZSXbf>WaAQ630amDc|(}m0DRgGWOTY`dUU@U-#HQ^vrsEVAx$4J-z?G6vdsnL +zOy0%C1{>LiFXx^msk}j$1z@&OnqQTBA1Dtqm2aA*G@Bk{_W(5OtMv@?8}sRU!S-*l +zJLMRZ;Cw@CVPW>5$qqJPw~Z`fosUteH-jsmhqlf)vk3^(sY|!E3&^`27)g9n9RA?7 +zSW^=2gIeGky0K7WNClWxNDc!-lumpuwezQP!n@I{&c{E&GEaDLn0FNLC}kbcA@0Jn +z(z7aA9=xS;4)b)Aaokv;~smzAaoF-9dpJ=p48d>}IX#BRk>9yM<-DmM#tS*?ECD$Ms_O +za;Wzafz}aWK~hRIMuwhK#V&LLt>AR~&O%oM_Jy~HUwZEA!a=*xz8=_DzB%hx(34Ew +zu}9ISUU_$wbs2izy +zc!FZs7sv(EPAPH8O9habfm`K+r=x2O4hD***CVaES}hycXplFTSjH4LD<_HG$JzAxSly9P2ex1`6KAwkC?L +zSdnkj6buW1MiEX6d}BSjf+4`;fKyGC3Tu%TXlPyjJV5YEX(|bN +z`~``~pj~9b5cEW>!Z{864Q%e&#;pvrkK#HAZm&uQY;VKyG3FiAPF&%5d|_HPg}XMc +z?#M2Bnyq<|I=ZltZ%_J&;cpg-a>=fWvydXdn&6 +zh}6FOlRyD{PuW$(keHa`FgfYT7DO3Q3%5}A@t0#16&AiBhZ +zP4b5^b)PAF_lUsyXv#K-YmolXahAxulk*W>X(CRiw34JE2r8&%pAKS-C6Ps?ys=bT +zJDu(bVWt|63bBW?6=V~?=K7?o}<$C$ti`Xb!l#2P@`AfIUbD}%W~iwsw{lE!N%dn2aMSp#yjqqXIe786-{%$zl$q +zDP&)7z(h(F(YsKx$e{Hk?GX9)>oK&dmsW6){bbK<#B#EL=~*-WA&y +zuEr3L_ejVH8SLx;A0Y?AoN9puC2Bts7OUc+!hFyct$P^)Whinvz1%TLZY;` +zdA4QD#HDbZi6gn#3%EwKhfw*~JI2=MPXgcENh|8)LU2G!!HDQn0%{gQJeZ9n9D8VK`j}`5;_nu8o!@F#Xx7UHRp?nYR5IafZ?_qatYkIKMy-x$~hQtjOb|&dJ)EW!5 +zew%&x%3$-^&>=dZ +z0fPOABXsNWH*4_;xLIwj<^?Y@mIx|WJ=shcoWOS;DidXBbcZ%HYS=o +zn+Ot?E{~R_1%G~7Liv0(VeB}E5f#r-72T{bKQb3Q-{v5A_Zjxd&x8@L#iK6G(Z^@EIurdU5^3Ylou+^`t)pAHNf^RjeDp#m@Jfli7BdM<)&5l +z;F2n0#W2K|?TIc{C?!5SiT{^FqugCR@C5e|{;n7R!C}nRK0vI!18fG0ARW=;4tT>; +zC-sz%VbNqV@FN0jUyG_zS`5{ewtz6205M-u1wj==xM7SoqJV>^RoF1EMu6Rjzl6vs +zz=B6gLs(HX0a(SjW_8LE0Q6Lbd4DEMDc{uh1tvGrCkJ>+`;L}=&0t}yNAn)*md-+Y +znr@W{btG#o<5C(2RJ?B|N*)Uwaao}u)`Tp9QxnR(=9&dDS#3Z#rGzDejSz3Qe)SFn +z^5>u6u^F{w^NZ^Dk+wsJ>+m4Ju6$gm48RUCpYC7xt!uFLF|>o(3pZ&J5{6b3U{(cg +z&0;`x#{;VF7nvcdds@f7Wg&E|vWNJih)w-LY=ylWD;exRd6!mE0nNKVm35wuZeqB` +z9y<2lV8xX6%qTX3hxHaZv4{w&%fx;`o4%`arF&{{Au&uk!V1E=u7aW9(#+msj|Bjp +zfCLnWmgeT1rp!=UOeASrvxZDFl%VqrS;@Dk0XwCPRZ0CKXD%@;FDc$+dHv2u;D}>I>R0QLVS7=2%-H +z?`BMfRwayWG8mnMqkG`SSJ|Fi=bTL?!wC@WgcVwsk~57Xe>$3h63UwmbgVM +zE4|=Tj0NPVN?WnHdQZ7=uYy~!Z4M<$zMh%=<)+i=ui7O?R*n=Ofi8#FT%9I6kd(O9 +zBj5G34-dg}S8nLgW{mYZ89{HpgC2jkE~+M=1&xqkD4~N&;|=N}BI)c3-Yhq+Abdus +zGsZInt|Ibwac+mXbpQt_J(G7rlOt1eO5xpcDEccRW)(@vDM`)A$tQPG8WsbNyWOh +zT3vD$mbniAmF7uT*&Ott;=Bx#OlWun_;GYgnflr-vZy&BK9os}xlawnn?TbnU)0O+zC1 +z?z^;^a8u9sxa>|K(%E_}*5|q|2j;tqzR5l$E+}~C0%C%Rk>yY(12{JjgYPu}n@>xF +zQ%b3t%7FyAEv2+nu)@>|)5n>RR&;MfV$8$fn><=r4nhKV$!_lSFgOn^xvYK%39Ad_ +z3KgMlP|^ymWDGWW@nF!W;hy)X5z96eNGBGkNg%}w5XX2OWMqNjCJ%0>DP5M1wwNhZ +z2!os0sZj1Us|jtIMcjeExDhM3?PgpfKzJL*}T41um;4l+6SI +zs}r)Gj2UmN+|a67QoaE<8J}`}K;b^Cu&07pQ{6X|YCqXtjT@w%lz~|V&^HZsD=p`n +z`xZYWNQG +zz8orJ4dzJ{NcZ{`73gt&+~Z=;xTv($SQNZykQk~%r4@FL$idrK+~Kwqm$P2@gWJt_ +zR|Tdz;%`lj?}#!wF3+rEtzUQuztt))1MA^yAgi>^v}z(uq7#aUC+@IFLiQ@|9BOHk +z2)dhn$gSQ&c%j;7z!1E_JgGR@jh%O8q!(_XS`HCwydqel)qM27Rz!?D;Ut15ujA~L +z@)|DXL*ALG82&ykVxm6tKZot*b&ngo@@nyHPU|%o4D7S6NVx~uE(nU<-a75m(}_F_ +zv>qX7EokSjp=3S3T4HaVu7e=050!-I2*rF1TN!Z%!&Acf=`$#iNf2!XV9FAt6CoekBd#d$~GsDovt3$ +z`QNV|;?psCEpje3Bu)iEVHQS$uh8Ab)H?$^NW|_vDKxh-vs58rT~L*HbjWmgp8|XXQj>lB8hVge`Ai +zcvm?g@;uGzPNf+7JK>xGB@*&edc%rSu2}lL>XpXQIy1{AE+kqTOIja#g*qPm9n5NA +z0%`(fUB6JCha`UX|nDNnVoEO3@50syxF_=ZLc0!9!^1zd$mE{1uGK|L_ERIPGz$_XCN#tGy7`P8b5-e@SY{)__E6w^Tz11 +zC#2?UJ|B3E?|A@zchCQ +zbFlyW9@Uv4-YRqrO=X(~>u{ldSns!p!>5g?=em8ku>Zvz$p^N0!P<77N;mWAyHf^~ +zdpSQYnKi^t6E0lq1A+-8i#$!jRBb^C2>J^`!6_6*ha)Z=K94@BtNf8j+HB;BCawB} +z@>xV-I-9abO7S;je5h6^_Gr(=>xy{(mz$qCA9EO^r!ab} +zd95v_od_g_)vwT}YqKCI5XBbATZDmcl4t{9!=yBeY%+dah&@ba){`feNT$6WoXHMQ +zCY&ophagvrVDXh$(Bu5$h~wE>A2*srPs${L*4v#?NP7hA*hN?rW)Z^11;Kd$ +zxUi}K*|CyClPDfg2$sQD%u>YM6G7o^iQIg2quBE4B{t?LXAU)dIP}ZvE;C-@I-;1! +z_V(ct@*qCxX;BRqB*kB#gIR*}|FYLGeW1-lt3;J=AEb_fYKMVET&;PkQj$DLWCvsTJEleJuGxt7 +z0CMaQycLdX*(dIJ&)H673tBY}cZYd;x$46ceLg2B_Onprd!Vgm#=kp5(Yhx_J~Tdc +zZi8nS52TWoY#+VxxlSk|&>w}x!NB&+&^T;AC$)=-ov-y54Nl&g-80nK`PDlW +z+mq*1rb6J)W%s=c_gXuFN>08P%4Yb~XY$KN$DuF~v+S}CqURiDuH +z(x&%jW&y^nya}2G5>XXY`V^b{vWZ0EUur?^>V1`2r=63nvT}Mm@PbRQX6KR#spT!S +zLSy6sD{{#s&dQC*&Z(qUSr&=5I;ktbz>}|e7D9++`q-}%QuFdbt*BKBf-2Z;A)1BV +z5VV>-aXZD|_CZff4C});H1*{cQ5&>z;K(yZXwZ;ODnrRB_kct^7Z_o5hePMtB)Q?#|08nmyf<9N-;;6uc1^)#p8htGb5 +z{*s8iNA33L@>G%UgLe)@1{Ak>J&uX>Ut)flSc@-hMU*@lb!X6Rp>{~qKYc3EGc7ZR +zK?5v)ndyPI$qQdNY&>`NVEbrk{^rH`P8$}X==aHn49v3F^XK+&dnoTc2JfwBzF{y4 +zv({rcYo!EDze&bgpUhKJxKvzWuKtF*d$?V|{q-~!lr#+UF|$>1$PI*|QZzy&4EBPQ +z=zKv0jiS&ZK@sV91aKTEQasXliw!|#b$ZeOfFZ9+f=ERn301+wo{gPU1enuk#2O8@ +z=Rm4xesmOMQm9s@YOHv#Y9jfn%pb50x3j`<%Cas{lvh>#ozJbE#AU44UP#2%hfSLP0 +zApu1;x)WSj*&W^FAUoZY!0++!?f^2-8EEs#uS$g^Fo_^ZkomP)%K6sb +zmy+>N0?Sj)6P{EKR1!GNo9txQeFjE{ic6RFOQPn1!4gU}J@X{2(%eIY+t*&ln$LF( +zZ!ET3@IooR%WJH(Q?Ltu4VM^p&$zubq@fT@w6&|m4i?1Ui&k?6rJle8L8xCWvh?8& +zCxfy3L0zQ;n}QgP+k}1EDvjpq6+eN_QDZ=HZ%FL~I;2S2=9)0a%A*0P^>FXSj<9{( +zfD>%Br4B*UPE*j-9GN8*lNjWu8h-EX=U{-ff_-u&$w6@tI^$f=@|@rsaC=n^^J4dU +zZf{4jI&PkvFt*D08e*ocgNdY(R1iZ|>HP+x7`($XPQgI~c}p^L2MnA(iv=-bqJ;7w +z8ptbep*l+v{U~RRD)x^Bj0hwsddIo4e)2Q}pajfpQKCxktT{z9q))*{9cgy4+T_J5 +z8*Mxl*T16n-mF$wjvH)Z>9-^$M^M?X8K`Ct4PqV(1*NdlQpwHvE0V55gS(YPJ87po0T9C2}lbfvE0=`vLtw`foP-MA%9QENZAl9 +zrvO<%roZ=Gac+6YOoDgZ#9$1L5bt$sn6~?)S~I#3otd+;nTk};XSd?sME-!h;HD|g +z7jTx&J~LXKwYA40(7w%w3YxkkEUsFxmcYQ2 +zd6FbiTuH8HPuEE-+&_QVk}}+8cZvSO(33jHd0Mzj^8{uQAr`{H%e&1l8#rIOyLASD +zJI&)=LHc`@;FG$JBFYA{ +zR#Ul?VAznzn!8Ik(a_299=5lDmBpDnv-X}NS&k-rvclNyIKHEtuuKAjoq7(DqU>hb +zaoom1SAplA@7wbt!DpxZ&D{x5a89AZ1e+A5=V`^3vHY;1^pc*MgIL}ZM$;{QL~@zs +zrcWA-FPS{7rpIB+LRkZCGKx+QNx1r8Mtzyw2z7_|Iw%iTA9<>Ph0B%EI;)wdK%=q@ +zs)%t46)~FgM7BY*UeSlcA-qB8ksYiS{E?Ti9Q^Q{#~?MRJmH(}r~5EjHjvIYcRJs( +z?9#6is?hB2y6r4>ux1HJRQO9YYMQ~mdYeOCb5Ju^pNh0%Ntxe3_Ld?9zXinLH$qyJ +z7K&LhQ80heE9x8V +z)&L)qEb}#fMLwE;xzsAaYk!moY(^p%G?b@%xz;J4Tg{_hg4GZ^V;eLKs#xQ*_A|^8 +zcX1&V&R-3ZOd4|qb9K(?D-_Snd3SKp-m*aNTyX!}e|UEFa6L6a6I$<$4MbtUCSF>`^Zhs+h3SNivtl&KwpNgTNoTiEs-Na?_q;>BY7FNc0@BVVEWhGT +zWK&)4VLI%O+#vB331?&SwKm45tbv4cW80k^dli$ +zdcrLK?qJ1XN)I?=`Fw!=+X22Y#oy>9slv42D(Hgb55@>3Ryu%C`G-3qcxo|Np~5I5 +z2MOSAstvLfgFuAc04e9YX6e(3cv{kMb7uW&vr0ns_K|Oo!tFv3U3l9*%G_G*2!h~H +zxm{Lj9(Vt+Oaq%@+rpxEUD!e;mY%JhJ&_N5+ssBFDOIxQ^q;9{cP(!MaTe*QGV^(u +z*ufmbzA1&;+#kRW_>T6p%VK-28M($P(|=oGyb}lBm-FkMa}dB5H+mteZf7lHUxPGC +zFdOBVb7JncxMAlu|F!F-?j39|Wd3jLb@IV?{bkUm0pFvf@Xu8aDiE+AFeBgXelSh` +zNRr7-ji(lxGjZpl=aUisR@|;@r^reijOIcEv>Cjv=*+ju$HM5Q)#78MK0oTcYEp;b +zad{`D{)v=Fi`xNr*uu^v!kSU1ruDDe@QJks6Jm27ARpVUR +z+&Yk@bP&TeTSoD352faAv2Gr~N$O1$O+FRj!V-^X(}Isj(`+-Fn0tC-A=U}@umPIf +zg5aC9*-dLJI85SwdXHr#Vdn~*Q}m7rF4sg(ca51Pnzba-I_(q6+-}q*>ZQTALcvOQ +zKdzZnUzV~cDVCm*&WSkzc^ht8bsNjbwyQ0+klIPJQYPRVOamr5#5sJ0b0{mc{DBzx +zj+}1*NY#+js5WnDQ^fAol>LTk6Apscb``;Ta7(PEIOi=fMwXhPdqF#eq1w`+Nae9) +z5>K$9?m+k!&hSz&9*a%^dRQ_iBC7~Xx;GBZ7b)d`7LsI94lo#lR>CJ3Y*At}?t<>H6~QZj1A+g$9Zf +za7R1v-2v?0ouR)sB>@-#NF5=F%|#lFIFfusI^U}Irh9cW129H~UM+03Bu75?IndBX +zoMp0=q*U>QNYglw5q1G@=acMX;H2Nj4P5@FZ2U2KtTfYz7A;H`>UYhxaY+$p?ahOI +zElXL(BcP=xoCzXhTG6Etd4QPbRQ*YAlHk={)(sTYkk2!>+Hg1l1s2RHX-wB4nY?&3 +zEKFsb!ATFt;JsjUmga>3$@7A70h()lgXIo^);stF+Bv*L+#r)uz6K<(j@@6gtF#p% +zh4T1=)2Y6<=A=lHsbNG`_YF@Q~OHcv?6% +z)y$V1ntU*ge1|GJALoxIBbB#&2xkVt6RTzv=mX8F%8+hv6f4*D2c;BP6qRUGbJ=v!3mwLw}3KCw~pus$q(x1(&N4kGoORHU3`__f!5k- +zcvrgB2x)7~bgfGr(FbhaJFl(%23y@;)$a(@D{~t4l&s|~uR`ytsiV|mUCAN=RHJ*= +z`(1M}1K4PUM)p~yhKSZlW4MA-*DqmaUShEqXJuD&4WNt$nY9eDyNqg=0;~<7Ptm_RPxC{ +zPS?PBZ4fXs;FgUwt{O0GP^sc5#FQ6|;F9_En6$sC`jg6noQQ*&+36$mZK2)xXyeFZ +zgV@i?Z+#Fy&YG8%H!=|TbwT5hk?h`BP9TPc8$Vf$sX_He* +zqP);@ka9P&FrVSXbPQ!0-*$)`Vax2)iDznCcEH5^kF~ihMZ}hk^I*iveG_ɌM +zoNQecD{d0&Y+{|2*gn$^po^IkH=h-50_RStE5+-C?1~k#N#oNZ(HyKf&cyOd?222r +zHs0Jo_>Fr`HPm!b+Lo7)j&U%bVO|0_{c2SQ$~z%RNB*{hBnc-GLUiszj`i+C;BFlf +ztQ-O0Yl}sYgt@Uts{#9?Xg+hGE9{LSQ0=(17_uc+97r&cl5-+Iq-k}Tt_D4$rOLx3 +zeWs%?CH)Lw31;^0h4e!XGP&3x&r$E0^n8M-S7mR=Gj!He#X;UeT)5n#G7ieJGCl +zA!$^bmiPodHohg>Csh8In;W17X`D1xR!;iQU<3p3vyqS@)`ggfSd}FUU{}+WQ|<>j +z%CbV0nTErt4wr>pHd%s+HWRom^%2u(x!kX{Le#@C?+Q;hP}IMH90~y*eXd!L5c_;Q +z5qhKw3E5XT-Zq_BDMj453kBPX>$X+LKtw6*4p&q2D$_GooLNjV01=NUXfhD(1aV3y +zC_>D5v6Tm>$A{wR2hCzqO(vu|D7T2)qBD&Xt!|%gxc+ArlV+VYPjG#}WQX8ttkCiL +z5<2h+Vty680c*l?4i+;!(z_!|B#pxWXG0LYMej~(E}RSeGT&z8GnoMLB|+>GLfh$l{;sKGf6yhfqYlIc~FF;o<-%J|gR +z9lC--heJflJhh7gSBuHL@2vZi+@I`7IosUZtv$!Q(uudX!yI6}grJfdWIP%@hCq0|ri>*eZwc(~G~7w% +z#3bx(Bgz#Eyiz1co?d7YdlHrM89gKrRszqVa!NNthoa3ZpD68fqMi@K1M|dh3H?10 +zu-*j#zGQrl3pR8Uny%+tjN-c2TP-2G$5W!_vhf|%TmMe;j1 +zXLL61zE&R#J-e-`fXttB=;WF&`qK5EW6QBpx1#SuqhY5yN|mMxVUT3a9q$74#@**B +zBkAZ23*OvaM=c9?!V~`NIOJ?b#N0&?qxXgVUpZoIKge-OMtzFc5Dt3Pk;wdG1v|YU +zcgj0$IEvxy&gnoq<_1FnNnabRP>^)D4yy4qnWK~S2n=$MwryGyqIwAphx)Vv9tz@p +zaGdc~ZFZ>QB|<1FqSy|V;jvus3@iB^GbQPAT2v_^>YK%d69K3u5)25xQJ^A0Xs!jt +zuBAC&w#o3$EE{vSCsrkO-dv099XnT7Az&-JA?(R_1LmjRp3X+1(VZPrY_j=*7Ud_Xbn?8yK8c;w`e+$mK{=(Sy0UIf$F&)}6Rz^Dbtc +zHZGiy&=TMqu|}_pY!e&#W|d($R^n=jXNrTxtg(3ml$JRTu$~AfYm{cDWtUu3TMEIe +z^3I;X%-m`xN#r&J{=HU1T>zGX4pQFb*_fkjQfg +zxmvWK_OgRs8{0!o>M#N-z5kcpdz2l;wiyA0o|Pe(YS5qz&4Tl(#UmwVUs$m1aNK&%|hH29C~WHw`ePbGpalr +zCzk%asV7x`(@Xas5PQKc-EQpvrnbRv?L**Sf9>kalfSue+QZmD#v{(x7|%*FfK<>w +zu-k+^S;~_-_Hl1)2Q$n9y<;)zT!6%q>C&9YRF{P+gX?wbdNw#dlF)bYXxM*hQM^wd +zVq$NG?aDdyCQO>;az%>FIaIh6b6FIQH{!88>J^!tgR)eUNrszP+(C-mBS~MT2t8*R +z>H_%2C|_X~|IMVGFv~;m(U{6D4dEokFLn@mn~rowHom8{g5PpH2HeaI0B5&Olxb@T +z*7am(E|3mEQ9I&L8{9ZD>!>d3PO!tqa%`0dW6+es=Gv*NRYo#otweBLgwWigFIo>A +zG{;eRgiQ-Aa;iz78a4!e3!5s7&jl&^!{qnhhTSnC_VP#J#-Z9B%uTO7n58`6}X+%8mX-wCbVyjk#^z*2eqf) +zQ0+GreR`fvlsc(==3V65@^TPhH(cg1s(mc8)b2<&)jicAm8h>mE7kqQUWX=9N}$$k-eC8&b&bXL{^BiM-oHkkpyn%0XrRKLjThL_PBGX47uuNkP-w6zU5 +zaBy(|b3}g!7Z>5@Vamsz5 +zN-$Z7V$7!pCM(x%@q1}CQpE&hX1ye{ne&;p^=+Bbt31n8rWB&!TdbVYL#zeMNJ4~e +z!8E~B-WJuI5+}hCRI<#cWOBGQ+IV6vKUK&Z^y#B)!v>i%#)In!I3;q;by1>Z`A89y +zk<97oLu6`NfVG(rrB$yGcrV3xt|v^NImtgSrbnprNX3FXA!x1+m#dRfuCOu};wZA* +zSu4jpk9#hnD!F6z5N`Lwm7)wd9p8;P5XWHU<|940zK4=_tXG(=)ZAt8j*upZP5TuW +zE4Ievt#a+m>1ciB*s97lar&?0f^8ls;Rt8tCeL&tTCq5~E$EkO#q?FizpB|GhM9s@ +z;*)C*&EbwqWu0^cL0)sSw|E%;d7)t4HZ_llyCWb9opD?6jjoV!vB%0BMqg^(Pru07 +zmQp#unI+sM;6A7)>M+Z!C?Z?Yv`U?lD*7x~Az6R?gjH(FfI7OYhlG}P?((+Jd2+KC +zZ}uqMhZ@m4%tO>24c^PyHNr#d79O-LZhYgUO|% +zeLM1rc1oVYiMlw}J9mO7BF4XMSs|~S=nbTPNRd +z+?}rB2;6|~CWFqK(W;KL;Tu3Tr+HD0byx#iZTRgJ-&ljdNVE1f)VmjCF+eB~IqpzlFz +z5t@{w61S1U%7n3r1{cGX2wRAE@XVmDF_zMWOA*t>Qa#3CTi8Wjopn67tQ!AKfVkjA +z8_bw3(@5A{lFSIgJa%0>-<7Ioo{CfN&qiG5n&sv$PMJPk%UfA_6PxlfE2XxEl(;={ +zE*I=H7|OKcF}rBo!(hdmg+hm>tL2vPj0` +zw6R@L`CO*{G7Zs+y7EMW+=?@5E>qffqY86S!eU|A9h<=M$h=RCh23SKeOnd>Pg0;nI6uRRxzJ`0Xss9K{cq6y!N9 +zVuy+3lf;s;Mgy+|2P3D&b5C@1yJQW*casrbF?C}h!gdCWX45R=Fxrr|Uql&xQI63P +zGTV*V>dr>~b{06|EM;q4_F+n%s_q6^NbF??XGq-X9kNy!q_Y{J%TKqV6szZG_9c9L +zmV3nJUwM8_zo5PrA`rm&*rvi!pcNtJKAg3hjWWWApt}nv&A_^%_@)})qVzpWb$ZEe +zW8w(sWvaM0bYGEz+iP+JX3{kHSMVvxEeG|Ln%FCJ1wxG5%9= +zCmXHv>6k07>T)Y2KSp9KEXzk`5_WRt)&NfwMOkV^u`mO-1!!3a)Te?hbdjUDErYMn +zuQlgeHsB$EjTAeo;YgnCw{)G7=`ow7Yp$IRnoE0X-_}0ST5l^@;8yCBLRjHJC<{O%A*-C*CXQN=%Ue7n0 +zwWERDLQBO~5ets7G{D>YB`UDy#w%U2%Ap<>9uomi(flCC=~`JZu}^U;Le9pT-6hlw +zVqz0c=4fNe2m#DftHXPPzJbLWc+Uw056*(jt4st<4<5yvz0e+b3l+vY00s0#y909| +zk@U8kNWr%)(h~u#&2+njCUtV|M)xL{7417%U1F)xw~W0MVb>o#A)h$>or*2)(%_5X +ziSe0(MPybyUoDVGa85tGR{RPhKP2)_0#`m7PTOwb+DdX36yjM@M4Q?)g*95;dsWwp +z5b7X1Avm>Ge)R&(ZD~O^oj_qb5WK2l;OSy*v1+puw5Z!%xB0$dX@TcADJ@$7{B_jo +zH5@4GBLpVJo`}$JEbT4KY#pvqrWvz5Gvo`0S>V{LQw{{Oz8(mPj#S+!K79=X30;+n +zF6aT@hyvlxqh~xp&&J)rPoBjxr79~%rHvzmvG%St4oOiYc!X>}WJHD~wYE+v8cVAL +zVUUKxbEjM*9JU&=EM%aElLiLV;|TdGlLir+v46^8lWN`^9H8m3{lG$eat(N;_%P4V +zz-5EI*1s3Czc1k?m625s%egNsN;+kL2|OF=m@Fkv2(p!@C_Y!2vgva@JxA-)89T<6 +zM1EMXTd7&BlM6~aNfnyi$;6gm2Micwu*E`}x9?eYY#EH|->3}=GiNHT-kFVC*2?lj +zeJBhLUnjeG*TFl)vl*O^>KI#*Y+T4KgL}tX{4?WImX9c1KtLF+x;bv=(eyZR1Nk}; +zs!jL7vCF_T9xiT`dd&ar(Xh&RL2wLRiK;a*bv~mu#>e@l&=Vvch(^8a$>~cJyRR;8 +zMt!^(t#HbiOaN9Gzk^M`V2e4;*)o5&bF~4VF`no|S-IM(aHA`PqXJ{M@k%o;Fu&bc +z?wJ5hMQ&`t?%A^6AqrkqGeScox-lLtQ7%^Le7pCWg!9d{tAM;!(EPU50W7M!)MzKd +z^Kks%SkrCiL_RS);dUAGYv}+t6MsPndk0wTdW&*GseY8C6ZD=quFr@-SgK4-s&0`w +zRK_x~stzH_U$VsY$@!f+rir5^L1+69ROl`j1>cF_caS58T@|6>h=?ymP{?(hPDNYd&uz~&5lgAwqWc^ +zQzn9~F}bcLn|xyLyJ>-(x{xouScLQ4MBb5kq66DI5&DR+l;|GM9qi^1)CSWiX2m2S +zN)$qqg%T*>eZx|ij-Y|R1v=(;Fg2`b)nOco6~}-$G<`x}$M*=2*>+IT=aT+KuP#Iv +zPOS+bIY`0XCamBIcM>gC3>SC9=yKTy7VGPx+JjLE4%T%YE4DLhkS_xS_ndFy%4_dC +z|9{zgw_aJ2>^y9(h{(*UeL1(jP7jAO&7lZhhUCnUlx12LV8Jj90k&WnvI*D^hJTFz +zgP;6h!?68gj1Avy7?!LD5wbvuqIl6<$eHP$?mpe;vTs$D84=5|Rzze**1c-)v(Fi7 +z_SBp{m#VDH$jFFqt@W+%V`DNDwLup~EWAiZ*%Qrls%WuLFi&{->U&P|MaqIl1eWvq%@81Mxmx007kI>fVaJ7dLcZ~_Y`fz2O?>y`{ezj&=<^zEa5?`lv +zzUbTEzy0*K@Q(bghbu~|~Np}4}8=4tLB|+WmR_(NwdS9U3oZ?Wove?=lpsdFlc83E;ag+I;IB*l^e;> +z>R0#4V?K%|zffeAo`P3@6Bal1>HlsQ+B&F=Gc9Md9nm0KPnt740bidwb3&Yck!&|p +zfV=R`Z2RrOGK>qSgpa-IkWM;Idw=5FfSJ&TeR}3`jxI8nLHSg(jl+a)pNzJV!>D4e-rvg4jkw{G2rFB+_2Rdcffl?z +z=^)&=*_l&6LifkbVtR8jGvQ9~9ghByxRkluH&BdRD93{I+#mZ~_T;Z|!=;|{=;4YX +zC3EKkJg=h^wPT7rN|!&?^xk{3;yO@xFAR>orbd2 +zPITMhZrom$<#j-%1E*ZyH8JXfp`x^ky;DJtx^Wfk3~JojW8TI8__+AWkntLucuFR= +zT}u6g;~dOB;h3Zbvls}Cf}-f%qf$b>7fDfLZ=PN;MdgW=W*s4|&paKyiI$@fZFTog +z2w<*9Ntj7~CEG{q+S-n&W&muhcy9kRCN9Llou?zF<$7efNB<@D6EppWaNK`MYoo}% +zB8uY-4bn&ysDL+18kWn;NdI*T*6%k|78u8)-9vCS)($G~_@?I6wGjmropw|lWLXp? +zKdnm=J-(=0xvgOUE+g;6JtzdcM};NYB)5{^@7EP7%j>l(*2Pqo*@_Py2fmkdgZ6I{ +zK+)u|hgo8cU7QBdn2mkXrOV@X@QsD_G)ceO6!2XB-g0G{CwdELprb~csR7$Lhbs1; +z<0`3^Dx^h4F!ygQ%!_K?vgd^Vo+*0I^4hN!@(d0f$nStdW^j<3pRhi`69RJ4PN%H5Wx=Pl>j|9!Af +z!go|5dJEA^hg=g-?QhIG>*@w4oz`JWoT2&qioWY^-nEk#CuVAG*oV1L;m1iS+H;qY +zL1Idh_aWNi`o%S&aqyTis=Cx64uE08#1uK}<#bqA4QuZNY{qHW@J4H45&lL~-3dGo +zn0bMG*KaX&JRZMn!vt77gLgr_2muJS#sn~|{P*CR)q1!JbHXJiypTtu-uZQETeYJ{ +z-ea~&qJ4`2WK_RkOfwL^hgXsyj3^xX+%~Qh>Tvv*nJ|EB*d~(jR+;l%7+%7NtGG-l +z$Nka3a!xb#T;^*}gl|cKTL&?;l_FQ{?TEA!al1@{C)w=tU|Z8S>t}<@#d@ejgJ2F1 +zn+#h2Lq3}~@Zjh{99Hs=+)0j^)uSZ{&8`_znpumKurQl@XqxiiwnCl*$Mh5b*-)J +zTN}SQEIk2j&#%neojZee?&}NowM>nYYd#i$S8YMGcLR#zFFZB6VRkN()(hh862t*# +z+!DWWzj11U?fC-c51PeqtG9l?`z%BhwwZ_~2Ggm5Mj8#40w|bN0gZVVMYDt(3`_!+ +z4Z&;i@LbrptHy-kv7N2dbL(!rmke1zYc)_4ke~A}P)!T- +zFnFlAFkeiv<7p?ar`pN0Lv+V1v~QDnV5Zl=fg5t?B6X(uQ5duZ_cGSuMuo9d`c{vo +z5{b+({$cRx1rz4skyZu<(Xy3VJb8oegw-USkA^TIyb*eGd0alcCJog}>p@VLh|HjZsWU2Ez~ +zy$>+TaR67-(JFr%B!jFTY^_A?k4R!&4{)pyx;Id2EBr3AvV)U +zUV`gpjn-3NusNlAj@Wi@>FQi5ntM=cOIXPpD^-`~$t(addQR99)|-l4krSvrSd&UA +zhV)t3_bfNMbwn3TE*IS|PB80;0hToT<32I`QB&R4GyU>!h8@DG|Errp^Uz^-K>+F# +zt8qBPS5+rdZJLh3QF5B(ZO1w>y7O@#m^$?ylU_nN0CS~24Vy<*GjMSW@D(@FRZpRN +zX3PZPM3QTDvGwY4e45Cn1bv +zu}rGC0lE9kbP_v+c|R4VmR+Hu?U(spTA4*>5dEO|A-oHL;C(+G^qz$XYLNOKAb79! +zp?XIOT!uh6&VFxdxYW{RogL;=@;kcC7jBm$BFehF7ag)nCYntod`GHx558mDW$H1E +z@LLsWZ>@B%qZjkvDLsCl;wL+cnFpqZ)}}jY3tY(!m$BzEl1~b2%2*x|+IQriFc8mj +z-MEUEM-GHb9l%s1znARVDRy20E?c4E9VMS=Buh6`iH}K)#V%$VgnV9ISJq$3AG-Ii +zE45JQm7OZCOHizR18)Av?Sb+p?Uy@GLcf_49ybjBoA490w*%gF3MLBc5vwPxc@_g6 +ze_Uzhx=vv>Qi9q#bl#~T7IATI7QM4X +z*WpZbm1@|%64&MjLUIsoCphLmu&4hg&VGXY?b@=+g{I!N28RzQW2%WLrYPehvoU~w +zE>EW{l;q*@f7Nu0dZjkW)RG1jT$E!Qd`+vD+%a0K7s +zKedAkP!|BThI6jo#6V!p4#_l?3HVcQ!+={h22MIs7Hyd1s9)OoQ#%8WCJlQqvDc2?^QzUR{LUbFmAz)X&%gFBNX}9Uhg_pB +z)CLEu%bbQ(1N^S!Y9`P} +z&C1*viDRZnL2D^_P<|}Sl+|_e#EY^ggOW&gfPxhW4!2P77%E0%!c!Rp;+}VnmdRGz +zeL!gC+1VfS9s2$w2j^8rinLjed>>UlS_#hSs0*ZmG<+O0r&spf^rDsDl%Rj@Z`NhC +zb|=3#ys$j@ZRBof9fM`bXv2ak1#dy}|Rn0VT-?c{h<&H;6 +z2%ep@JECTRA2{CueFEy5Wz=Y+jGFM@q2t6aL!f{G9)mW5dc$70NWj$R<8NMU3myFc +z9s-;&%75RI6SV)MSLi~ +z9q)Y_v565Ow>18$s#|KEnTk8LpMd!k>4)eVZi3{RfJL<-QRfeMvPhZ%{0!hq+6T`t +z3TCgPoiIcoJmro@Znf++z8yzU9CbOVtAo-v?EZ7i03>lBW}Cp*E1po#JAKVM^_J89 +zA@TtA)U*~m`SuB*N%iXeF5GO{X-DSjv3brH%x@~ttPpT|bz;>c?;+_cy~l}0fU!uk +zM9t2Paci=LYKRr0&n08-XfCP8ZkO>T$|ks4uQ{knovB<>8{?FJy8K?XBSh3z)COZ8 +zsxSpGnGLB#JBhF|4aMNR_{weO6YaQ1ek(rnJ3Y5?!-%AwA1Z+5I;-oRd6G0+v&)Wi +z@`|&^C!IvOP+!)DMy^wAS#lJmA_g<*FScjl%oU)#EPYjY~6P +zD_CFAG}wLo)okn5%OTj%e;NPXFPXY8w<&D>{xw%e8(eA!B1&m4qhLR4=o~rv74rA$ +zaN&xcAQaT?G6KOB^x#)2flD2SZW#)UdOBf;fa$oYJln+=BarA_{R!9|S@tz|^Po`8 +zZ~G(CAzcS7mlxOX;{0E4Y%sDh65H~y6xIjSlY(>tPJW*SLsPon?@w6!)2r4oO8mL?PxVz2k!=vf4Y+bgjRP}XxQ-B3WefLUcl +z-C|=pW+&5NYEn0jNIF}2!k3>=*!B2_bYJ0kDd?O +zK92*c*Icha=Wz~rV(}DJ7s4-q+Ov@=jH(<6;q;#PYF3fMw)UzGGfd4KTrX{u6TvoeNjr>L-f5NEd~< +zRki(^&Gt3S7b4$|`poy>Ya;MmnCFaipx}HDy@t`eFg_rDyy3%!rk*mHSF~oNioRxo +zHwQ$9LVOd(w@42TChjR=y25d!!{jqdwUZ3;M$8jVdnY?bj@Bq%H8W34?zz-iYEYHN +zp0D;fLMRMFaZ5*O4u}pe1dQqAn*=m+yJ}2(3-csXPm(@Kls6INErNqQ>vafhR90og +z0l!j|jG@#r?jxsMddI^{=T>=Dz>`>(@zl3#m2I3UM1!$);nDHVhK_=zv^wsscBc~f +zAhjYko*&YTSxnH9TZdVJrNR=EI) +zefMwLFa6KzdE0iVPH36iAnlzIT4Pf+6NST06t;r4>xx`Pc<D~+Rn$GPU6@>hacucv-k%1gYRB$u~V;c7NJa+ +z1zX13_f$RcW=3^|Rg^WDEB(XybyS^WzPDo%z%BK+@@98KFk@kK3c*hu#q_A(3P*Jo +z8wS@HE!ikVQ7)zE8HjtmCEr=w%Z}}THd;cb5DbN=DuDlQ*t784m*h{ZiMhWpn=h4p +zYG3km#viKWS?fhd;V{oHmIIa767vLc)#wuYv@IRtwlg$bLNwNKe#n1E+IN&e1i^-;&>1wzZ6^xq +z#g^+4(c#sXAdlxX4>X3-b#J`K7cN{S7X`;ST{=fH0MDA=-lwLBDDNHBz7z8#af!x^ +zjZ`>DO_Xam-`RVWdbQhL@InInnBj)7B<1a0^rGWq1*Dc5BxS955 +zSV+S0Ps;5sf5)7s0>M;>6V~?T3WiNe1L9Gl(f^!MP1kwOSZOZTuc-_(W_BJI_-KZw +z4xSM#l-i5NDjOj0kf$EsA!C87^Iqu}zMaQ%lnYq7k-j<{7ZjqGHYE|PR80-YZ~oUz +z`+lrC_H@W;id3T9wJSp%4^q2 +z&4fv68wIuI-w-EZBgT;WcXG<$8P};W3$qr)A%n^JK+TdhfbF~Bf2*5(RQYE}53CWz +zX{bT}#N2!Y*P@1_&^KI(Ny7iIkKl>g2SF58J2CYO33Wr#Jc&M+5zUw-llgJaLp1+p%gAgKsNbFG1lVOdU}_+v{Y` +zx8QGKfu|zC?X1j?*>-OUg9cxlyrlK};7+~(rokJ88hJsK1EGk&q5p(R@lH~XhwRCkk5|sXTSD+P5a$+coohJihbaobxw$!d +z-N&cRIpF(&zhf5lG916_ZFJ+o@mT-PpQWqc$RCtcMgWdbxtKAF?uubw?z;B~&$YAA +z1vKr#_Tt!^B*i67z^P4P_9_Gv=?3mQ4Yx8;A{R#Sst}s&|P~HAi85?=vY6Jr) +zcnE$1q%yN#trU}eW7vg=2RptYgqzOwITV>>I49diC4Pc~#*^hSty=hS*!Eis|x_zKjI)Xg)v;;F1A(vEC!sB`ZAuJsLK(OBmk>U7nkMyYCbbWZ0neUxZ-1gsZN^jGy +z5sv5JMkjWwyLPBql|N)A{Oo6UUR|jgnJ&UzkF3Ea%Yd@(p@nyK9nfa0q0@|u1$?jG +zF>Y223r*{%^Daz|YgA6i&3cco_iSoo)VZ!3>!MHE!gfNOHAzXZm~ZyG1+NWxai5>UYRM*S3|qB>T)-Faf`@ +zE2Y?fR^(@(UWC&RKx&tp=rHC!B7Qy*CnkGJw9StSl4VB=XXNR1(oVv87(Neo+MIk% +z=?j{-=EMl;$Dn#fv(H)IBX(3tdEr24yXFhI@({M~Yfy7>vpf~fbQY~2?`ATzzEUz$ +zxwa56R!n;j-~(adZE6@hWFuMze<6*t;H6vxjx-#` +zSAzn6i^?)j{;irN=`$)g5B(8ja7NHczf*Z%^ru<~Sp&_gwkBZ~z_=R>r=7@Kx9W +zUNXSt>vcNXeuM>mF^p~=+eA63OtYA^RWoVNZuGN%_w?fG^1c7te6IYpuT^bvmZ&n0 +zR5(0o_Ip7`8k?FXMoey4Ub|9;E#;jJ`*73I!i1gKfVE!R8hX|#H4`yDGxlrvXrNkm9t>+gZ5T*N<-8tj3m& +zEt%}hTf9p1T{iYr9ZSD;0S~hw0OcF-3-2FWJO!Ky;UuQ8E#}dT4PSMK?_jODHxoJx +zsKEvhVX^a=^1vzt43(aHQLCrUr)>DXL)xHjs|A0pIr|n*)Qj)e{>-&4Og+@$1}{*( +z=oYMTqM^2rTc%fc2W??$AJ{pxU1o6)pM6q%^07&X2$R~Ncor74ljN^HrhOM1U9TZW +z1!=YSxn%l%k@hZVCs;7QH{lR6WM%=(>(YSW1CzMT9%So3>Xa}by8 +z2KR@h$KUp?`R{`=->VE;|cS|CA(ABFe)SI#&d&~ +z#}srbr&;@DUj;OMS|jhl>tOAF^W_N%S>)ae(gdcXfrIeN>~m8|s! +znC*STyR~MtOe!hIZ5~P1PY_5kZ@SvLzvUi$M=x5|FSIwvPCfl43zT&!y$QxN)9?j8 +zrrIP?&)H~h{*26U4!Xjo{C>c--iD~8LwwGRlujtcN|-AlM7Z?+S!Je5oq?~CMdlXp +zBzY#s4nC2mz+4v-ws#M3EB4s^*~o9Hw{~o@wD>xxnvBwClP-*h4|np)tM55!a}~EC +zr?{t9(b^o{p>w$Hh_+- +zRGI881ME)tn~`z?(JBd^pfMQBCZ;e+1uXbVNvWj3FhIQ!jnCds)K4A+HA3OA&bJ=M +zx|g@x4p)&-PeP$Xm0x?q9X-B|H)s3b_nCT=&UWWN{mVdj_?d0fq08x;IiJ}8Q9!Q0 +z&mC0&B$X6l)7}+;k!WSN?;HIPweQkCy{X`SU<;S +zw6Lpt!go*d&hIJv?cfMcNm@!{=EhSoYfNcx`4tlLJ5d@qQ7M3%doH8kppkUA&VEB9 +z>zY@LybBn3N8d>_7C9j(g}sNeJC3_mV>5EX$CmMTYQglB+;$jn8zy{LDPoDSTyk;B +z4>hhzfA|&V_wXo|{RTY?9*ac!s51bwF!LQIzx$!bBab{p38M%iQ-OvepEPp9}dPnFxS%H`Jr}!76)I=7tLfV1J +zCG?o!18sC?t=hT=GCj{O)Z=I7@qz+0jmq2yjKB8&9W+y>ev+@ME6tPuUa}nL3@dD2r* +zASGkHApQhtIN9%*JSoyCQdC`;1O3Oh?5nXD{02-}_aUfXw|?d;OVfo4P?Q?g{G+=2 +z+~b+AxqX#kFc%zr_SfiZ0!kgmSr;1e6>+g;s_1c6D_Krnh0$Z`xyLDDB|#2XEl5ib +zq{l&tfx<1Eb0jLZhm0c*-H|M?zp4Kn*PU7VQw`SY@YS8N5&)Rb=<*}Fkx5rsJUJp? +zqjqjYOKq2f+F-N@&w}5vOG9P1@KMiYq+XN_mj&itkH4`T^ARCHQQt)u@wdvaLhU5I +zmNEY!8H}>qaFDO_J^e=1PHcXq-a$d%Iz6yT+AgEiw@T5-2Kkr!NPgc9>@E|X`|XZ} +zEMQgxN;&U1bl#`!I+Cyh<_^fa5(pkM-;uMF_0da%_z?ybweKhd32qz(7Y)0l#*GAH +z5zMs$mA4-(DyW->-;vxB!R6wS;U&Jo8R)xhzPxk&js0oFYuy(2;mrKBr+Bw`vTmQi +z1WTmCS6}0Mqu0zkzV@{bzL(CbYGi^G{pg%}$25<4-F0(rdR)r~h)Zxl=r;@c@WM>I +z`KNXJSdxr(kB2k%RZ&$pPXZEloN&G}@CDkiWEqzd-mPYe!WM +zm47znec}t(a%zy1n2mt%mhcAM%ZUkpeBhNuyj~{-Gl~}2dM`>DMp>C~14Ix#!p2q7 +z3f;$YcQ*@V?9%$WntavT5IWt|O=q~zP&@b+bThB8_H~HmoR9$Mcs&cu1e-8^mGuiy +z7h%IU_-MVCD$9?P3NNK=Wx@wg$~!{x#t0;G7YhaqFn2EEQFUPARdl{x#TZ+EZ5r-r +z`=fyFaZ-gC!#GZ@qIt2npsEx65awQkhcksXI$XvE(>}iTz2J$&oLTTh_$Tp#vz||n +zya&1Kk=2frfN+gx#xgs5kUB~H0#!~=hTTB9=hAQiDbl`uz`oLUsRU_xX@ExRa}G3Q +zCAVAcEV~9~eof?0^itn_{yW6Le6MvDLzLjph~P<98{~f6%srv|+l#2M_QAtafxS9u +z|3nV;q;d0cHq*u2w1-PgV8RTE7NLXSiA}PDVO+#sNBWB+QK!<>GXCZeHcfGg2NleW +zg?k7M;_YSrTcw*Gv)nZFX%Y>|@2no40_)75qBU)8N33I%k3(4a9}WTfK8BaWkYo0E +z?ODS(;zf;~r=2p88`s|ctne7^Rw|yIp7OuN(h_&OtsZy^>S#-W4U5FOq9@Y4&|f3156Ol5sXz~`(uZ)j&lq~IeV_%gXYvN +zI#y^9Ubm!+bK9C&TB1K;)&)Gj)=!?Q_ptj5P@j{3f^97>-CO1<89u6FpYhiI990c^ +zXBSZ6HNs1VFphOsR3*;a8)>(3op#Key#{yMDf*A`V&R(qm(fGm8Nxx#oPBEo)@gli +zG!sQ~(#=HGwG9v-M9wfk>wp)<@2Ml1FrKc$PR +zuwQE3WsevME|{icUQ47}OIIV81Nfd-Azb>60BX$qbN!`9^XX;v#UrPl+4cuuYJU#+ +zl83>qYtGNCrybY8dLb>R&e_OQYxM%$3y)_Z_;CT&`#CP7VWw9*)?x5d3+Lo!rt7HI +zToJ)eb>6qBs4aIY#0qniVu%m_(Xxs9JqK1uu{;S>r1_15Pv@9fzR&S{ +z23ASA8eRKJv+MT$yq$?^x|6v#;^gl@KZl;)L01Pml(u&$5BlOaZkH%w`4NBk_r9W} +z*P++$@|C*7ufi9fjlZ$Q%Wb~ieeVA4UpoiNjbFE{>MXVP?zp;L>jLFr>=)v2hK7+h +zPGt4uPZ<|m3{}9(rxF?AYS!)v&9^^!;1ACm$3-W;wR3T9B+|0{V9pn;>U0~Y}?wY(`Oke +zvYKCm&S2W8vPlML^$l=W;AYLq$s*tu|G=B?yY|mLPJNAV6+%1j0P$#dop5VfevyPN +z^tr<4Ko1EXI>rghB^OQNIvHTEhH#Tkyq{^;vfDZLy|%cB4VpRKMV9!`z-1Tb2PLb0 +zlQ*8T{PXw8e{-Rqd%EffUB`AVmIdr@aQ;J_G2xrb^KXSGNIb0$8;O0@PNat#op}3X +z+IJ>@C(c0HZX-z2J@X_YPMsi*Qe(Qs3h5-by)ApcVQ*at!u(z~++nG2Q|Nr_!V$A4 +zg5wey;2@*ptad_vu-Zx72^)SD+Z`W)JwHZDgeSEbd@fCIH6Ljw>fXZJB=SMDM5Mnj +zc0p<~jB4LJew_36&bshocAkqYw`jN{XuHSXLYgnZaru+T+LXixWtS_p*s~o_j@i~R +zPco8^Qkbz5Hn}C;jp3yq(`-x4`lCE|`ql;!E$D3t59D3k;rsVNd#|WEdds@R_GIK1 +zAraccdY$fWFz>(kjAQD^al8oJz(0Aze}0N+C*)n&ODa=W!mRdjvFS|gE1JLERPV#I +zZeyn+<7Dbf6LGzC=S+ImpIdWzp?NM^!~NCwi@^ +zE<9X!3)yZ1?5gs!~(z&DSdWKuyV= +zoqK&*EuM77K=nroueI&!xuGUZrv;-PDwKu~nZ}&7AT>*q +z-bvwxQCHWUaW1n0U&$#uX)F +z_7FTvf8b`Lc`QVjh4Vdv-9^rO47)KQ@Azw}ad8AVpdr0lj6(q2{G_whWs)8A$xk|5 +zF2@5nsC`ET#zKT;Ohte7J1Q)B!0-84+UTZJSh;WcP|=B*yN-P3oG|UgirYL#bIBi> +z)lLj+p2Sy*-$pY;FsK^o?)7uEPks}vxLq#E4rUY{+hfK$et36=m!6ggCUgtWon*VC +zhiKxJVVYZZ&C!;r^O_OnxNdXQDfWX?_`MRnkym>sNO2gl@y{)9!5cbmw{G{mTO0Y! +zH>=WS60oupV-{fGh>qEpq`LNl@NWxieC$h;b#BF=F)o7+^-J~cC9jKL;NCerMd&n> +z6drl?7GH83R^_>=o;jLFo*zqp*W_`Zr;HPzEhEssGf{tUws;9mq;d3v=_$HNLT-Wt +z)tr*5qMM`$zOe9L0N-qL6OBapuNFV=)mcX!B7`+ZioQaL!;<%cM9^WiXXXba*VjMW%B0FG9S5 +zOhB>H +zxEMD@+E6r^@0s5!1|fP-8@xXVzF(Gf^H#KG&}fSk_|k{4+`pqLy7=wHJ%`^Kd<^ +z$Nl!&9Dc%<&dWD5pL%b5$)R6#1j%^&*U^T1cLcQB=kK@t@whKtYpJv4akyoedYq@y +zooA*I?!kKDw&w|%Dja`rQ5&Tj>vM5dIe~cw9DG$b?>WDK07a?eyQ&3TEn&z@1q<{K +z1D?6UlNrqruOJJB@4RiAVviTRttXEI%JK664Q50y!wPIzVo+q+O!i6H^kBw~Npas6 +zy!_YvJ13R;ulTcd?XEoP^72cDBU@@rPOLIE%E@w*4->v2smnpd8q}aG^(C)O0N=(q +zq)*5>Gz=xMCA~l<4TnABnVvZ0L~jLsabR;UGi(-45O$0y0#a+RI<}JC=L32tn5^k+_gU$=jZ)w{Mn>t=IRwd~5|F{jMbp(cJ* +zgFg`)%Z}6wU}>Cy7DFsF6$z8s@(08=G~C=;9AA>do#6NmS +zP%U=|Zcl#WGMa>u*-(JssoOH~zq!mILWInEA86l$c6IVj*O&?d=e_G?37PL3l{=FN# +z0QW)=aFyi_cF;~pRQ*nrdR!@T3s%?$eY0?kdsJ+tRq~+tbzR61Q>I~CR>U3mme=W< +zzm4yFZ}IZaPgFD0wS~5heR9cCXAoU*UNxuMOalf}l78iFIcz9h3%%EFIK6i9ZiQ3h +z7H(m+T3CAN7GS1)MyiU(^ZpsA=T-d#d{elhZi+J@nq7O_iLwdC4X05$oQA{0t4smL +zM|A>>;2U3`;E9>2HiRGx!Y_mV5d9Tz$LE&oB5fGzA1vn2EB^~H>3mCuTirzBMIr3n +z$vB$Wk^ZT?V1iu{$0(m1 +zNPCm{#5Qpy{+2|zkJPhX#sYzsa&ok5hc4;>y{g@yHW(WRlV_a722u4TH(d7eFDh%F +zD>*B~dsMR}T&pj!#swL-o=T$cgPlcXb2OQsZU}{c) +zBvUXqV2^TvN;SRLIick!75lE4Hp&KN!V=2zbpBS1dyl(LeqIW&L@7TM?qCe$c%wn{R^KHX4l83HRh8Aiexpw~I +z03WpQRa@0+-v;=3p)}j;Fj@z{N4{sxLx}cwt@&%_)4$)m|Fk>*iuK5%Nib;5ZPz2ifnzZD-X-^N`v(Wo(z3CvJql!&E@ZOm&ro +zUxY+4kiWCrB_Q5sBhr2aV%mR?7%^wpY?&+h(8!YQ1qay+!G)J}Ub-bxC +zd+f#T0re8?d)Kr+y8n`nLJ!M>a5%5yP_T0J!8ci^ZyJs5dKx>GXSO7Uw+Ok=9(L~g +z_k+UbM$!!>mu<(vpH9ongQ#Dx_dF%Nz^*YBla<-e(w9+5I}QKdzGKaoRJ91p>9Wzu +zSn?9ogT=K%|FQbo9G)|tRX4Oh=0n!gK0|k2H`>C)F-`U-XfM%nZ>I{|akZ6IiXw|> +zO>2niSv3LO{imw>9@zgQAo0u7PTknb7Dc?6c9R5nSg`Aps-8--T@t|c-nVVnYi}@C +zup>_z860XrHuS8RimQkhh%n)_QNj3bfWH_$+;_jWRL8bof2>a_0OZ +zdY#iRoV@n#hU(|q0L^|4t1~~*YI;$%9^K=ve(vC(nRy6j>dw|gm)du?l}nC7Jt3re +z$qL_8qna{~ODZvLT?`r!r=5i9?_F*k_QJDrk`WOuKieGXIofuJTc>B1wEC +z<~JsNx10f7i3o9J(<&%Cs;9of;Bz@>4)*r)!%L0u_j(Avd(SRgjC#!zTOjW)YMvxP +z7^FdMuupzx`HtT0Qr#fdHjD<&Z-5ndgz)f}@X5As132??H2LV16$nZ@P=ctrs1`wao9s +z%y`oyQJT7rk8{YazDG9pNa*v8`ynX$Ctslls&N<+)@E0m=ey^>8J1r@VSOo +z3dwt62=Pr&0j_;$TL +z;ovfiXkGQ57vYkf{}^;zS8sbV6dBAb_ilJhQvej@-Ixc#-IksOtE1w?Qi&>ZB-c-d +zybMa_r((j%W^tAK`KiDfGYRK?LhWy`PM`ATWMN!QcH-+lM*J7xANV?ebn#w78iVh{ +zXTB4fjUx3q;Wg5Uf-|j}G&OO#z{MOV?@z#=AuBX+MLX)8L>?;xb0_mbTdc4BErV(1 +zn0&M9z@Iz~uv^VNo7FS-HT?h2>K7ClS@ae%Lw#Pj1>F(&9veKCm^;F5DB3Rj9Aj4d +zPM{M@+Q}eLp$bc#tr=JGE**F~ +zcTyYdBJEpRK9ms5l_bAS3PK|OX17Zv+UG;&_C7H99c9=HL-RyOqBX7kOMhDWbTqn@ +zqJbBo^qBuAB>WPKK9p{>ZOm&B4@&iE*gz|3Td +z2ODeB-;LG$+8Rz#@;UfUCV@p1X`xZ`<(r(qqn~p3$Gy^%f7!3`mbH|h{oG=B1@fUj +z1vPbEl?*MeI4|tiv3{4_f?LF(@@viG5|me97y9f|^{$04l)FT=aPSa!$_w^ew)YRU +z`VtdtXC2a2W4>U_9Ty;WyKqo#tM<#kuq}{6-#F}^{)agIo@)L9QSGO$x$x{gS;q`$ +z%Hu@IT=FblP=(9aDgv081@(TZZ|qE|_rh{+ZKw3hT0iwp8bE8!y{FMqZ9(o+)3lX& +z>{zp88*SI;?16I@BC3`xry^xsk;OS?$x!44f4|mg)}ig}6dZliFTR5AIaV`uQaSr@ +zVP{SKj~lme=FF*!DetJp!fjdaU*>N#6*{OLO%@GJRAeFLNhlp>|Tf +zMi3mAm?xOg&nmxV_cGXHJIURO;K`u&O_4hRqTV6Pg#-p7b;8V(o_2zX-k^H*@_PYI +znY)j#aC_MDkJ;r&)V`y1lz?v=Y2RYFBUKb;&ml_MyT{*suPP0$Nw}K)P8OCaKuWKO +zzjNgT6Z3mH`Q3A(vK%CiRO#;sf)5pgfpT^D{U4r#6fPjb-Yd?!i=n+64G((fKGDeS +z@j7h@bvE#5>9+TAJ@JD^RgPtkl`Z@e*zg88iiblRREhl7XO{N+n?spMKLh%A71_mx +zr&^g)&sNU7kV!{nEaJK+*nABp-YsrwZsRk44Hv>gETB7s?F;?rse1(Q@rk|Bun5>@ +zr?z)A#*`%&9@Wi>vrH7I^cU!!*^aX%4#M~9*xK$Yb!$>APRhhuGP>b>VH#n%Z(mZ*drg#q?1d^s+W-R@Rn*0)|KU1^MQJo1O@u+H0GipC}*Wo0j +zaqpCMCX*k~!Pvm;v(}|YyB9pky@oFPT>61Z5YL`_-Hfzdn!fY0qzzzirjrj(I4anz +zEVm{6DU^6ppPWi+Cw<#xl>LtMkW2;UKq;c|)X|A$&n3}b!$+xwiKx&!PY&||K`J4l +zfC~saiXloxjNL5@wQmzM-$FjIlCbdiy?NodZF0}7e>T@$O{0uz%0pb0?cK2-xuKdu +zNd+|;?sP2AsypXvd6?o<2}5Ig%@ac+d%}@2$1OfL@uA~vq^Az=&2rhw&%Ja=H4I&(%RSA&jY&di<7P2P@dzb8J*ou=N0_tm^U=5E?O;m6Lf=fDn2 +zq{Dds=tgD-%R=uv{laL=+PM2{SB|fCU0rU3CH5gVb+R@EpvR_s;cO9~epnlc{3=(#=u$af;BMdu+AH6taj2w^VxVJK(;|Q<^?>0Z;_UjU8(iC~X&WaEk!L>rPpv +zyV{=KbYC@73v+P1Ntj-rjB$Z0$IZuQu3-M>XqC$ +zhZF67!q#M|m42bxGiD^eY8t<79%elR7zV +z?X!vLaB+3j{V;67;l^5g=LRo~n}J7KMXvr3|B#8-AzHgsKForaVA`rDL^nt^q$Tn6GRy#e_#ATNm +z2R;5yMkIG|(CO7#^`_8nJ@GCoBQWC|I;4Ogfy6?PHk$gf!@YXAI7s+oLxy|>@msG&V +zo~n{)Cq1lGIsZMlv1WDg<)Q0oLx*Kd{WvjstDerj`ErH)y;q8NrHyV+gZEpeD(~EX +z9*!~?-_w44p93!a(d|lO)5_oYb-wg|k8aDg*>}I;yWo&kPPgI=M@Q8qewOM!9usB6 +zFKNQC-O)9+l9NypB$GSSz +z0j}GyTLhH-%(W1WaboI&-*su}MKx(SlHue`IQt#Uf!;tz)=b5&=vp#AK*!q5MD(Gu +zh~jIU?I9{vj;`LX^bDH +zo319Tmd>}^uTn92T&xY?zmo7SsV8t;6!1fr*Ey*K%QdfF`8yfgCz&}Y$pq1O{eaPn3Eo@;C}<~%e8QaX +zfWM^=n?oZ$2VEfV!e?GfezzZo19&*MK;D$D_)fkmhFeh3zG*3#qV)of=@T5p2?UqS +zcX*}FODB4iA_0n~XMR^=xTDLq%Yl2+d(iiWJ6ThF;79eM-#Dg756thLlv1_}tc}-7 +z;Eacjn6S6Xfyx#@$B|EZ9+t`soI?)sni%5u>ACY-s<^MkBl`B9_V|he^`HG5dN-xd +zQc0N_&rzSrLe>d>WqZl43M-0z?Da1)ry^h_g+R0_Cd;y_x&wV~FB?zK)q6jIclf{N +zIcKi9E-2PBTPIKDjMHJ2ynbZ#&p~At%=EZ6)hE7fbv#LFml>6)H~oZl{Kh~B>g4bG +z`mM!_?{E(NL?s-{8oVBD%J<94?6~!0xN{B?YQGpuvja}?Mdg}HpW65 +z{-Ch=*xO5OLELmO0A|t#ZV;aGf>~E#)0WGx%gbNmYALlzHt|W33{w&65Dxj+dI-(`abF4rN9ivnkUgp +zHEFkH!NEvA=`~OC3&*A-YrN&5uw@)IT&BlbzK7W+kz`UjTvFB<#8KKiYoUx>xmU>F +z`&0mE=s@M%e-FM{FRyb^{+w@$&$Nh`{H_xI7XFDAFP<#?axV$*wXfSEC>r-*?sG08 +z`Yog&k!y@5m)3IHJN)WgN>iuG3B&HNNG1p##w}^-;5hjmXO$W}FTFHWXZ)SwrDEC3 +zZ39cm?_Nb^WW~DFd^rfN91=G5Zu5Rz%qhs<`)AUJWmEKJQ}6Mp^YRrzzqKv4N8oI_ +z7Z2`Nbp5vzBYCC45#Hw@+}l9Bn)AQ?VP44;&ZC-~ECn^zm3cs}mV#5u8M>_DbL};G~-TFR|1~8(=PJ_0+r1 +zf$acUWOrCiwP0D?3is-k7Dhe)_uO0mwVBPry6$w$jb$Edz+oLm(kO2hpqo=uPrQ#y +z9vA+@DcH7)mCb+z_&UhFP58E_1$3^~4ysQ$dO_tZvB`)IZ!&b{x*w^@8C2(1IP*&6 +z(&K=y74C>ok2jL6dBQM*$*f)>rjkF6XqmKmf=R=?@(%Nze$C*UzuoBu=l@E$tDRox +zDbOTb!9>{~fcj?yXJUWXA+;iRz7*f}dDjEc!?nQ|3Kt$9I(i}$qg(@A_8AHAoX!K1 +zjPJk*-2-y4kVt#%t1cpgEaV^wx&y=?QNXuHRfVgj_M3{nN&1gf_o=DRInz#atfrt} +znA!KjQE5@hXP!8p81TZtVcJO-+b(@-^^=x@ +z2)?t_pvm%!NmV+LjPahCCxmcZscelD6F{NRwzkEM)&a8k!=Xw--YNMVUe4zQNkJu6 +z^K~MhKvX`_it^+cGT?bq43ws_=Q6il4ibo?7;G$i5{2qhl-Q@e*Xz~7FqQX3qBJh( +z$2+3(c6G1>%Aoum@%QM;?mW%BmcwxS1JWC#6LL#S$SoImn`Abvv*Dz_6uIhGYVH10 +zVI99YJ#AOP?#6mnz4bYsX#d>` +zt_U8m!~|6d5N{r$utHgJ6#f9r*E>De-R0DU)%vq;;dB)M5tEk{XPM-**LfminOC#u +z9{XDTNA&!r#{aGpzKC)o*>z?haD!xWamN6>Po+r;Blr%>bJudhhPQW5OmSz>1#jt- +z^NtqU%?;kP?R7Y;t|lENlWX4uz>f61nLZ>ucal9veIr?R-1HD~Dkoqam0j++DjNb0 +z6v-^f^&D8Uj3jYswS4`LEehy;GS$B-8N+!!p^kHdcG~{HwV#20+=+J~_<7fQynWOf +z=5Pma3GPB;IN)P|C!$3YjT2$H_kgIDJTo{eBgfk_g9qnS?3SSz8FCYysLZKDy+--s +zv}%||;eN$eQ|JD9WiMUxwqsiUwQ42`U)qZo?k3iE6q^kh9L&WI{xN$l{?VT>QJF_- +zgDLGD!3_ws;buerHGxa5N$Vtjk|a=Mrg}_9TR>~pV1$tac*#PEK9{Oj4en(JG4fBs +zx4GPN>9Ykr|DMCtWP3RnjAP+ +zV5pQ&I!>0sGBCGIE&-x_?qP2WpDfUFQz0hd*ATRFhnb61Kisi$-8#H?@I!-k9*y6>{wjBVU6Is0d^B*^-JxZ>`?;){X8|9h +znOe_1g(^y91M5BnEb;-tFPe7Y1C(h@fC+g#dlPw~L9^wv_T3bpJvU$fr27@9|3Kq& +zpa&4u0XM{lqQ@6|YB{Mv6`jrTt7h_|BF~@0kr*yJW+tv!R#Ru& +zISZ#q(@TKgVC^||@9F9qY$aYS-><@7PQ&)!HloMuYt&B{?ni3+KRDogK^BFbNqLt*i>ENqjb`O(k4cbS!6+5%*UiNulIBQ*`zmY&3B%nt+$IU) +zRIJ1DUO4|&w`U;jCg`SEDWUpv9Y}}W+*#IWiF+O+_iLkX +zoEF)^S=3_RKYIl%)Z=crtDyPU)#9?kFTfenGdxitj>DOTlONl8c<5N3$G_#+A$7qL +zh%A_R4DH+OcV;knSo?%XEDb(8z15D-#96@Xf6e6Y0cC3J`PV5~8A~;*_QPdmv+#9T$#qj;FGMnvAdbz-l1l9?yUN%FgL +zXd)e%FbbaZU8kS*b*iNYFWW!)uanDO_(4xxTDquV@1}2!hV#k6Q^EvI +zy^hOrej3-DUWDt*c;7`Bnu +z!C-?cTkeF^uPS|Fudgan{=6pLLE8_aPnGw`0tv9CU8pBd>E|x}OR%4L)>IBhnH2@_ +z^=`ZAq{9;B7GG8MW5B1_J|eud=10EsTFb(t+3k-*X}2jxC4}4~grpl#FaJ(=Iy238 +z;JNaTS;7K){e!4hC0nPo!g;SI&1pbL0_muuun(OY`sw`E#N~Rn&5&cN*lh2jVQTgjWak6 +zV+_U*u2%_y5q23!Lo4$jH3)L<4uvVN_lQDY4I=3CeVk$HzSW&vhTAteMW=K{pCyde1# +z4EH`J>rm#l>--|_w_^IrlPf^u1xHXJMrtKCJ*XMWfVUmaA3O6~4nEfI27JKXH&jjB +zqSo^pKm9S?h!|s-kxz&!WP2SrLg70n{|~uUsRus$%nyuPhp&iR_8Z$#3hVhXBMURn!LSLiR)_!yPI~ +zCzv8|ETM{zstpDCBwLha<~Jp`9W}IFQt1^{7|w6d{Kk^}jr)pCC9`N61)hinY2?s+ +z?Z|jadLI-m3;EGquitmK5A2I(Ufl`Py?^7LS#Vlc8eB^_!Tk>S=KS1g7s|%##h)Hd +zPMNs~`+9@gg#FCNokTQHB{>+joSR?J^&@P&H$YWp*p2Vn`e?L+IqsE^?05*D^rQs~#3u!t2` +zkA`h!!||#`?N#HkQq}DD(EYFN^+h$UEg63$InJfxH(!Dad;0XOo=lx$Cw4 +zCjXD?wf0E$*Xtm=^yIrkG*}X +ztFA*pW0YkFL3i7Hf&f-UFM%#R)PxgMQ(9K|Mx?&#$4Rh>s>DFY+o*%al#@lo@bR8l +zrEO9)Q{q^3km^8qq?~1m%$r{|^mTgl6x=g!Pn}V0oT!Y~pVn7D(HFoh>l$H-=x>p} +z+z))yI9W%@|6B6D0=OA@7rrwD$;2fAlBn~oliIh+CWSpp!Hr61#qY5s6Za6j;Q1DY +zmnO;%LUx-k-!N{$9En{lBk!$UVuMn3WaDJ+4JW*#>^CEC`6sFQ$yf7<>6HK0(PX~p +zjzhfXM=znjW45JLmP((;UIpHxEO=3&Pr2zdiZXgxb1>7sqc5cr!T3tEF>rWA!9f)@ +zPe!NS+pYJuHA7dJ^aH1t%d#w3Ccpa-Z_qr6GVOh#CLU95Xe1iFyl0>41FVt&)-VywA~IulsxQx1GkV8z}J=zyGi! +z->KjG9UpCJOj~n(6i={4W43-9hgfl3freN~`JVS@?IBHjGLah?eW5oviIXHu->^ +zy$9-%#d-LI!D~`aMXeUe^776pdf*;Y_gQ_?0G?B(X;Y^E^?%GvibMtsK#!~Xk{V~u +z31{FL{`E51m8vF^}biF#8wt3l5ox6BK5Abi>e`N*u#=wfz>~(I_FHl +zq*ilBYDYZGO)H(PG(Flu%+Zn63yrFqG!D<=+RDe|qEz?bT +z^uq}fpOKI3(H3CgW6yv(G>sW?9QT;|_Fr}O9L@KXy7u}cpatk!R@c`*HkUtPl6v@t +zQ-pJ*+g2*}l^TS+JB$RsBlASirym;G(i@Y5W1o0dI3RD;=bOta#FmX~Fh?BPE>pr1 +zka`r=E3Wm4@NvT>s4RGbxYCJ})2MsyrlUP8rvDT27UOh3Oi4~Zrp8l@*fG}u3RMjS +z_n!8qSEKp8ejOQYStED)^zgDmj3m5WcqOa(*mfD?x0v&ef+y0nnr?Qs&RKGt7i2%Q +zT@Ia>z2bMCRFsSBE3M{Ib9J_wD(A +zgYDJyhf({AGmjQ-UW2XF +zMYouva27FgLzGr66H@d=J*~ZeSMsB7$R1J5($G>)g}A57qEr#%rd65Rgu(VlwPsV) +za&gl1W{M)`eJ?vM<(Z;o$?4D6A+owMm7ZZ3YkYv}hgJ7a)a>2v?5friuC#;^_i=8j +z!?lX3sBH?z<4SY}LqOIz<^>Hh^VGvV`I>;MYBZA&PI;ct|yw^{gQ{%4#BZyMI4;XLYu@Z;`PgOWajd!i>|vqL5rn6R(v?49-=iV(%T-oPu^Yl=|$K=g|G>&HG*{)*Qg +zn0O!1yl?oi?zPsEz5GkK-SJ=V>-C=e{eQbJUblBO+Hvx+nO~rVTZb%fAJH9l@`pcJ +z+)?GhDRri+b8gD>R*AqvY6(PNIr{bL{OvA4$<~ThgpLG?GM`1bFl_)35A38iv*-Hl +zpR`klA1RzEe~wY1gE=Rg)pc1$yQ^8}Ff6>)FPpOfchK1h>W`Fr$|=AK13KZ1u#nug +z!U=}nHmtQ)taISst|qO!{s%HC7OFFgfZe%nt)jLAi^O&sL>~d_s(y%22@8>ttJaFT +z&b15P?ID)8S#t3`G*zu`pqn_n0QU(Bf~PrQG`ChrGY>zi&K@DW=V2yxr>X=(srECP +zPTU#_tRo)V_^I+N3C?_t12=0CXMHFXab +zy7j6(#p!pg{n&GdRpr}G;U%+>5-dLAjK#xS+gK&`}5rCR0q^`|R`$xL9O^6Ey-?T$HIKI4so!BJIC~;0fxb_L)R>S7pLG +z=Tp@ZT*G^afoTxHz%?CgxLdoTsMEzJn!f9BD5K-p(>!Bg?5mk&(MsHQSRtQ$LTJg-wLj}oOX60V_{Nqs +z8iMZerw))G!QtJM1z?s3cV`-7S4-t?(@)y=@w=cyY^X54vDxdRKi*@D{We6rjamx| +z@^<6FJg|3phr9_LDsO`OzJKV$mat)B>L(o-!p`tY(8(H6aiYM^er0m@3*KLKH)I;g +z5BiBkD+`kGIp)BCUMs_H?4Q5DN1xg+&)|EYo_YU)tFAcRWFH9n+#JQQ=$m8f69-Su +z&OTVsb8M&Nx^D5$E9>Y?bVN4!E6~5tdk_5sIk|P=)UBOBfn&?kEvBtREB +z1W2H)xU=M&nK$oQ?OiJ&j +z{~8UZ3d4OvO_X1k63I;sWMO!bMSAd&5BX8RpMFo!JrssQT!^fzqeUfe&=yM#keSaa +zC(u?3(Mz_qWFwsr3n6SI^N@g5Xl6ni_H44PDbpGydBxRpw6c0O7mvXHrrAtrPlU9P +zDj60i1daP!oW`5WbGLJ@=Sl6qybd~s{8Ov$#I)nT_po)Jy~l= +z>&RR^cMy9Hbvy`n*e5`?A6!y^CAX-FH|1Pe0IA?5Q(_X@)O*x7Z#XciSc1 +zT(O<5>jF-fwl(U$Uo%J$Q@WVLMmktbI@__`7)48!;kT{?t<^j!@=0;NrnmO0=1aqg +zNl0~hqX3bVzhSwE+z-JuQ(8fbC|KC;-01n#zXp1F=w-6sv?1U{8~TQ1S!mtz=dF%Z +z-Wu}$h^~z<(cRNOK55!X*x0fxA4fS1#*9U_syZyj{u~ +zExN7Q&X#+5RGb~SXBX8eihqE4CazI?f=kPn0p?glH!O3vhw!wLQ=A2ePr7)n?9{v1 +zcntq*hNu>Y@#UAa7Pd&+pX{4g*8gfp0gLik=&3Drn26+C-U0jA=zLTN=C=6y7fQs6 +zuaXD5xSAZbTx_)qDwjH&1xTx2Dw;6;mpKE%=YodF_e>EIIoHA +z*jnt0>p9V{TCQ*qy~f1{5RaFkaDlF0yx9v!KnVscUgZ$hLPsr}W +zyg;pa6jG@wj-B4n%(DK8F)QQ;TREDBtdjf?uwYk8MzU&2bR*y?Bbn>6<(RYU8g@dQ +zzXjvi2(zsxv4pfQ$v|hoxb`cDQYw+1KUKv&v%OE|H5xAZdDyN*2-9PKJfSky+zS>N +zwAuSVHC$siZ3WhR>$a0Z=7k(#6SUOHCU+<#?bi4HytHetbeBr83G{b#TIJkGz505~ +z2Y^lvW3vN}ZK~W)LTXFJNMwUn(Xe9yK!W=KKI&6q}qw=vV!@ssHUb3nzlZlegpMm9-tSc(7X43;@CU)*BfAM!evRU +zxtAK;40*H(!4f~{7Mm+1#4QXErmxoj*R8+qpI~-DLM%04H?y(dstxP%cq`TLQjH0Q +zChmg}X>x2Z1FXAHAU@Hfo%wmd)+`v(?*(_d`%$J^YB51&58;Ow0fgqiBNf1i(_eEr +zdGq6%EPay=9+sx05>ZbG{v`ISVM|D+Q|8nRpkMKFGDJ4A$}YY{`J);A;!a6zM{meP +zz<_xO(e*L92w6g@M@kQB*N0d*<}4#XZ_)UC);Qf4g6>NuCMdR<*GFK_Am<4$QL+vU +z`<8o0{|Yr3gJnXQOb_LM+Doy=?!$+3y;o9*7QjCt(BHUyadzrV8hODzFXlE|0| +z`@y!eT0}%fsg?38ufFAUL{c_35^_sQ;B%@DNQ{UlYI(-dH|=h?A#$Pxy&ftrLLAKm +z>>%tpFrFnfRk|86q +Date: Fri, 2 Oct 2020 11:44:31 +0200 +Subject: [PATCH] add rst and md in parallel + +which should help rst +--- + .gitignore | 2 +- + README.md | 291 +++++++++++++++++++++++++++++++++++++++++++ + README => README.rst | 0 + 3 files changed, 292 insertions(+), 1 deletion(-) + create mode 100644 README.md + rename README => README.rst (100%) + +diff --git a/.gitignore b/.gitignore +index a3e180ca..893dd74d 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -67,6 +67,7 @@ TAGS + /fmt + + # More generated files ++compile_commands.json + build-aux/ar-lib + build-aux/test-driver + tests/test-suite.log +@@ -75,7 +76,6 @@ tests/test-fc.pl + tests/test-norm.pl + tests/test-upr.pl + Doxyfile +-README.md + doc/footer + doc/html + doc/man +diff --git a/README.md b/README.md +new file mode 100644 +index 00000000..6045165b +--- /dev/null ++++ b/README.md +@@ -0,0 +1,291 @@ ++Safe C Library - README ++======================= ++[![safeclib support vis xs:code](doc/safeclib-banner.png)](https://xscode.com/rurban/safeclib) ++ ++:toc: ++ ++ ++Copying ++------- ++ ++This project's licensing restrictions are documented in the file 'COPYING' ++under the root directory of this release. Basically it's MIT licensed. ++ ++Overview ++-------- ++ ++This library implements the secure C11 Annex K functions on top of most libc ++implementations, which are missing from them. ++ ++The ISO TR24731 Bounds Checking Interface documents indicate that the key ++motivation for the new specification is to help mitigate the ever increasing ++security attacks, specifically the buffer overrun. ++ ++The rationale document says ``Buffer overrun attacks continue to be a security ++problem. Roughly 10% of vulnerability reports cataloged by CERT from ++01/01/2005 to 07/01/2005 involved buffer overflows. Preventing buffer overruns ++is the primary, but not the only, motivation for this technical report.'' ++ ++The rationale document continues ``that these only mitigate, that is lessen, ++security problems. When used properly, these functions decrease the danger ++buffer overrun attacks. Source code may remain vulnerable due to other bugs ++and security issues. The highest level of security is achieved by building in ++layers of security utilizing multiple strategies.'' ++ ++.The rationale document lists the following key points for TR24731: ++- Guard against overflowing a buffer ++- Do not produce unterminated strings ++- Do not unexpectedly truncate strings ++- Provide a library useful to existing code ++- Preserve the null terminated string datatype ++- Only require local edits to programs ++- Library based solution ++- Support compile-time checking ++- Make failures obvious ++- Zero buffers, null strings ++- Runtime-constraint handler mechanism ++- Support re-entrant code ++- Consistent naming scheme ++- Have a uniform pattern for the function parameters and return type ++- Deference to existing technology ++ ++and the following can be added... ++ ++- provide a library of functions with like behavior ++- provide a library of functions that promote and increase code safety and ++ security ++- provide a library of functions that are efficient ++ ++The C11 Standard adopted many of these points, and added some secure ++`_s` variants in the Annex K. The Microsoft Windows/MINGW secure API ++did the same, but deviated in some functions from the standard. ++Besides Windows (with its msvcrt, ucrt, reactos msvcrt and wine msvcrt ++variants) only the unused stlport, Android's Bionic, Huawei securec ++and Embarcadero implemented this C11 secure Annex K API so far. They ++are still missing from glibc, musl, FreeBSD, darwin and DragonFly ++libc, OpenBSD libc, newlib, dietlibc, uClibc, minilibc. ++ ++Design Considerations ++--------------------- ++ ++This library implements since 3.0 all functions defined in the ++specifications. Included in the library are extensions to the specification ++to provide a complementary set of functions with like behavior. ++ ++This library is meant to be used on top of all the existing libc's ++which miss the secure C11 functions. Of course tighter integration ++into the system libc would be better, esp. with the printf, scanf and ++IO functions. See the seperate [libc-overview](doc/libc-overview.md) document. ++ ++Austin Group Review of ISO/IEC WDTR 24731 ++http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1106.txt ++ ++C11 standard (ISO/IEC 9899:2011) ++http://en.cppreference.com/w/c ++ ++Stackoverflow discussion: ++https://stackoverflow.com/questions/372980/do-you-use-the-tr-24731-safe-functions ++ ++DrDobbs review ++http://www.drdobbs.com/cpp/the-new-c-standard-explored/232901670 ++ ++C17 reconsidered safeclib but looked only at the old incomplete Cisco version, ++not our complete and fixed version. ++http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm ++ ++* Use of errno ++ ++The TR24731 specification says an implementation may set errno for the ++functions defined in the technical report, but is not required to. ++This library does not set `errno` in most functions, only in ++bsearch_s, fscanf_s, fwscanf_s, gets_s, gmtime_s, localtime_s, ++scanf_s, sscanf_s, swscanf_s, strtok_s, vfscanf_s, ++vfwscanf_s, vsscanf_s, vswscanf_s, wcstok_s, wscanf_s. ++ ++In most cases the safeclib extended ES* errors do not set errno, only ++when the underlying insecure system call fails, errno is set. The ++library does use `errno` return codes as required by functional APIs. ++Specific Safe C String and Safe C Memory errno codes are defined in ++the `safe_errno.h` file. ++ ++* Runtime-constraints ++ ++Per the spec, the library verifies that the calling program does not violate ++the function's runtime-constraints. If a runtime-constraint is violated, the ++library calls the currently registered runtime-constraint handler. ++ ++Per the spec, multiple runtime-constraint violations in the same call to a ++library function result in only one call to the runtime-constraint handler. ++The first violation encountered invokes the runtime-constraint handler. ++ ++With `--disable-constraint-handler` calling the runtime-constraint handler ++can be disabled, saving some memory, but not much run-time performance. ++ ++The runtime-constraint handler might not return. If the handler does ++return, the library function whose runtime-constraint was violated ++returns an indication of failure as given by the function’s return. ++With valid dest and dmax values, dest is cleared. With the optional ++`--disable-null-slack` only the first value of dest is cleared, ++otherwise the whole dest buffer. ++ ++rsize_t:: ++ The specification defines a new type. This type, rsize_t, is ++ conditionally defined in the safe_lib.h header file. ++ ++RSIZE_MAX:: ++ The specification defines the macro RSIZE_MAX which expands to a value ++ of type rsize_t. The specification uses RSIZE_MAX for both the string ++ functions and the memory functions. This implementation defines two ++ macros: RSIZE_MAX_STR and RSIZE_MAX_MEM. RSIZE_MAX_STR defines the ++ range limit for the safe string functions. RSIZE_MAX_MEM defines the ++ range limit for the safe memory functions. The point is that string ++ limits can and should be different from memory limits. ++ There also exist RSIZE_MAX_WSTR, RSIZE_MAX_MEM16, RSIZE_MAX_MEM32. ++ ++* Compile-time constraints ++ ++With supporting compilers the dmax overflow checks and several more ++are performed at compile-time. Currently only since clang-5 with ++`diagnose_if` support. This checks similar to `_FORTIFY_SOURCE=2` if ++the `__builtin_object_size` of the dest buffer is the same size as ++dmax, and errors if dmax is too big. With the optional ++`--enable-warn-dmax` it prints a warning if the sizes are different, ++which is esp. practical as compile-time warning. It can be promoted ++via the optional `--enable-error-dmax` to be fatal. On unsupported ++compilers, the overflow check and optional equality warn-dmax check is ++deferred to run-time. This check is only possible with ++`__builtin_object_size` and `-O2` when the dest buffer size is known ++at compile-time, otherwise only the simplier `dest == NULL`, `dmax == ++0` and `dmax > RSIZE_MAX` checks are performed. ++ ++* Header Files ++ ++The specification states the various functions would be added to ++existing Standard C header files: stdio.h, string.h, etc. This ++implementation separates the memory related functions into the ++`safe_mem_lib.h` header, the string related functions into the ++`safe_str_lib.h` header, and the rest into the `safe_lib.h` ++header. There are also the internal `safe_compile.h`, `safe_config.h` ++`safe_lib_errno.h` and `safe_types.h` headers, but they do not need to ++be included. ++ ++The make file builds a single library `libsafec-VERSION.a` and `.so`. ++Built but not installed are also libmemprims, libsafeccore and libstdunsafe. ++ ++It is possible to split the make such that a separate `safe_mem_lib.so` and ++`safe_str_lib.so` are built. It is also possible to integrate the prototypes ++into the Standard C header files, but that may require changes to your ++development tool chain. ++ ++ ++Userspace Library ++----------------- ++The build system for the userspace library is the well known *GNU build ++system*, a.k.a. Autotools. This system is well understood and supported ++by many different platforms and distributions which should allow this ++library to be built on a wide variety of platforms. See the ++xref:tested-platforms[``Tested Platforms''] section for details on what ++platforms this library was tested on during its development. ++ ++* Building ++ ++For those familiar with autotools you can probably skip this part. For those ++not and want to get right to building the code see below. And, for those that ++need additional information see the 'INSTALL' file in the same directory. ++ ++.To build you do the following: ++ ++ $ ./build-aux/autogen.sh ++ $ ./configure ++ $ make ++ ++`autogen.sh` only needs to be run if you are building from the git ++repository. Optionally, you can do `make check` if you want to run the unit ++tests. ++ ++ ++* Installing ++ ++Installation must be preformed by `root`, an `Administrator' on most ++systems. The following is used to install the library. ++ ++ $ sudo make install ++ ++Safe Linux Kernel Module ++------------------------ ++The build for the kernel module has not been integrated into the autotools ++build infrastructure. Consequently, you have to run a different makefile to ++build the kernel module. ++ ++ ++* Building ++ ++.To build do the following: ++ ++ $ ./configure --disable-wchar ++ $ make -f Makefile.kernel ++ ++ ++This assumes you are compiling on a Linux box and this makefile supports the ++standard kernel build system infrastructure documented in: ++/Documentation/kbuild/modules.txt ++ ++NOTE: If you build the kernel module then wish to build the userspace library ++ or vice versa you will need to do a +make clean+ otherwise a +make check+ ++ will fail to build. ++ ++ ++* Installing ++ ++The kernel module will be found at the root of the source tree called ++'slkm.ko'. The file 'testslkm.ko' are the unit tests run on the userspace ++library but in Linux kernel module form to verify functionality within the ++kernel. ++ ++ ++[[tested-platforms]] ++Tested Platforms ++---------------- ++ ++.The library has been tested on the following systems: ++- Linux Fedora core 31 - 32 amd64/i386 glibc 2.28 - 2.31 (all gcc's + clang's) ++- Mac OS X 10.6-12 w/ Apple developer tools and macports (all gcc's + clang's) ++- Linux Debian 9 - 11 amd64/i386 glibc 2.24 - 2.28 (all gcc's + clang's) ++- Linux centos 7 amd64 ++- Linux Void amd64 musl-1.1.16 ++- x86_64-w64-mingw32 native and cross-compiled ++- i686-w64-mingw32 native, and cross-compiled and tested under wine ++- i386-mingw32 cross-compiled ++- cygwin32 gcc (newlib) ++- cygwin64 gcc -std=c99 (newlib) ++- freebsd 10 - 12 amd64 ++- linux docker images under qemu: ++ i386/debian, x86_64/rhel, arm32v7/debian, aarch64: arm64v8/{debian,centos,rhel,fedora}, ++ s390x/fedora (the only big endian test I could find), ppc64le/{debian,ubuntu,fedora,centos,rhel} ++- User Mode Linux (UML), Linux kernel version v3.5.3 w/ Debian Squeeze rootfs ++ ++with most available compilers. See `build-aux/smoke.sh` and the various CI configs. ++- https://travis-ci.org/github/rurban/safeclib/ ++- https://ci.appveyor.com/project/rurban/safeclib/ ++- https://cirrus-ci.com/github/rurban/safeclib ++- https://cloud.drone.io/rurban/safeclib/ ++ ++Known Issues ++------------ ++1. If you are building the library from the git repository you will have to ++ first run `build-aux/autogen.sh` which runs autoreconf to ``install'' the ++ autotools files and create the configure script. ++ ++[bibliography] ++.References ++- [[[1]]] Programming languages, their environments and system software ++ interfaces, Extensions to the C Library, Part I: Bounds-checking ++ interfaces, ISO/IEC TR 24731-1. ++- [[[2]]] Rationale for TR 24731 Extensions to the C Library Part I: ++ Bounds-checking interfaces, ISO/IEC JTC1 SC22 WG14 N1225. ++- [[[3]]] The Open Group Base Specifications Issue 7 ++ http://pubs.opengroup.org/onlinepubs/9699919799/functions/contents.html ++- [[[4]]] CERT C Secure Coding Standard ++ https://www.securecoding.cert.org/confluence/display/seccode/CERT+C+Secure+Coding+Standard ++- [[[5]]] C11 Standard (ISO/IEC 9899:2011) Annex K ++- [[[6]]] DrDobbs review http://www.drdobbs.com/cpp/the-new-c-standard-explored/232901670 +diff --git a/README b/README.rst +similarity index 100% +rename from README +rename to README.rst diff --git a/meta-oe/recipes-core/safec/safec/0015-generate-README.rst.patch b/meta-oe/recipes-core/safec/safec/0015-generate-README.rst.patch new file mode 100644 index 000000000..23597138a --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0015-generate-README.rst.patch @@ -0,0 +1,917 @@ +From 33d961cb6f9a2728e12c919f4a25bb6916f2605b Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Fri, 2 Oct 2020 12:54:12 +0200 +Subject: [PATCH] generate README.rst + +fixup some MD markups +--- + Makefile.am | 43 ++--- + README.md | 121 +++++++------- + README.rst | 455 ++++++++++++++++++++++++++++------------------------ + 3 files changed, 335 insertions(+), 284 deletions(-) + +diff --git a/Makefile.am b/Makefile.am +index 7736025c..b917e77a 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -51,7 +51,8 @@ dist_pkginclude_HEADERS = \ + + # Support files + SAFEC_INFRA = \ +- $(top_srcdir)/README \ ++ $(top_srcdir)/README.md \ ++ README.rst \ + ${top_srcdir}/build-aux/autogen.sh \ + ${top_srcdir}/build-aux/msys2.bat \ + ${top_srcdir}/build-aux/smoke.sh \ +@@ -480,41 +481,46 @@ dist_man_MANS += \ + # doc/man/man3/WCSNORM_NFKC.3 \ + # doc/man/man3/WCSNORM_NFKD.3 + #endif +-CLEANFILES += Doxyfile doc/footer README.md ++CLEANFILES += Doxyfile doc/footer ++MAINTAINERCLEANFILES = *~ README.rst + + # avoid parallel doxygen + $(dist_man_MANS) :: +-doc/man/man3/EOK.3 :: Doxyfile README.md doc/footer include/safe_config.h ++doc/man/man3/EOK.3 :: Doxyfile README.rst doc/footer include/safe_config.h + -rm $@ + doxygen + +-docs man: Doxyfile doc/footer $(BUILT_SOURCES) README.md \ ++docs man: Doxyfile doc/footer $(BUILT_SOURCES) README.rst \ + doc/man/man1/check_for_unsafe_apis.1 doc/man/man3/EOK.3 + -rm -rf doc/man/man3/d[0-9a-f] + -rm doc/man/man3/_*.3 ++ -rm doc/man/man3/v.3 ++ -rm doc/man/man3/_*_chk.3 + -rm doc/man/man3/slk_*.3 + -rm doc/man/man3/BOS*.3 +- -rm doc/man/man3/VAL_OVR2* + -rm doc/man/man3/HAVE___BUILTIN_CONSTANT_P.3 + -rm doc/man/man3/HAVE___BUILTIN_OBJECT_SIZE.3 ++ -rm doc/man/man3/UNWIF_*.3 ++ -rm doc/man/man3/TBL.3 + -rm doc/man/man3/VAL_OVR2* +- -rm doc/man/man3/{wmask,wsize,likely,unlikely}.3 ++ -rm doc/man/man3/{wmask,wsize}.3 ++ -rm doc/man/man3/ASM_VOLATILE.3 + -rm doc/man/man3/CASE*.3 + -rm doc/man/man3/DRV*.3 +- -rm doc/man/man3/INLINE.3 +- -rm doc/man/man3/EOVERFLOW.3 +- -rm doc/man/man3/EXPORT_SYMBOL.3 +- -rm doc/man/man3/EXPORT.3 ++ -rm doc/man/man3/DISABLE_DLLIMPORT.3 + -rm doc/man/man3/EXTERN.3 ++ -rm doc/man/man3/errno_t.3 + -rm doc/man/man3/Hangul*.3 + -rm doc/man/man3/hangul.h.3 ++ -rm doc/man/man3/seqindex_* ++ -rm doc/man/man3/*case_seqindex.3 ++ -rm doc/man/man3/UINT16_MAX.3 + -rm doc/man/man3/UNWIF_*.3 + -rm doc/man/man3/README* ++ -rm doc/man/man3/__STDC_WANT_LIB_EXT1__.3 ++ -rm doc/man/man3/__WORDSIZE.3 + -rm doc/man/man3/MODULE*.3 +- -rm doc/man/man3/NDEBUG.3 + -rm doc/man/man3/NORMALIZE_IND_TBL.3 +- -rm doc/man/man3/RCNEGATE.3 +- -rm doc/man/man3/SAFECLIB_ENABLE_UNSAFE.3 + -rm doc/man/man3/is*.3 + -rm doc/man/man3/debruijn32.3 + -rm doc/man/man3/errmsgs_s.3 +@@ -530,10 +536,7 @@ docs man: Doxyfile doc/footer $(BUILT_SOURCES) README.md \ + -rm doc/man/man3/pntz.3 + -rm doc/man/man3/pos.3 + -rm doc/man/man3/sl_default_handler.3 +- -rm doc/man/man3/slabort.3 +- -rm doc/man/man3/sldebug_printf.3 + -rm doc/man/man3/slkm_init.c.3 +- -rm doc/man/man3/slprintf.3 + -rm doc/man/man3/module_{exit,init}.3 + -rm doc/man/man3/sift.3 + -rm doc/man/man3/v.3 +@@ -541,6 +544,10 @@ docs man: Doxyfile doc/footer $(BUILT_SOURCES) README.md \ + -rm doc/man/man3/todo.3 + -rm doc/man/man3/tbl2.3 + -rm doc/man/man3/tbl3.3 ++ -rm doc/man/man3/unsafe_get_property.3 ++ -rm doc/man/man3/unw16if*.h.3 ++ -rm doc/man/man3/unwif*.h.3 ++ -rm doc/man/man3/wsize.3 + -rm doc/man/man3/md_doc_libc-overview.3 + -rm doc/man/man3/libc-overview.md.3 + -rm doc/man/man3/len{_errmsgs_s,}.3 +@@ -554,8 +561,8 @@ docs man: Doxyfile doc/footer $(BUILT_SOURCES) README.md \ + -rm doc/man/man3/handle_{,w,mem_}error.3 + -rm doc/man/man3/handle_{str,mem}_bos_*.3 + -rm doc/man/man3/handle_str_src_bos_*.3 +-README.md: README +- cp $(srcdir)/README README.md ++README.rst: README.md ++ pandoc -o README.rst README.md + all-local: Doxyfile doc/footer + clean-local: + rm -rf $(builddir)/doc/html +diff --git a/README.md b/README.md +index 6045165b..dc025dd0 100644 +--- a/README.md ++++ b/README.md +@@ -2,9 +2,6 @@ Safe C Library - README + ======================= + [![safeclib support vis xs:code](doc/safeclib-banner.png)](https://xscode.com/rurban/safeclib) + +-:toc: +- +- + Copying + ------- + +@@ -14,25 +11,26 @@ under the root directory of this release. Basically it's MIT licensed. + Overview + -------- + +-This library implements the secure C11 Annex K functions on top of most libc ++This library implements the secure C11 Annex K[^5] functions on top of most libc + implementations, which are missing from them. + + The ISO TR24731 Bounds Checking Interface documents indicate that the key + motivation for the new specification is to help mitigate the ever increasing +-security attacks, specifically the buffer overrun. ++security attacks, specifically the buffer overrun.[^1] + +-The rationale document says ``Buffer overrun attacks continue to be a security ++The rationale document says _"Buffer overrun attacks continue to be a security + problem. Roughly 10% of vulnerability reports cataloged by CERT from + 01/01/2005 to 07/01/2005 involved buffer overflows. Preventing buffer overruns +-is the primary, but not the only, motivation for this technical report.'' ++is the primary, but not the only, motivation for this technical report."_[^2] + +-The rationale document continues ``that these only mitigate, that is lessen, ++The rationale document continues _"that these only mitigate, that is lessen, + security problems. When used properly, these functions decrease the danger + buffer overrun attacks. Source code may remain vulnerable due to other bugs + and security issues. The highest level of security is achieved by building in +-layers of security utilizing multiple strategies.'' ++layers of security utilizing multiple strategies."_[^2] ++ ++The rationale document lists the following key points for TR24731: + +-.The rationale document lists the following key points for TR24731: + - Guard against overflowing a buffer + - Do not produce unterminated strings + - Do not unexpectedly truncate strings +@@ -69,7 +67,7 @@ Design Considerations + --------------------- + + This library implements since 3.0 all functions defined in the +-specifications. Included in the library are extensions to the specification ++specifications.[^3] Included in the library are extensions to the specification + to provide a complementary set of functions with like behavior. + + This library is meant to be used on top of all the existing libc's +@@ -83,10 +81,12 @@ http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1106.txt + C11 standard (ISO/IEC 9899:2011) + http://en.cppreference.com/w/c + ++CERT C Secure Coding Standard[^4] ++ + Stackoverflow discussion: + https://stackoverflow.com/questions/372980/do-you-use-the-tr-24731-safe-functions + +-DrDobbs review ++DrDobbs review[^6] + http://www.drdobbs.com/cpp/the-new-c-standard-explored/232901670 + + C17 reconsidered safeclib but looked only at the old incomplete Cisco version, +@@ -98,11 +98,11 @@ http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm + The TR24731 specification says an implementation may set errno for the + functions defined in the technical report, but is not required to. + This library does not set `errno` in most functions, only in +-bsearch_s, fscanf_s, fwscanf_s, gets_s, gmtime_s, localtime_s, +-scanf_s, sscanf_s, swscanf_s, strtok_s, vfscanf_s, +-vfwscanf_s, vsscanf_s, vswscanf_s, wcstok_s, wscanf_s. ++`bsearch_s`, `fscanf_s`, `fwscanf_s`, `gets_s`, `gmtime_s`, `localtime_s`, ++`scanf_s`, `sscanf_s`, `swscanf_s`, `strtok_s`, `vfscanf_s`, ++`vfwscanf_s`, `vsscanf_s`, `vswscanf_s`, `wcstok_s`, `wscanf_s`. + +-In most cases the safeclib extended ES* errors do not set errno, only ++In most cases the safeclib extended ES* errors do not set `errno`, only + when the underlying insecure system call fails, errno is set. The + library does use `errno` return codes as required by functional APIs. + Specific Safe C String and Safe C Memory errno codes are defined in +@@ -128,19 +128,19 @@ With valid dest and dmax values, dest is cleared. With the optional + `--disable-null-slack` only the first value of dest is cleared, + otherwise the whole dest buffer. + +-rsize_t:: +- The specification defines a new type. This type, rsize_t, is +- conditionally defined in the safe_lib.h header file. ++`rsize_t` ++ The specification defines a new type. This type, `rsize_t`, is ++ conditionally defined in the `safe_lib.h` header file. + +-RSIZE_MAX:: +- The specification defines the macro RSIZE_MAX which expands to a value +- of type rsize_t. The specification uses RSIZE_MAX for both the string ++`RSIZE_MAX` ++ The specification defines the macro `RSIZE_MAX` which expands to a value ++ of type `rsize_t`. The specification uses `RSIZE_MAX` for both the string + functions and the memory functions. This implementation defines two +- macros: RSIZE_MAX_STR and RSIZE_MAX_MEM. RSIZE_MAX_STR defines the +- range limit for the safe string functions. RSIZE_MAX_MEM defines the ++ macros: `RSIZE_MAX_STR` and `RSIZE_MAX_MEM`. `RSIZE_MAX_STR` defines the ++ range limit for the safe string functions. `RSIZE_MAX_MEM` defines the + range limit for the safe memory functions. The point is that string + limits can and should be different from memory limits. +- There also exist RSIZE_MAX_WSTR, RSIZE_MAX_MEM16, RSIZE_MAX_MEM32. ++ There also exist `RSIZE_MAX_WSTR`, `RSIZE_MAX_MEM16`, `RSIZE_MAX_MEM32`. + + * Compile-time constraints + +@@ -155,8 +155,8 @@ via the optional `--enable-error-dmax` to be fatal. On unsupported + compilers, the overflow check and optional equality warn-dmax check is + deferred to run-time. This check is only possible with + `__builtin_object_size` and `-O2` when the dest buffer size is known +-at compile-time, otherwise only the simplier `dest == NULL`, `dmax == +-0` and `dmax > RSIZE_MAX` checks are performed. ++at compile-time, otherwise only the simplier `dest == NULL`, `dmax == 0` ++and `dmax > RSIZE_MAX` checks are performed. + + * Header Files + +@@ -184,20 +184,20 @@ The build system for the userspace library is the well known *GNU build + system*, a.k.a. Autotools. This system is well understood and supported + by many different platforms and distributions which should allow this + library to be built on a wide variety of platforms. See the +-xref:tested-platforms[``Tested Platforms''] section for details on what ++[Tested platforms](#tested-platforms) section for details on what + platforms this library was tested on during its development. + + * Building + + For those familiar with autotools you can probably skip this part. For those + not and want to get right to building the code see below. And, for those that +-need additional information see the 'INSTALL' file in the same directory. ++need additional information see the `INSTALL` file in the same directory. + +-.To build you do the following: ++To build you do the following: + +- $ ./build-aux/autogen.sh +- $ ./configure +- $ make ++ ./build-aux/autogen.sh ++ ./configure ++ make + + `autogen.sh` only needs to be run if you are building from the git + repository. Optionally, you can do `make check` if you want to run the unit +@@ -206,10 +206,10 @@ tests. + + * Installing + +-Installation must be preformed by `root`, an `Administrator' on most ++Installation must be preformed by `root`, an `Administrator` on most + systems. The following is used to install the library. + +- $ sudo make install ++ sudo make install + + Safe Linux Kernel Module + ------------------------ +@@ -222,32 +222,30 @@ build the kernel module. + + .To build do the following: + +- $ ./configure --disable-wchar +- $ make -f Makefile.kernel +- ++ ./configure --disable-wchar ++ make -f Makefile.kernel + + This assumes you are compiling on a Linux box and this makefile supports the + standard kernel build system infrastructure documented in: +-/Documentation/kbuild/modules.txt ++`/usr/src/linux-kernel/Documentation/kbuild/modules.txt` + + NOTE: If you build the kernel module then wish to build the userspace library +- or vice versa you will need to do a +make clean+ otherwise a +make check+ ++ or vice versa you will need to do a `make clean` otherwise a `make check` + will fail to build. + + + * Installing + + The kernel module will be found at the root of the source tree called +-'slkm.ko'. The file 'testslkm.ko' are the unit tests run on the userspace ++`slkm.ko`. The file `testslkm.ko` are the unit tests run on the userspace + library but in Linux kernel module form to verify functionality within the + kernel. + +- +-[[tested-platforms]] + Tested Platforms + ---------------- + +-.The library has been tested on the following systems: ++The library has been tested on the following systems: ++ + - Linux Fedora core 31 - 32 amd64/i386 glibc 2.28 - 2.31 (all gcc's + clang's) + - Mac OS X 10.6-12 w/ Apple developer tools and macports (all gcc's + clang's) + - Linux Debian 9 - 11 amd64/i386 glibc 2.24 - 2.28 (all gcc's + clang's) +@@ -265,6 +263,7 @@ Tested Platforms + - User Mode Linux (UML), Linux kernel version v3.5.3 w/ Debian Squeeze rootfs + + with most available compilers. See `build-aux/smoke.sh` and the various CI configs. ++ + - https://travis-ci.org/github/rurban/safeclib/ + - https://ci.appveyor.com/project/rurban/safeclib/ + - https://cirrus-ci.com/github/rurban/safeclib +@@ -273,19 +272,25 @@ with most available compilers. See `build-aux/smoke.sh` and the various CI confi + Known Issues + ------------ + 1. If you are building the library from the git repository you will have to +- first run `build-aux/autogen.sh` which runs autoreconf to ``install'' the ++ first run `build-aux/autogen.sh` which runs autoreconf to `install` the + autotools files and create the configure script. + +-[bibliography] +-.References +-- [[[1]]] Programming languages, their environments and system software +- interfaces, Extensions to the C Library, Part I: Bounds-checking +- interfaces, ISO/IEC TR 24731-1. +-- [[[2]]] Rationale for TR 24731 Extensions to the C Library Part I: +- Bounds-checking interfaces, ISO/IEC JTC1 SC22 WG14 N1225. +-- [[[3]]] The Open Group Base Specifications Issue 7 +- http://pubs.opengroup.org/onlinepubs/9699919799/functions/contents.html +-- [[[4]]] CERT C Secure Coding Standard +- https://www.securecoding.cert.org/confluence/display/seccode/CERT+C+Secure+Coding+Standard +-- [[[5]]] C11 Standard (ISO/IEC 9899:2011) Annex K +-- [[[6]]] DrDobbs review http://www.drdobbs.com/cpp/the-new-c-standard-explored/232901670 ++References ++---------- ++ ++[^1]: Programming languages, their environments and system software ++ interfaces, Extensions to the C Library, Part I: Bounds-checking ++ interfaces, ISO/IEC TR 24731-1. ++ ++[^2]: Rationale for TR 24731 Extensions to the C Library Part I: ++ Bounds-checking interfaces, ISO/IEC JTC1 SC22 WG14 N1225. ++ ++[^3]: The Open Group Base Specifications Issue 7 ++ http://pubs.opengroup.org/onlinepubs/9699919799/functions/contents.html ++ ++[^4]: CERT C Secure Coding Standard ++ https://www.securecoding.cert.org/confluence/display/seccode/CERT+C+Secure+Coding+Standard ++ ++[^5]: C11 Standard (ISO/IEC 9899:2011) Annex K ++ ++[^6]: DrDobbs review http://www.drdobbs.com/cpp/the-new-c-standard-explored/232901670 +diff --git a/README.rst b/README.rst +index c35a7e7c..89aba341 100644 +--- a/README.rst ++++ b/README.rst +@@ -1,292 +1,331 @@ + Safe C Library - README + ======================= +-.. image:: doc/safeclib-banner.png +-`safeclib support via xs:code `_ +- +-:toc: + ++|safeclib support vis xs:code| + + Copying + ------- + +-This project's licensing restrictions are documented in the file 'COPYING' +-under the root directory of this release. Basically it's MIT licensed. ++This project’s licensing restrictions are documented in the file ++‘COPYING’ under the root directory of this release. Basically it’s MIT ++licensed. + + Overview + -------- + +-This library implements the secure C11 Annex K functions on top of most libc +-implementations, which are missing from them. +- +-The ISO TR24731 Bounds Checking Interface documents indicate that the key +-motivation for the new specification is to help mitigate the ever increasing +-security attacks, specifically the buffer overrun. +- +-The rationale document says ``Buffer overrun attacks continue to be a security +-problem. Roughly 10% of vulnerability reports cataloged by CERT from +-01/01/2005 to 07/01/2005 involved buffer overflows. Preventing buffer overruns +-is the primary, but not the only, motivation for this technical report.'' +- +-The rationale document continues ``that these only mitigate, that is lessen, +-security problems. When used properly, these functions decrease the danger +-buffer overrun attacks. Source code may remain vulnerable due to other bugs +-and security issues. The highest level of security is achieved by building in +-layers of security utilizing multiple strategies.'' +- +-.The rationale document lists the following key points for TR24731: +-- Guard against overflowing a buffer +-- Do not produce unterminated strings +-- Do not unexpectedly truncate strings +-- Provide a library useful to existing code +-- Preserve the null terminated string datatype +-- Only require local edits to programs +-- Library based solution +-- Support compile-time checking +-- Make failures obvious +-- Zero buffers, null strings +-- Runtime-constraint handler mechanism +-- Support re-entrant code +-- Consistent naming scheme +-- Have a uniform pattern for the function parameters and return type +-- Deference to existing technology +- +-and the following can be added... +- +-- provide a library of functions with like behavior +-- provide a library of functions that promote and increase code safety and +- security +-- provide a library of functions that are efficient ++This library implements the secure C11 Annex K [1]_ functions on top of ++most libc implementations, which are missing from them. ++ ++The ISO TR24731 Bounds Checking Interface documents indicate that the ++key motivation for the new specification is to help mitigate the ever ++increasing security attacks, specifically the buffer overrun. [2]_ ++ ++The rationale document says *“Buffer overrun attacks continue to be a ++security problem. Roughly 10% of vulnerability reports cataloged by CERT ++from 01/01/2005 to 07/01/2005 involved buffer overflows. Preventing ++buffer overruns is the primary, but not the only, motivation for this ++technical report.”*\ [3]_ ++ ++The rationale document continues *“that these only mitigate, that is ++lessen, security problems. When used properly, these functions decrease ++the danger buffer overrun attacks. Source code may remain vulnerable due ++to other bugs and security issues. The highest level of security is ++achieved by building in layers of security utilizing multiple ++strategies.”*\ [4]_ ++ ++The rationale document lists the following key points for TR24731: ++ ++- Guard against overflowing a buffer ++- Do not produce unterminated strings ++- Do not unexpectedly truncate strings ++- Provide a library useful to existing code ++- Preserve the null terminated string datatype ++- Only require local edits to programs ++- Library based solution ++- Support compile-time checking ++- Make failures obvious ++- Zero buffers, null strings ++- Runtime-constraint handler mechanism ++- Support re-entrant code ++- Consistent naming scheme ++- Have a uniform pattern for the function parameters and return type ++- Deference to existing technology ++ ++and the following can be added… ++ ++- provide a library of functions with like behavior ++- provide a library of functions that promote and increase code safety ++ and security ++- provide a library of functions that are efficient + + The C11 Standard adopted many of these points, and added some secure +-`_s` variants in the Annex K. The Microsoft Windows/MINGW secure API +-did the same, but deviated in some functions from the standard. +-Besides Windows (with its msvcrt, ucrt, reactos msvcrt and wine msvcrt +-variants) only the unused stlport, Android's Bionic, Huawei securec +-and Embarcadero implemented this C11 secure Annex K API so far. They +-are still missing from glibc, musl, FreeBSD, darwin and DragonFly +-libc, OpenBSD libc, newlib, dietlibc, uClibc, minilibc. ++``_s`` variants in the Annex K. The Microsoft Windows/MINGW secure API ++did the same, but deviated in some functions from the standard. Besides ++Windows (with its msvcrt, ucrt, reactos msvcrt and wine msvcrt variants) ++only the unused stlport, Android’s Bionic, Huawei securec and ++Embarcadero implemented this C11 secure Annex K API so far. They are ++still missing from glibc, musl, FreeBSD, darwin and DragonFly libc, ++OpenBSD libc, newlib, dietlibc, uClibc, minilibc. + + Design Considerations + --------------------- + + This library implements since 3.0 all functions defined in the +-specifications. Included in the library are extensions to the specification +-to provide a complementary set of functions with like behavior. ++specifications. [5]_ Included in the library are extensions to the ++specification to provide a complementary set of functions with like ++behavior. + +-This library is meant to be used on top of all the existing libc's +-which miss the secure C11 functions. Of course tighter integration +-into the system libc would be better, esp. with the printf, scanf and +-IO functions. See the seperate [libc-overview](doc/libc-overview.md) document. ++This library is meant to be used on top of all the existing libc’s which ++miss the secure C11 functions. Of course tighter integration into the ++system libc would be better, esp. with the printf, scanf and IO ++functions. See the seperate `libc-overview `__ ++document. + + Austin Group Review of ISO/IEC WDTR 24731 + http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1106.txt + +-C11 standard (ISO/IEC 9899:2011) +-http://en.cppreference.com/w/c ++C11 standard (ISO/IEC 9899:2011) http://en.cppreference.com/w/c ++ ++CERT C Secure Coding Standard [6]_ + + Stackoverflow discussion: + https://stackoverflow.com/questions/372980/do-you-use-the-tr-24731-safe-functions + +-DrDobbs review ++DrDobbs review [7]_ + http://www.drdobbs.com/cpp/the-new-c-standard-explored/232901670 + +-C17 reconsidered safeclib but looked only at the old incomplete Cisco version, +-not our complete and fixed version. ++C17 reconsidered safeclib but looked only at the old incomplete Cisco ++version, not our complete and fixed version. + http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm + +-* Use of errno ++- Use of errno + + The TR24731 specification says an implementation may set errno for the +-functions defined in the technical report, but is not required to. +-This library does not set `errno` in most functions, only in +-bsearch_s, fscanf_s, fwscanf_s, gets_s, gmtime_s, localtime_s, +-scanf_s, sscanf_s, swscanf_s, strtok_s, vfscanf_s, +-vfwscanf_s, vsscanf_s, vswscanf_s, wcstok_s, wscanf_s. +- +-In most cases the safeclib extended ES* errors do not set errno, only +-when the underlying insecure system call fails, errno is set. The +-library does use `errno` return codes as required by functional APIs. +-Specific Safe C String and Safe C Memory errno codes are defined in +-the `safe_errno.h` file. +- +-* Runtime-constraints +- +-Per the spec, the library verifies that the calling program does not violate +-the function's runtime-constraints. If a runtime-constraint is violated, the +-library calls the currently registered runtime-constraint handler. +- +-Per the spec, multiple runtime-constraint violations in the same call to a +-library function result in only one call to the runtime-constraint handler. +-The first violation encountered invokes the runtime-constraint handler. +- +-With `--disable-constraint-handler` calling the runtime-constraint handler +-can be disabled, saving some memory, but not much run-time performance. ++functions defined in the technical report, but is not required to. This ++library does not set ``errno`` in most functions, only in ``bsearch_s``, ++``fscanf_s``, ``fwscanf_s``, ``gets_s``, ``gmtime_s``, ``localtime_s``, ++``scanf_s``, ``sscanf_s``, ``swscanf_s``, ``strtok_s``, ``vfscanf_s``, ++``vfwscanf_s``, ``vsscanf_s``, ``vswscanf_s``, ``wcstok_s``, ++``wscanf_s``. ++ ++In most cases the safeclib extended ES\* errors do not set ``errno``, ++only when the underlying insecure system call fails, errno is set. The ++library does use ``errno`` return codes as required by functional APIs. ++Specific Safe C String and Safe C Memory errno codes are defined in the ++``safe_errno.h`` file. ++ ++- Runtime-constraints ++ ++Per the spec, the library verifies that the calling program does not ++violate the function’s runtime-constraints. If a runtime-constraint is ++violated, the library calls the currently registered runtime-constraint ++handler. ++ ++Per the spec, multiple runtime-constraint violations in the same call to ++a library function result in only one call to the runtime-constraint ++handler. The first violation encountered invokes the runtime-constraint ++handler. ++ ++With ``--disable-constraint-handler`` calling the runtime-constraint ++handler can be disabled, saving some memory, but not much run-time ++performance. + + The runtime-constraint handler might not return. If the handler does + return, the library function whose runtime-constraint was violated +-returns an indication of failure as given by the function’s return. +-With valid dest and dmax values, dest is cleared. With the optional +-`--disable-null-slack` only the first value of dest is cleared, ++returns an indication of failure as given by the function’s return. With ++valid dest and dmax values, dest is cleared. With the optional ++``--disable-null-slack`` only the first value of dest is cleared, + otherwise the whole dest buffer. + +-rsize_t:: +- The specification defines a new type. This type, rsize_t, is +- conditionally defined in the safe_lib.h header file. +- +-RSIZE_MAX:: +- The specification defines the macro RSIZE_MAX which expands to a value +- of type rsize_t. The specification uses RSIZE_MAX for both the string +- functions and the memory functions. This implementation defines two +- macros: RSIZE_MAX_STR and RSIZE_MAX_MEM. RSIZE_MAX_STR defines the +- range limit for the safe string functions. RSIZE_MAX_MEM defines the +- range limit for the safe memory functions. The point is that string +- limits can and should be different from memory limits. +- There also exist RSIZE_MAX_WSTR, RSIZE_MAX_MEM16, RSIZE_MAX_MEM32. +- +-* Compile-time constraints +- +-With supporting compilers the dmax overflow checks and several more +-are performed at compile-time. Currently only since clang-5 with +-`diagnose_if` support. This checks similar to `_FORTIFY_SOURCE=2` if +-the `__builtin_object_size` of the dest buffer is the same size as ++``rsize_t`` The specification defines a new type. This type, ++``rsize_t``, is conditionally defined in the ``safe_lib.h`` header file. ++ ++``RSIZE_MAX`` The specification defines the macro ``RSIZE_MAX`` which ++expands to a value of type ``rsize_t``. The specification uses ++``RSIZE_MAX`` for both the string functions and the memory functions. ++This implementation defines two macros: ``RSIZE_MAX_STR`` and ++``RSIZE_MAX_MEM``. ``RSIZE_MAX_STR`` defines the range limit for the ++safe string functions. ``RSIZE_MAX_MEM`` defines the range limit for the ++safe memory functions. The point is that string limits can and should be ++different from memory limits. There also exist ``RSIZE_MAX_WSTR``, ++``RSIZE_MAX_MEM16``, ``RSIZE_MAX_MEM32``. ++ ++- Compile-time constraints ++ ++With supporting compilers the dmax overflow checks and several more are ++performed at compile-time. Currently only since clang-5 with ++``diagnose_if`` support. This checks similar to ``_FORTIFY_SOURCE=2`` if ++the ``__builtin_object_size`` of the dest buffer is the same size as + dmax, and errors if dmax is too big. With the optional +-`--enable-warn-dmax` it prints a warning if the sizes are different, +-which is esp. practical as compile-time warning. It can be promoted +-via the optional `--enable-error-dmax` to be fatal. On unsupported ++``--enable-warn-dmax`` it prints a warning if the sizes are different, ++which is esp. practical as compile-time warning. It can be promoted via ++the optional ``--enable-error-dmax`` to be fatal. On unsupported + compilers, the overflow check and optional equality warn-dmax check is + deferred to run-time. This check is only possible with +-`__builtin_object_size` and `-O2` when the dest buffer size is known +-at compile-time, otherwise only the simplier `dest == NULL`, `dmax == +-0` and `dmax > RSIZE_MAX` checks are performed. ++``__builtin_object_size`` and ``-O2`` when the dest buffer size is known ++at compile-time, otherwise only the simplier ``dest == NULL``, ++``dmax == 0`` and ``dmax > RSIZE_MAX`` checks are performed. + +-* Header Files ++- Header Files + + The specification states the various functions would be added to +-existing Standard C header files: stdio.h, string.h, etc. This ++existing Standard C header files: stdio.h, string.h, etc. This + implementation separates the memory related functions into the +-`safe_mem_lib.h` header, the string related functions into the +-`safe_str_lib.h` header, and the rest into the `safe_lib.h` +-header. There are also the internal `safe_compile.h`, `safe_config.h` +-`safe_lib_errno.h` and `safe_types.h` headers, but they do not need to +-be included. +- +-The make file builds a single library `libsafec-VERSION.a` and `.so`. +-Built but not installed are also libmemprims, libsafeccore and libstdunsafe. ++``safe_mem_lib.h`` header, the string related functions into the ++``safe_str_lib.h`` header, and the rest into the ``safe_lib.h`` header. ++There are also the internal ``safe_compile.h``, ``safe_config.h`` ++``safe_lib_errno.h`` and ``safe_types.h`` headers, but they do not need ++to be included. + +-It is possible to split the make such that a separate `safe_mem_lib.so` and +-`safe_str_lib.so` are built. It is also possible to integrate the prototypes +-into the Standard C header files, but that may require changes to your +-development tool chain. ++The make file builds a single library ``libsafec-VERSION.a`` and ++``.so``. Built but not installed are also libmemprims, libsafeccore and ++libstdunsafe. + ++It is possible to split the make such that a separate ++``safe_mem_lib.so`` and ``safe_str_lib.so`` are built. It is also ++possible to integrate the prototypes into the Standard C header files, ++but that may require changes to your development tool chain. + + Userspace Library + ----------------- ++ + The build system for the userspace library is the well known *GNU build + system*, a.k.a. Autotools. This system is well understood and supported + by many different platforms and distributions which should allow this +-library to be built on a wide variety of platforms. See the +-xref:tested-platforms[``Tested Platforms''] section for details on what +-platforms this library was tested on during its development. ++library to be built on a wide variety of platforms. See the `Tested ++platforms <#tested-platforms>`__ section for details on what platforms ++this library was tested on during its development. + +-* Building ++- Building + +-For those familiar with autotools you can probably skip this part. For those +-not and want to get right to building the code see below. And, for those that +-need additional information see the 'INSTALL' file in the same directory. ++For those familiar with autotools you can probably skip this part. For ++those not and want to get right to building the code see below. And, for ++those that need additional information see the ``INSTALL`` file in the ++same directory. + +-.To build you do the following: ++To build you do the following: + +- $ ./build-aux/autogen.sh +- $ ./configure +- $ make ++:: + +-`autogen.sh` only needs to be run if you are building from the git +-repository. Optionally, you can do `make check` if you want to run the unit +-tests. ++ ./build-aux/autogen.sh ++ ./configure ++ make + ++``autogen.sh`` only needs to be run if you are building from the git ++repository. Optionally, you can do ``make check`` if you want to run the ++unit tests. + +-* Installing ++- Installing + +-Installation must be preformed by `root`, an `Administrator' on most ++Installation must be preformed by ``root``, an ``Administrator`` on most + systems. The following is used to install the library. + +- $ sudo make install ++:: ++ ++ sudo make install + + Safe Linux Kernel Module + ------------------------ +-The build for the kernel module has not been integrated into the autotools +-build infrastructure. Consequently, you have to run a different makefile to +-build the kernel module. + ++The build for the kernel module has not been integrated into the ++autotools build infrastructure. Consequently, you have to run a ++different makefile to build the kernel module. + +-* Building ++- Building + + .To build do the following: + +- $ ./configure --disable-wchar +- $ make -f Makefile.kernel +- ++:: + +-This assumes you are compiling on a Linux box and this makefile supports the +-standard kernel build system infrastructure documented in: +-/Documentation/kbuild/modules.txt ++ ./configure --disable-wchar ++ make -f Makefile.kernel + +-NOTE: If you build the kernel module then wish to build the userspace library +- or vice versa you will need to do a +make clean+ otherwise a +make check+ +- will fail to build. ++This assumes you are compiling on a Linux box and this makefile supports ++the standard kernel build system infrastructure documented in: ++``/usr/src/linux-kernel/Documentation/kbuild/modules.txt`` + ++NOTE: If you build the kernel module then wish to build the userspace ++library or vice versa you will need to do a ``make clean`` otherwise a ++``make check`` will fail to build. + +-* Installing ++- Installing + + The kernel module will be found at the root of the source tree called +-'slkm.ko'. The file 'testslkm.ko' are the unit tests run on the userspace +-library but in Linux kernel module form to verify functionality within the +-kernel. ++``slkm.ko``. The file ``testslkm.ko`` are the unit tests run on the ++userspace library but in Linux kernel module form to verify ++functionality within the kernel. + +- +-[[tested-platforms]] + Tested Platforms + ---------------- + +-.The library has been tested on the following systems: +-- Linux Fedora core 31 - 32 amd64/i386 glibc 2.28 - 2.31 (all gcc's + clang's) +-- Mac OS X 10.6-12 w/ Apple developer tools and macports (all gcc's + clang's) +-- Linux Debian 9 - 11 amd64/i386 glibc 2.24 - 2.28 (all gcc's + clang's) +-- Linux centos 7 amd64 +-- Linux Void amd64 musl-1.1.16 +-- x86_64-w64-mingw32 native and cross-compiled +-- i686-w64-mingw32 native, and cross-compiled and tested under wine +-- i386-mingw32 cross-compiled +-- cygwin32 gcc (newlib) +-- cygwin64 gcc -std=c99 (newlib) +-- freebsd 10 - 12 amd64 +-- linux docker images under qemu: +- i386/debian, x86_64/rhel, arm32v7/debian, aarch64: arm64v8/{debian,centos,rhel,fedora}, +- s390x/fedora (the only big endian test I could find), ppc64le/{debian,ubuntu,fedora,centos,rhel} +-- User Mode Linux (UML), Linux kernel version v3.5.3 w/ Debian Squeeze rootfs +- +-with most available compilers. See `build-aux/smoke.sh` and the various CI configs. +-- https://travis-ci.org/github/rurban/safeclib/ +-- https://ci.appveyor.com/project/rurban/safeclib/ +-- https://cirrus-ci.com/github/rurban/safeclib +-- https://cloud.drone.io/rurban/safeclib/ ++The library has been tested on the following systems: ++ ++- Linux Fedora core 31 - 32 amd64/i386 glibc 2.28 - 2.31 (all gcc’s + ++ clang’s) ++- Mac OS X 10.6-12 w/ Apple developer tools and macports (all gcc’s + ++ clang’s) ++- Linux Debian 9 - 11 amd64/i386 glibc 2.24 - 2.28 (all gcc’s + ++ clang’s) ++- Linux centos 7 amd64 ++- Linux Void amd64 musl-1.1.16 ++- x86_64-w64-mingw32 native and cross-compiled ++- i686-w64-mingw32 native, and cross-compiled and tested under wine ++- i386-mingw32 cross-compiled ++- cygwin32 gcc (newlib) ++- cygwin64 gcc -std=c99 (newlib) ++- freebsd 10 - 12 amd64 ++- linux docker images under qemu: i386/debian, x86_64/rhel, ++ arm32v7/debian, aarch64: arm64v8/{debian,centos,rhel,fedora}, ++ s390x/fedora (the only big endian test I could find), ++ ppc64le/{debian,ubuntu,fedora,centos,rhel} ++- User Mode Linux (UML), Linux kernel version v3.5.3 w/ Debian Squeeze ++ rootfs ++ ++with most available compilers. See ``build-aux/smoke.sh`` and the ++various CI configs. ++ ++- https://travis-ci.org/github/rurban/safeclib/ ++- https://ci.appveyor.com/project/rurban/safeclib/ ++- https://cirrus-ci.com/github/rurban/safeclib ++- https://cloud.drone.io/rurban/safeclib/ + + Known Issues + ------------ +-1. If you are building the library from the git repository you will have to +- first run `build-aux/autogen.sh` which runs autoreconf to ``install'' the +- autotools files and create the configure script. +- +-[bibliography] +-.References +-- [[[1]]] Programming languages, their environments and system software +- interfaces, Extensions to the C Library, Part I: Bounds-checking +- interfaces, ISO/IEC TR 24731-1. +-- [[[2]]] Rationale for TR 24731 Extensions to the C Library Part I: +- Bounds-checking interfaces, ISO/IEC JTC1 SC22 WG14 N1225. +-- [[[3]]] The Open Group Base Specifications Issue 7 +- http://pubs.opengroup.org/onlinepubs/9699919799/functions/contents.html +-- [[[4]]] CERT C Secure Coding Standard +- https://www.securecoding.cert.org/confluence/display/seccode/CERT+C+Secure+Coding+Standard +-- [[[5]]] C11 Standard (ISO/IEC 9899:2011) Annex K +-- [[[6]]] DrDobbs review http://www.drdobbs.com/cpp/the-new-c-standard-explored/232901670 ++ ++1. If you are building the library from the git repository you will have ++ to first run ``build-aux/autogen.sh`` which runs autoreconf to ++ ``install`` the autotools files and create the configure script. ++ ++References ++---------- ++ ++.. [1] ++ C11 Standard (ISO/IEC 9899:2011) Annex K ++ ++.. [2] ++ Programming languages, their environments and system software ++ interfaces, Extensions to the C Library, Part I: Bounds-checking ++ interfaces, ISO/IEC TR 24731-1. ++ ++.. [3] ++ Rationale for TR 24731 Extensions to the C Library Part I: ++ Bounds-checking interfaces, ISO/IEC JTC1 SC22 WG14 N1225. ++ ++.. [4] ++ Rationale for TR 24731 Extensions to the C Library Part I: ++ Bounds-checking interfaces, ISO/IEC JTC1 SC22 WG14 N1225. ++ ++.. [5] ++ The Open Group Base Specifications Issue 7 ++ http://pubs.opengroup.org/onlinepubs/9699919799/functions/contents.html ++ ++.. [6] ++ CERT C Secure Coding Standard ++ https://www.securecoding.cert.org/confluence/display/seccode/CERT+C+Secure+Coding+Standard ++ ++.. [7] ++ DrDobbs review ++ http://www.drdobbs.com/cpp/the-new-c-standard-explored/232901670 ++ ++.. |safeclib support vis xs:code| image:: doc/safeclib-banner.png ++ :target: https://xscode.com/rurban/safeclib diff --git a/meta-oe/recipes-core/safec/safec/0016-travis-disable-unfree-osx.patch b/meta-oe/recipes-core/safec/safec/0016-travis-disable-unfree-osx.patch new file mode 100644 index 000000000..c07dfe3a9 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0016-travis-disable-unfree-osx.patch @@ -0,0 +1,31 @@ +From 0234bec46da4863f849f100c2f5336412ab2f69b Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Mon, 2 Nov 2020 18:46:40 +0100 +Subject: [PATCH] travis: disable unfree osx + +--- + .travis.yml | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +diff --git a/.travis.yml b/.travis.yml +index 2531643d..55a32322 100644 +--- a/.travis.yml ++++ b/.travis.yml +@@ -178,11 +178,12 @@ matrix: + compiler: g++ + env: CONF="--enable-debug --enable-unsafe --enable-norm-compat" + <<: *test_native +- - name: x86_64-osx +- compiler: gcc +- os: osx +- env: CONF="--enable-unsafe --enable-norm-compat" +- <<: *test_native ++ # osx is not free anymore ++ #- name: x86_64-osx ++ # compiler: gcc ++ # os: osx ++ # env: CONF="--enable-unsafe --enable-norm-compat" ++ # <<: *test_native + - name: x86_64-clang + compiler: clang + env: CFLAGS="-O2 -D_FORTIFY_SOURCE=2 -march=native" CONF="--disable-constraint-handler" diff --git a/meta-oe/recipes-core/safec/safec/0017-Define-NDEBUG-only-if-not-already-defined.patch b/meta-oe/recipes-core/safec/safec/0017-Define-NDEBUG-only-if-not-already-defined.patch new file mode 100644 index 000000000..4a37dc20c --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0017-Define-NDEBUG-only-if-not-already-defined.patch @@ -0,0 +1,24 @@ +From f46a3368cdcb592553b8aa6918806832452fba31 Mon Sep 17 00:00:00 2001 +From: Alexey Klimkin +Date: Sat, 30 Jan 2021 23:58:12 -0800 +Subject: [PATCH] Define NDEBUG only if not already defined + +--- + src/safeclib_private.h | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/src/safeclib_private.h b/src/safeclib_private.h +index 2974d5c9..a60a2016 100644 +--- a/src/safeclib_private.h ++++ b/src/safeclib_private.h +@@ -35,8 +35,10 @@ + #define __SAFECLIB_PRIVATE_H__ + + #ifndef DEBUG ++#ifndef NDEBUG + #define NDEBUG + #endif ++#endif + + #include "config.h" + diff --git a/meta-oe/recipes-core/safec/safec/0018-switch-to-semantic-versioning-3.7-change-PACKAGE-nam.patch b/meta-oe/recipes-core/safec/safec/0018-switch-to-semantic-versioning-3.7-change-PACKAGE-nam.patch new file mode 100644 index 000000000..1c39caae9 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0018-switch-to-semantic-versioning-3.7-change-PACKAGE-nam.patch @@ -0,0 +1,254 @@ +From dbdf460c66fc1ad6048a23d62300c2bec4f02182 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Fri, 2 Oct 2020 15:57:55 +0200 +Subject: [PATCH] switch to semantic versioning: 3.7, change PACKAGE name + +the tardist name went from libsafec-02092020 to safeclib-3.7. +this should stay the established public name. +packagers still should use libsafec and libsafec-devel for the lib parts. + +without git tag versioning for now. +See GH #91 +--- + Makefile.am | 10 +++++++--- + configure.ac | 29 +++++++++++++++++++++-------- + libsafec.pc.in | 2 +- + src/Makefile.am | 21 +++++++++++---------- + src/wchar/mbstowcs_s.c | 4 ++-- + src/wchar/wcsrtombs_s.c | 2 +- + tests/Makefile.am | 2 +- + 7 files changed, 44 insertions(+), 26 deletions(-) + +diff --git a/Makefile.am b/Makefile.am +index b917e77a..c472c145 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -485,11 +485,11 @@ CLEANFILES += Doxyfile doc/footer + MAINTAINERCLEANFILES = *~ README.rst + + # avoid parallel doxygen ++if HAVE_DOXYGEN + $(dist_man_MANS) :: + doc/man/man3/EOK.3 :: Doxyfile README.rst doc/footer include/safe_config.h + -rm $@ +- doxygen +- ++ $(DOXYGEN) + docs man: Doxyfile doc/footer $(BUILT_SOURCES) README.rst \ + doc/man/man1/check_for_unsafe_apis.1 doc/man/man3/EOK.3 + -rm -rf doc/man/man3/d[0-9a-f] +@@ -561,8 +561,11 @@ docs man: Doxyfile doc/footer $(BUILT_SOURCES) README.rst \ + -rm doc/man/man3/handle_{,w,mem_}error.3 + -rm doc/man/man3/handle_{str,mem}_bos_*.3 + -rm doc/man/man3/handle_str_src_bos_*.3 ++endif ++if HAVE_PANDOC + README.rst: README.md + pandoc -o README.rst README.md ++endif + all-local: Doxyfile doc/footer + clean-local: + rm -rf $(builddir)/doc/html +@@ -612,6 +615,7 @@ gh-pages: docs + release: docs distcheck + git branch |grep '^* master' + git tag -f v`date +%d%m%Y` ++ git tag -f $(PACKAGE_VERSION) + build-aux/autogen.sh + ./configure + $(MAKE) +@@ -626,6 +630,6 @@ release: docs distcheck + $(MAKE) docs + $(MAKE) gh-pages + git branch |grep '^* gh-pages' +- git commit -m"Update to v`date +%d%m%Y`" ++ git commit -m"Update to $(PACKAGE_VERSION)" + git push + git checkout master +diff --git a/configure.ac b/configure.ac +index 637e76ea..82ee4ab6 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -34,11 +34,10 @@ + AC_PREREQ([2.69]) + + # information on the package +-AC_INIT([Safe C Library], +- [m4_esyscmd(build-aux/version-gen.sh .tarball-version)], ++#AC_SUBST([PACKAGE_VERSION], [3.7]) ++AC_INIT([Safe C Library], [3.7], + [https://github.com/rurban/safeclib/issues], +- [libsafec], +- [http://github.com/rurban/safeclib/]) ++ [safeclib], [http://github.com/rurban/safeclib/]) + + # Configure the configure script + # =============================================== +@@ -81,7 +80,6 @@ PKG_INSTALLDIR + + # Global Variable & Defaults + # =============================================== +- + # Keep this in sync with what is passed in AC_INIT + TARBALL_VERSION_FILE=".tarball-version" + +@@ -98,6 +96,16 @@ dnl enable_static=no + dnl ;; + dnl esac + ++AC_MSG_CHECKING([package version]) ++AC_MSG_RESULT($PACKAGE_VERSION) ++AC_MSG_CHECKING([so version-info]) ++AC_MSG_RESULT($SAFECLIB_SO_VERSION) ++ ++ISODATE=`date +%Y-%m-%d` ++AC_SUBST(ISODATE) ++ ++AC_CANONICAL_HOST ++ + # Configure options + # =============================================== + +@@ -654,6 +662,10 @@ AC_CHECK_PROGS([POD2MAN], [pod2man]) + if test -z "POD2MAN"; + then AC_MSG_WARN([pod2man not found - continuing without pod2man support]) + fi ++AC_CHECK_PROGS([PANDOC], [pandoc]) ++if test -z "$PANDOC"; ++ then AC_MSG_WARN([pandoc not found - README.rst cannot be generated from README.md]) ++fi + AM_CONDITIONAL([HAVE_DSYMUTIL], [test -n "$ac_ct_DSYMUTIL"]) + + case $host_os in +@@ -1004,8 +1016,8 @@ AC_SUBST([TARBALL_VERSION_FILE]) + # version information, refer to the libtool manual, section "Updating + # library version information": + # http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html +-AC_SUBST([SAFEC_SO_VERSION], [3:6:0]) +-AC_SUBST([SAFEC_API_VERSION], [3.6.0]) ++AC_SUBST([SAFEC_SO_VERSION], [3:7:0]) ++AC_SUBST([SAFEC_API_VERSION], [3.7.0]) + + # Automake variables, these variables get automagically included at the top + # of all automake generated make files. This is why you don't see them +@@ -1044,7 +1056,8 @@ AC_CONFIG_FILES([include/safe_lib_errno.h], [chmod -w include/safe_lib_errno.h]) + AC_CONFIG_FILES([include/safe_types.h], [chmod -w include/safe_types.h]) + + AM_CONDITIONAL([HAVE_DOXYGEN], [test -n "$DOXYGEN"]) +-AM_CONDITIONAL([HAVE_POD2MAN], [test -n "POD2MAN"]) ++AM_CONDITIONAL([HAVE_POD2MAN], [test -n "$POD2MAN"]) ++AM_CONDITIONAL([HAVE_PANDOC], [test -n "$PANDOC"]) + AM_CONDITIONAL([HAVE_WINE], [test -n "$WINE"]) + AM_COND_IF([HAVE_DOXYGEN], [AC_CONFIG_FILES([Doxyfile])]) + AM_COND_IF([HAVE_DOXYGEN], [AC_CONFIG_FILES([doc/footer])]) +diff --git a/libsafec.pc.in b/libsafec.pc.in +index 1ad4d964..435d6168 100644 +--- a/libsafec.pc.in ++++ b/libsafec.pc.in +@@ -8,5 +8,5 @@ Name: @PACKAGE@ + Description: A safe coding library for C, ref ISO TR24731, C11 Annex K + Version: @VERSION@ + URL: @PACKAGE_URL@ +-Libs: -L${libdir} -lsafec-@SAFEC_API_VERSION@ ++Libs: -L${libdir} -lsafec + Cflags: -I${includedir}/@PACKAGE@ +diff --git a/src/Makefile.am b/src/Makefile.am +index e4280032..cd77e7e4 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -265,35 +265,36 @@ endif + #$(EXPORT_SYM): safec.h.in + # sed -n -e 's/^..*SAFEC_EXPORT[[:space:]][[:space:]]*\([[:alnum:]_][[:alnum:]_]*\)..*$$/\1/p' @top_srcdir@/src/safec.h.in > $@ + +-lib_LTLIBRARIES = libsafec-@SAFEC_API_VERSION@.la +-libsafec_@SAFEC_API_VERSION@_la_SOURCES = \ ++lib_LTLIBRARIES = libsafec.la ++libsafec_la_SOURCES = \ + $(STD_MEM_FILES) \ + $(STD_STR_FILES) \ + $(STD_IO_FILES) \ + $(STD_OS_FILES) \ + $(STD_MISC_FILES) + if ENABLE_WCHAR +-libsafec_@SAFEC_API_VERSION@_la_SOURCES += \ ++libsafec_la_SOURCES += \ + $(STD_WCHAR_FILES) + endif + if ENABLE_EXTS +-libsafec_@SAFEC_API_VERSION@_la_SOURCES += \ ++libsafec_la_SOURCES += \ + $(EXT_MEM_FILES) \ + $(EXT_STR_FILES) + endif + +-libsafec_@SAFEC_API_VERSION@_la_LIBADD = \ ++libsafec_la_LIBADD = \ + libmemprims.la \ + libsafeccore.la + if ENABLE_UNSAFE +-libsafec_@SAFEC_API_VERSION@_la_LIBADD += \ ++libsafec_la_LIBADD += \ + libstdunsafe.la + endif +-libsafec_@SAFEC_API_VERSION@_la_LDFLAGS = \ ++libsafec_la_LDFLAGS = \ + -version-info $(SAFEC_SO_VERSION) \ +- -no-undefined ++ -no-undefined \ ++ $(LDFLAGS) $(AM_LDFLAGS) + # -export-symbols $(EXPORT_SYM) +-#libsafec_@SAFEC_API_VERSION@_la_DEPENDENCIES = $(EXPORT_SYM) ++#libsafec_la_DEPENDENCIES = $(EXPORT_SYM) + + # emacs flymake-mode + check-syntax: +@@ -306,7 +307,7 @@ AM_CFLAGS += @GCOV_CFLAGS@ + LIBS += @GCOV_LIBS@ + gcov: + -test -f $(builddir)/gcov.log && rm $(builddir)/gcov.log +- for c in $(libsafec_@SAFEC_API_VERSION@_la_SOURCES); do \ ++ for c in $(libsafec_la_SOURCES); do \ + dir="`dirname $$c`"; base="`basename $$c .c`"; \ + if test -e "$$dir/$$base.gcno" -a -e $$c; then \ + $(GCOV) -s $$dir $$c | tee -a $(builddir)/gcov.log; \ +diff --git a/src/wchar/mbstowcs_s.c b/src/wchar/mbstowcs_s.c +index 8d4bf7aa..14bae27c 100644 +--- a/src/wchar/mbstowcs_s.c ++++ b/src/wchar/mbstowcs_s.c +@@ -35,8 +35,8 @@ + #include "safeclib_private.h" + #endif + +-#if (defined(TEST_MSVCRT) && defined(HAVE_MBSRTOWC_S)) || \ +- !defined(HAVE_WCHAR_H) || !defined(HAVE_MBSTOWCS) ++#if (defined(TEST_MSVCRT) && defined(HAVE_MBSTOWCS_S)) || \ ++ !defined(HAVE_WCHAR_H) + #else + + /* newlib, cygwin64 has no STDC_HEADERS! +diff --git a/src/wchar/wcsrtombs_s.c b/src/wchar/wcsrtombs_s.c +index 02397d7e..824a389c 100644 +--- a/src/wchar/wcsrtombs_s.c ++++ b/src/wchar/wcsrtombs_s.c +@@ -35,7 +35,7 @@ + #include "safeclib_private.h" + #endif + +-#if (defined(TEST_MSVCRT) && defined(HAVE_WCSTOK_S)) || !defined(HAVE_WCHAR_H) ++#if (defined(TEST_MSVCRT) && defined(HAVE_WCSRTOMBS_S)) || !defined(HAVE_WCHAR_H) + #else + + /** +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 0301794d..9ace5de0 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -218,7 +218,7 @@ AM_CFLAGS += -I$(top_builddir)/include -I$(srcdir) + # WARN_CFLAGS works mostly, but too strict with gnu extensions + AM_CFLAGS += $(WARN_CFLAGS_TESTS) + +-LDADD = $(top_builddir)/src/libsafec-@SAFEC_API_VERSION@.la ++LDADD = $(top_builddir)/src/libsafec.la + + TESTS = $(SAFEC_BUILT_TESTS) + check_PROGRAMS = $(SAFEC_BUILT_TESTS) diff --git a/meta-oe/recipes-core/safec/safec/0019-update-freebsd-smoker.patch b/meta-oe/recipes-core/safec/safec/0019-update-freebsd-smoker.patch new file mode 100644 index 000000000..0d3797dd2 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0019-update-freebsd-smoker.patch @@ -0,0 +1,28 @@ +From a4abce065446410d137cece7cd017ff80251713d Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sat, 20 Mar 2021 08:19:46 +0100 +Subject: [PATCH] update freebsd smoker + +--- + .cirrus.yml | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/.cirrus.yml b/.cirrus.yml +index bc7e7a66..ff47e5d0 100644 +--- a/.cirrus.yml ++++ b/.cirrus.yml +@@ -1,11 +1,11 @@ + # Build configuration for https://cirrus-ci.org + + freebsd_instance: +- image_family: freebsd-12-1 +- ++ image_family: freebsd-12-2 ++ cpu: 4 + task: + install_script: +- - pkg install -y autoconf automake libtool pkgconf git wget ++ - pkg install -y autoconf automake libtool pkgconf git wget m4 + build_script: + - build-aux/autogen.sh + - CFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib ./configure --enable-unsafe --enable-norm-compat diff --git a/meta-oe/recipes-core/safec/safec/0020-fix-mingw-keyring-mess-again.patch b/meta-oe/recipes-core/safec/safec/0020-fix-mingw-keyring-mess-again.patch new file mode 100644 index 000000000..1a751eece --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0020-fix-mingw-keyring-mess-again.patch @@ -0,0 +1,44 @@ +From 986f6d34e49637d68cb41221307231f0ea79ca4d Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Wed, 7 Apr 2021 16:56:05 +0200 +Subject: [PATCH] fix mingw keyring mess again + +--- + build-aux/msys2.bat | 15 ++++++++++----- + 1 file changed, 10 insertions(+), 5 deletions(-) + +diff --git a/build-aux/msys2.bat b/build-aux/msys2.bat +index d76009ac..87d98cb9 100644 +--- a/build-aux/msys2.bat ++++ b/build-aux/msys2.bat +@@ -16,11 +16,15 @@ echo Installation MSYS2 build preconditions... + echo Extending path to MSYS... + SET "PATH=C:\%MSYS2_DIR%\%MSYSTEM%\bin;C:\%MSYS2_DIR%\usr\bin;%PATH%" + ++echo Skipping pacman updates ++goto depends + echo Temporary keyring mess (https://www.msys2.org/news/) +-bash -lc "curl -O http://repo.msys2.org/msys/x86_64/msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz" +-bash -lc "curl -O http://repo.msys2.org/msys/x86_64/msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz.sig" +-bash -lc "pacman-key --verify msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz{.sig,}" ++bash -lc "wget http://repo.msys2.org/msys/x86_64/msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz{,.sig}" ++bash -lc "pacman-key --verify msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz.sig" + bash -lc "pacman -U --noconfirm msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz" ++rem bash -lc "curl -O http://repo.msys2.org/msys/x86_64/msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz" ++rem bash -lc "curl -O http://repo.msys2.org/msys/x86_64/msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz.sig" ++rem bash -lc "pacman-key --verify msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz{.sig,}" + rem bash -lc "pacman -U --config <(echo) msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz" + + echo Updating pacman... +@@ -33,8 +37,9 @@ bash -lc "pacman -Syyu --noconfirm" + rem echo Installing git... + rem bash -lc "pacman -S --needed --noconfirm git" + ++:depends + echo Installing dependencies... + rem mingw-w64-x86_64-pdcurses and mingw-w64-x86_64-ncurses are in conflict... + rem bash -lc "pacman -Rddn --noconfirm mingw-w64-%MSYS2_ARCH%-ncurses mingw-w64-%MSYS2_ARCH%-termcap mingw-w64-i686-gcc-ada mingw-w64-i686-gcc-objc mingw-w64-x86_64-gcc-ada mingw-w64-x86_64-gcc-objc" +-bash -lc "pacman -Syyu --needed --noconfirm mingw-w64-%MSYS2_ARCH%-toolchain mingw-w64-%MSYS2_ARCH%-libtool mingw-w64-%MSYS2_ARCH%-libiconv" +-rem autoconf-2.69 automake-wrapper ++bash -lc "pacman -S --needed --noconfirm mingw-w64-%MSYS2_ARCH%-libiconv" ++rem autoconf-2.69 automake-wrapper mingw-w64-%MSYS2_ARCH%-libtool mingw-w64-%MSYS2_ARCH%-toolchain diff --git a/meta-oe/recipes-core/safec/safec/0021-Dont-install-wchar-manpages-with-disable-wchar.patch b/meta-oe/recipes-core/safec/safec/0021-Dont-install-wchar-manpages-with-disable-wchar.patch new file mode 100644 index 000000000..7ea4a6506 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0021-Dont-install-wchar-manpages-with-disable-wchar.patch @@ -0,0 +1,163 @@ +From 2218c62ce6d17760484530df95ba0f8d539d92c4 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sun, 18 Apr 2021 10:17:29 +0200 +Subject: [PATCH] Dont install wchar manpages with --disable-wchar + +and remove not generated wcsnaticmp_s.3 manpage. Fixes GH #95 +--- + Makefile.am | 67 ++++++++++++++++++++++++++--------------------------- + 1 file changed, 33 insertions(+), 34 deletions(-) + +diff --git a/Makefile.am b/Makefile.am +index c472c145..98b82982 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -138,7 +138,6 @@ dist_man_MANS += \ + doc/man/man3/RSIZE_MAX_MEM16.3 \ + doc/man/man3/RSIZE_MAX_MEM32.3 \ + doc/man/man3/RSIZE_MAX_STR.3 \ +- doc/man/man3/RSIZE_MAX_WMEM.3 \ + doc/man/man3/RSIZE_MAX_WSTR.3 \ + doc/man/man3/RSIZE_MIN_STR.3 \ + doc/man/man3/SAFECLIB_STR_NULL_SLACK.3 \ +@@ -167,10 +166,6 @@ dist_man_MANS += \ + doc/man/man3/freopen_s.c.3 \ + doc/man/man3/fscanf_s.3 \ + doc/man/man3/fscanf_s.c.3 \ +- doc/man/man3/fwprintf_s.3 \ +- doc/man/man3/fwprintf_s.c.3 \ +- doc/man/man3/fwscanf_s.3 \ +- doc/man/man3/fwscanf_s.c.3 \ + doc/man/man3/getenv_s.3 \ + doc/man/man3/getenv_s.c.3 \ + doc/man/man3/gets_s.3 \ +@@ -183,10 +178,6 @@ dist_man_MANS += \ + doc/man/man3/invoke_safe_str_constraint_handler.3 \ + doc/man/man3/localtime_s.3 \ + doc/man/man3/localtime_s.c.3 \ +- doc/man/man3/mbsrtowcs_s.3 \ +- doc/man/man3/mbsrtowcs_s.c.3 \ +- doc/man/man3/mbstowcs_s.3 \ +- doc/man/man3/mbstowcs_s.c.3 \ + doc/man/man3/mem_handler.3 \ + doc/man/man3/mem_prim_move.3 \ + doc/man/man3/mem_prim_move16.3 \ +@@ -255,8 +246,6 @@ dist_man_MANS += \ + doc/man/man3/set_str_constraint_handler_s.3 \ + doc/man/man3/snprintf_s.3 \ + doc/man/man3/snprintf_s.c.3 \ +- doc/man/man3/snwprintf_s.3 \ +- doc/man/man3/snwprintf_s.c.3 \ + doc/man/man3/sprintf_s.3 \ + doc/man/man3/sprintf_s.c.3 \ + doc/man/man3/sscanf_s.3 \ +@@ -357,10 +346,6 @@ dist_man_MANS += \ + doc/man/man3/strupr_s.3 \ + doc/man/man3/strzero_s.3 \ + doc/man/man3/strzero_s.c.3 \ +- doc/man/man3/swprintf_s.3 \ +- doc/man/man3/swprintf_s.c.3 \ +- doc/man/man3/swscanf_s.3 \ +- doc/man/man3/swscanf_s.c.3 \ + doc/man/man3/timingsafe_bcmp.3 \ + doc/man/man3/timingsafe_bcmp.c.3 \ + doc/man/man3/timingsafe_memcmp.3 \ +@@ -369,6 +354,37 @@ dist_man_MANS += \ + doc/man/man3/tmpfile_s.c.3 \ + doc/man/man3/tmpnam_s.3 \ + doc/man/man3/tmpnam_s.c.3 \ ++ doc/man/man3/vfprintf_s.3 \ ++ doc/man/man3/vfprintf_s.c.3 \ ++ doc/man/man3/vfscanf_s.3 \ ++ doc/man/man3/vfscanf_s.c.3 \ ++ doc/man/man3/vprintf_s.3 \ ++ doc/man/man3/vprintf_s.c.3 \ ++ doc/man/man3/vscanf_s.3 \ ++ doc/man/man3/vscanf_s.c.3 \ ++ doc/man/man3/vsnprintf_s.3 \ ++ doc/man/man3/vsnprintf_s.c.3 \ ++ doc/man/man3/vsprintf_s.3 \ ++ doc/man/man3/vsprintf_s.c.3 \ ++ doc/man/man3/vsscanf_s.3 \ ++ doc/man/man3/vsscanf_s.c.3 ++if ENABLE_WCHAR ++dist_man_MANS += \ ++ doc/man/man3/RSIZE_MAX_WMEM.3 \ ++ doc/man/man3/fwprintf_s.3 \ ++ doc/man/man3/fwprintf_s.c.3 \ ++ doc/man/man3/fwscanf_s.3 \ ++ doc/man/man3/fwscanf_s.c.3 \ ++ doc/man/man3/mbsrtowcs_s.3 \ ++ doc/man/man3/mbsrtowcs_s.c.3 \ ++ doc/man/man3/mbstowcs_s.3 \ ++ doc/man/man3/mbstowcs_s.c.3 \ ++ doc/man/man3/snwprintf_s.3 \ ++ doc/man/man3/snwprintf_s.c.3 \ ++ doc/man/man3/swprintf_s.3 \ ++ doc/man/man3/swprintf_s.c.3 \ ++ doc/man/man3/swscanf_s.3 \ ++ doc/man/man3/swscanf_s.c.3 \ + doc/man/man3/towctrans.c.3 \ + doc/man/man3/towfc_s.3 \ + doc/man/man3/towfc_s.c.3 \ +@@ -384,26 +400,12 @@ dist_man_MANS += \ + doc/man/man3/unwifcmp.h.3 \ + doc/man/man3/unwifcpt.h.3 \ + doc/man/man3/unwifexc.h.3 \ +- doc/man/man3/vfprintf_s.3 \ +- doc/man/man3/vfprintf_s.c.3 \ +- doc/man/man3/vfscanf_s.3 \ +- doc/man/man3/vfscanf_s.c.3 \ + doc/man/man3/vfwprintf_s.3 \ + doc/man/man3/vfwprintf_s.c.3 \ + doc/man/man3/vfwscanf_s.3 \ + doc/man/man3/vfwscanf_s.c.3 \ +- doc/man/man3/vprintf_s.3 \ +- doc/man/man3/vprintf_s.c.3 \ +- doc/man/man3/vscanf_s.3 \ +- doc/man/man3/vscanf_s.c.3 \ +- doc/man/man3/vsnprintf_s.3 \ +- doc/man/man3/vsnprintf_s.c.3 \ + doc/man/man3/vsnwprintf_s.3 \ + doc/man/man3/vsnwprintf_s.c.3 \ +- doc/man/man3/vsprintf_s.3 \ +- doc/man/man3/vsprintf_s.c.3 \ +- doc/man/man3/vsscanf_s.3 \ +- doc/man/man3/vsscanf_s.c.3 \ + doc/man/man3/vswprintf_s.3 \ + doc/man/man3/vswprintf_s.c.3 \ + doc/man/man3/vswscanf_s.3 \ +@@ -411,7 +413,7 @@ dist_man_MANS += \ + doc/man/man3/vwprintf_s.3 \ + doc/man/man3/vwprintf_s.c.3 \ + doc/man/man3/vwscanf_s.3 \ +- doc/man/man3/vwscanf_s.c.3 \ ++ doc/man/man3/vwscanf_s.c.3 \ + doc/man/man3/wcrtomb_s.3 \ + doc/man/man3/wcrtomb_s.c.3 \ + doc/man/man3/wcscat_s.3 \ +@@ -430,7 +432,6 @@ dist_man_MANS += \ + doc/man/man3/wcslwr_s.c.3 \ + doc/man/man3/wcsnatcmp_s.3 \ + doc/man/man3/wcsnatcmp_s.c.3 \ +- doc/man/man3/wcsnaticmp_s.3 \ + doc/man/man3/wcsncat_s.3 \ + doc/man/man3/wcsncat_s.c.3 \ + doc/man/man3/wcsncmp_s.3 \ +@@ -472,15 +473,13 @@ dist_man_MANS += \ + doc/man/man3/wprintf_s.c.3 \ + doc/man/man3/wscanf_s.3 \ + doc/man/man3/wscanf_s.c.3 +-#if ENABLE_WCHAR +-#dist_man_MANS += \ + # doc/man/man3/WCSNORM_FCC.3 \ + # doc/man/man3/WCSNORM_FCD.3 \ + # doc/man/man3/WCSNORM_NFC.3 \ + # doc/man/man3/WCSNORM_NFD.3 \ + # doc/man/man3/WCSNORM_NFKC.3 \ + # doc/man/man3/WCSNORM_NFKD.3 +-#endif ++endif + CLEANFILES += Doxyfile doc/footer + MAINTAINERCLEANFILES = *~ README.rst + diff --git a/meta-oe/recipes-core/safec/safec/0022-kernel-fix-for-time64_t-only.patch b/meta-oe/recipes-core/safec/safec/0022-kernel-fix-for-time64_t-only.patch new file mode 100644 index 000000000..89506a18a --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0022-kernel-fix-for-time64_t-only.patch @@ -0,0 +1,24 @@ +From 24e41cec50b2ce2ad5a2fe8731d948c5993a19a2 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sun, 18 Apr 2021 13:12:42 +0200 +Subject: [PATCH] kernel: fix for time64_t only + +no CONFIG_COMPAT_32BIT_TIME +Should fix GH #96 +--- + src/safeclib_private.h | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/src/safeclib_private.h b/src/safeclib_private.h +index a60a2016..d5cdb3f7 100644 +--- a/src/safeclib_private.h ++++ b/src/safeclib_private.h +@@ -52,6 +52,8 @@ + /* Needed since the switch to time64_t */ + #if defined CONFIG_COMPAT_32BIT_TIME && defined _LINUX_TIME64_H && defined __VDSO_TIME32_H + #define time_t old_time32_t ++#elif defined _LINUX_TIME64_H && !defined __VDSO_TIME32_H ++#define time_t time64_t + #endif + + #define RCNEGATE(x) (-(x)) diff --git a/meta-oe/recipes-core/safec/safec/0023-configure-replace-obsolute-macros.patch b/meta-oe/recipes-core/safec/safec/0023-configure-replace-obsolute-macros.patch new file mode 100644 index 000000000..ee483419f --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0023-configure-replace-obsolute-macros.patch @@ -0,0 +1,82 @@ +From b08b35f8eff8bc069a0bb23deb53b14dc6b3a53f Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sun, 18 Apr 2021 18:24:00 +0200 +Subject: [PATCH] configure: replace obsolute macros + +esp. hardcode $as_echo as echo. +But the real problem is crlf conversion on multiple \ lines, leading +to \^M on mingw. +--- + .gitattributes | 4 +++- + configure.ac | 16 ++++++++-------- + 2 files changed, 11 insertions(+), 9 deletions(-) + +diff --git a/.gitattributes b/.gitattributes +index 8310a4b1..8f73f512 100644 +--- a/.gitattributes ++++ b/.gitattributes +@@ -7,7 +7,9 @@ + *.h text + *.txt text + *.am text +-/configure.ac text ++ ++# needs unix lf ++/configure.ac text eol=lf + + # Declare files that will always have CRLF line endings on checkout. + *.sln text eol=crlf +diff --git a/configure.ac b/configure.ac +index 82ee4ab6..bfc37754 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -35,9 +35,7 @@ AC_PREREQ([2.69]) + + # information on the package + #AC_SUBST([PACKAGE_VERSION], [3.7]) +-AC_INIT([Safe C Library], [3.7], +- [https://github.com/rurban/safeclib/issues], +- [safeclib], [http://github.com/rurban/safeclib/]) ++AC_INIT([Safe C Library],[3.7],[https://github.com/rurban/safeclib/issues],[safeclib],[http://github.com/rurban/safeclib/]) + + # Configure the configure script + # =============================================== +@@ -392,8 +390,8 @@ AC_PROG_CC + AC_PROG_CPP + AC_PROG_INSTALL + AM_PROG_CC_C_O +-AC_PROG_CC_C99 +-AC_PROG_CC_C11 ++#AC_PROG_CC_C99 ++#AC_PROG_CC_C11 + + if test "x$ac_cv_prog_cc_c99" = "xno"; then + dnl we really should ERROR, lets see how far can come without +@@ -694,6 +692,8 @@ AC_CHECK_HEADERS([stdlib.h \ + malloc.h \ + string.h \ + limits.h \ ++ stddef.h \ ++ unistd.h \ + sys/types.h \ + inttypes.h \ + stdint.h \ +@@ -873,15 +873,15 @@ AC_CHECK_FUNCS([ memset strcmp strcasecmp strcasestr strcspn strpbrk strspn \ + vswprintf vsnwprintf vswscanf mbsrtowcs mbstowcs iswdigit iswspace \ + towlower towupper towctrans bcmp secure_getenv timingsafe_memcmp \ + timingsafe_bcmp explicit_bzero explicit_memset \ +- asctime_r ctime_r gmtime_r localtime_r memccpy ]) ++ asctime_r ctime_r gmtime_r localtime_r memccpy]) + + dnl add the extensions, pretending we want them +-$as_echo '#define __STDC_WANT_LIB_EXT1__ 1' >>confdefs.h ++echo "#define __STDC_WANT_LIB_EXT1__ 1" >>confdefs.h + dnl native safec shadowing functions (should be none) + AC_CHECK_FUNCS([_memcpy_s_chk _memmove_s_chk _memset_s_chk _memcmp_s_chk \ + _strcpy_s_chk _strncpy_s_chk _strcat_s_chk _strncat_s_chk _strnlen_s_chk \ + _printf_s_chk _sprintf_s_chk _snprintf_s_chk _swprintf_s_chk \ +- _vfprintf_s_chk _vfwprintf_s_chk _vsprintf_s_chk _vsnprintf_s_chk ]) ++ _vfprintf_s_chk _vfwprintf_s_chk _vsprintf_s_chk _vsnprintf_s_chk]) + dnl native C11 Annex K functions + dnl vsnprintf_s vsnwprintf_s strtok_s wcstok_s deviate in mingw from c11 + AC_CHECK_FUNCS( diff --git a/meta-oe/recipes-core/safec/safec/0024-add-GH-Actions.patch b/meta-oe/recipes-core/safec/safec/0024-add-GH-Actions.patch new file mode 100644 index 000000000..4fb766748 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0024-add-GH-Actions.patch @@ -0,0 +1,151 @@ +From 13f7ee320f57fce221e53e442d8a63183199288a Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sun, 18 Apr 2021 13:21:24 +0200 +Subject: [PATCH] add GH Actions + +not as far as travis qemu/docker builds yet +not much archs + +fixed mingw autoconf by setting the crlf policy. see previous commit. +--- + .github/workflows/main.yml | 117 +++++++++++++++++++++++++++++++++++++ + configure.ac | 2 +- + 2 files changed, 118 insertions(+), 1 deletion(-) + create mode 100644 .github/workflows/main.yml + +diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml +new file mode 100644 +index 00000000..0ea302db +--- /dev/null ++++ b/.github/workflows/main.yml +@@ -0,0 +1,117 @@ ++name: Github CI ++on: [push, pull_request] ++ ++#strategy: ++# matrix: ++# os: [ubuntu-14.04, ubuntu-18.04, ubuntu-latest] ++ ++jobs: ++ linux: ++ runs-on: ubuntu-latest ++ timeout-minutes: 60 ++ strategy: ++ fail-fast: false ++ matrix: ++ CONF_ARGS: ++ - --disable-wchar ++ - --enable-unsafe --enable-norm-compat ++ - --enable-debug --enable-unsafe --enable-norm-compat --enable-gcov ++ - --enable-debug --enable-unsafe --enable-norm-compat CFLAGS="-fsanitize=address" ++ - --disable-nullslack --enable-warn-dmax ++ - --disable-extensions CFLAGS="-march=native" ++ steps: ++ - uses: actions/checkout@v2 ++ with: ++ fetch-depth: 1 ++ - run: sudo apt-get install doxygen libtext-diff-perl pkg-config ++ - run: sh build-aux/autogen.sh ++ - run: ./configure ${{ matrix.CONF_ARGS }} ++ - if: matrix.CONF_ARGS == '--disable-wchar' ++ name: make kernel module ++ run: make -f Makefile.kernel && make clean ++ - run: make ++ - run: make check-log ++ - if: ${{ contains(matrix.CONF_ARGS, '--enable-gcov') }} ++ name: Run make codecov if --enable-gcov ++ run: | ++ sudo apt-get install libdevel-cover-perl ++ make gcov ++ curl -s https://codecov.io/bash -o codecov_io.sh ++ chmod +x codecov_io.sh ++ bash codecov_io.sh ++ - if: matrix.CONF_ARGS == '' ++ name: Run make distcheck ++ run: | ++ sudo apt-get -y install doxygen ++ make distcheck ++ macOS: ++ name: macOS ++ runs-on: macOS-latest ++ steps: ++ - name: init ++ run: brew install automake ++ - name: checkout ++ uses: actions/checkout@v2 ++ - run: sh build-aux/autogen.sh ++ - run: ./configure ++ - run: make ++ - run: make check-log ++ #- run: make distcheck ++ mingw: ++ name: mingw ++ runs-on: windows-latest ++ env: ++ MSYS2_DIR: msys64 ++ MSYS2_ARCH: x86_64 ++ MSYSTEM: MINGW64 ++ ARCH: win64 ++ PLATFORM: x64 ++ #PATH: "C:\%MSYS2_DIR%\%MSYSTEM%\bin;C:\%MSYS2_DIR%\usr\bin;%PATH%" ++ steps: ++ # see https://github.com/msys2/setup-msys2 ++ - name: setup-msys2 ++ uses: msys2/setup-msys2@v2 ++ with: ++ path-type: minimal ++ update: true ++ install: >- ++ git ++ base-devel ++ coreutils ++ mingw-w64-x86_64-toolchain ++ mingw-w64-x86_64-libtool ++ mingw-w64-x86_64-perl ++ - run: reg add "HKLM\Software\Microsoft\Windows\Windows Error Reporting" /f /v DontShowUI /d 1 ++ - run: git config --global core.autocrlf input ++ - name: checkout ++ uses: actions/checkout@v2 ++ - shell: msys2 {0} ++ run: sh build-aux/autogen.sh ++ #- name: Create zipped asset ++ # run: gzip -c configure >configure.gz ++ #- name: Create Release ++ # id: create_release ++ # uses: actions/create-release@v1 ++ # env: ++ # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ++ # with: ++ # tag_name: ${{ github.ref }} ++ # release_name: Draft Release ${{ github.ref }} ++ # draft: true ++ # prerelease: false ++ #- name: Upload Release Asset ++ # id: upload-release-asset ++ # uses: actions/upload-release-asset@v1 ++ # env: ++ # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ++ # with: ++ # upload_url: ${{ steps.create_release.outputs.upload_url }} ++ # asset_path: ./configure.gz ++ # asset_name: configure.gz ++ # asset_content_type: application/gzip ++ - shell: msys2 {0} ++ run: ./configure ++ - shell: msys2 {0} ++ run: make ++ - shell: msys2 {0} ++ run: make check-log +diff --git a/configure.ac b/configure.ac +index bfc37754..c6cfd8ca 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -4,7 +4,7 @@ + # 2017 Reini Urban + # + # Copyright (c) 2012, 2013 Cisco Systems +-# Copyright (c) 2017, 2018, 2019, 2020 Reini Urban ++# Copyright (c) 2017-2021 Reini Urban + # All rights reserved. + # + # Permission is hereby granted, free of charge, to any person diff --git a/meta-oe/recipes-core/safec/safec/0025-avoid-macro-redefinition-warnings.patch b/meta-oe/recipes-core/safec/safec/0025-avoid-macro-redefinition-warnings.patch new file mode 100644 index 000000000..46bdf5213 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0025-avoid-macro-redefinition-warnings.patch @@ -0,0 +1,60 @@ +From 210fa4546fafa4a36ab2d030803a85a56864dc08 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sun, 18 Apr 2021 19:03:41 +0200 +Subject: [PATCH] avoid macro redefinition warnings + +--- + .github/workflows/main.yml | 2 +- + include/safe_mem_lib.h | 1 + + include/safe_str_lib.h | 1 + + src/safeclib_private.h | 1 + + 4 files changed, 4 insertions(+), 1 deletion(-) + +diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml +index 0ea302db..6f50ad69 100644 +--- a/.github/workflows/main.yml ++++ b/.github/workflows/main.yml +@@ -112,6 +112,6 @@ jobs: + - shell: msys2 {0} + run: ./configure + - shell: msys2 {0} +- run: make ++ run: make V=1 + - shell: msys2 {0} + run: make check-log +diff --git a/include/safe_mem_lib.h b/include/safe_mem_lib.h +index 6981711a..2b7468be 100644 +--- a/include/safe_mem_lib.h ++++ b/include/safe_mem_lib.h +@@ -49,6 +49,7 @@ extern "C" { + #endif + + #if defined _WIN32 && !defined(DISABLE_DLLIMPORT) ++#undef EXTERN + #if defined(EXPORT) && defined(__SAFECLIB_PRIVATE_H__) + #define EXTERN extern __declspec(dllexport) + #else +diff --git a/include/safe_str_lib.h b/include/safe_str_lib.h +index f373abc1..baa0c90b 100644 +--- a/include/safe_str_lib.h ++++ b/include/safe_str_lib.h +@@ -56,6 +56,7 @@ extern "C" { + #endif + + #if defined _WIN32 && !defined(DISABLE_DLLIMPORT) ++#undef EXTERN + #if defined(EXPORT) && defined(__SAFECLIB_PRIVATE_H__) + #define EXTERN extern __declspec(dllexport) + #else +diff --git a/src/safeclib_private.h b/src/safeclib_private.h +index d5cdb3f7..ae07cbcb 100644 +--- a/src/safeclib_private.h ++++ b/src/safeclib_private.h +@@ -600,6 +600,7 @@ typedef unsigned long uintptr_t; + + /* mingw64 3.0.1 + has strtok_s, wcstok_s, and vsnprintf_s, which we patch in the tests. */ ++#undef _ENC_W16 + + #if SIZEOF_WCHAR_T > 2 + diff --git a/meta-oe/recipes-core/safec/safec/0026-add-stpcpy_s.patch b/meta-oe/recipes-core/safec/safec/0026-add-stpcpy_s.patch new file mode 100644 index 000000000..9f30af393 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0026-add-stpcpy_s.patch @@ -0,0 +1,585 @@ +From bfc9f8bb8a9bfd02fde8ef3fd78fcd61411d070d Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sun, 8 Nov 2020 12:04:53 +0100 +Subject: [PATCH] add stpcpy_s + +implemented from scratch, an optimized variant of strcpy_s. +Note that the intel fork also has it, with the same API. + +This adds a src termination check, when src is static. +--- + configure.ac | 2 +- + include/safe_str_lib.h | 8 ++ + src/Makefile.am | 1 + + src/extstr/stpcpy_s.c | 252 +++++++++++++++++++++++++++++++++++++++++ + src/extstr/strcmp_s.c | 2 +- + tests/Makefile.am | 2 + + tests/test_msvcrt.h | 1 + + tests/test_stpcpy_s.c | 210 ++++++++++++++++++++++++++++++++++ + 8 files changed, 476 insertions(+), 2 deletions(-) + create mode 100644 src/extstr/stpcpy_s.c + create mode 100644 tests/test_stpcpy_s.c + +diff --git a/configure.ac b/configure.ac +index c6cfd8ca..4d4220c5 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -873,7 +873,7 @@ AC_CHECK_FUNCS([ memset strcmp strcasecmp strcasestr strcspn strpbrk strspn \ + vswprintf vsnwprintf vswscanf mbsrtowcs mbstowcs iswdigit iswspace \ + towlower towupper towctrans bcmp secure_getenv timingsafe_memcmp \ + timingsafe_bcmp explicit_bzero explicit_memset \ +- asctime_r ctime_r gmtime_r localtime_r memccpy]) ++ asctime_r ctime_r gmtime_r localtime_r memccpy stpcpy]) + + dnl add the extensions, pretending we want them + echo "#define __STDC_WANT_LIB_EXT1__ 1" >>confdefs.h +diff --git a/include/safe_str_lib.h b/include/safe_str_lib.h +index baa0c90b..7742d254 100644 +--- a/include/safe_str_lib.h ++++ b/include/safe_str_lib.h +@@ -245,6 +245,14 @@ EXTERN size_t strerrorlen_s(errno_t errnum); + + #ifndef SAFECLIB_DISABLE_EXTENSIONS + ++/* improved strcpy */ ++EXTERN char *_stpcpy_s_chk(char *restrict dest, rsize_t dmax, ++ const char *restrict src, errno_t *restrict errp, ++ const size_t destbos, const size_t srcbos) ++ BOS_CHK(dest) BOS_NULL(src) BOS_NULL(errp); ++#define stpcpy_s(dest, dmax, src, errp) \ ++ _stpcpy_s_chk(dest, dmax, src, errp, BOS(dest), BOS(src)) ++ + /* string compare */ + EXTERN errno_t _strcmp_s_chk(const char *dest, rsize_t dmax, const char *src, + int *resultp, const size_t destbos, +diff --git a/src/Makefile.am b/src/Makefile.am +index cd77e7e4..8a79881c 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -85,6 +85,7 @@ STD_UNSAFE_FILES = \ + io/tmpnam_s.c + + EXT_STR_FILES = \ ++ extstr/stpcpy_s.c \ + extstr/strcasecmp_s.c \ + extstr/strcasestr_s.c \ + extstr/strcmp_s.c \ +diff --git a/src/extstr/stpcpy_s.c b/src/extstr/stpcpy_s.c +new file mode 100644 +index 00000000..8b42e79d +--- /dev/null ++++ b/src/extstr/stpcpy_s.c +@@ -0,0 +1,252 @@ ++/*------------------------------------------------------------------ ++ * stpcpy_s.c ++ * ++ * November 2020, Reini Urban ++ * ++ * Copyright (c) 2020 by Reini Urban ++ * All rights reserved. ++ * ++ * Permission is hereby granted, free of charge, to any person ++ * obtaining a copy of this software and associated documentation ++ * files (the "Software"), to deal in the Software without ++ * restriction, including without limitation the rights to use, ++ * copy, modify, merge, publish, distribute, sublicense, and/or ++ * sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following ++ * conditions: ++ * ++ * The above copyright notice and this permission notice shall be ++ * included in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES ++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ * OTHER DEALINGS IN THE SOFTWARE. ++ *------------------------------------------------------------------ ++ */ ++ ++#ifdef FOR_DOXYGEN ++#include "safe_str_lib.h" ++#else ++#include "safeclib_private.h" ++#endif ++ ++/* TODO not via the naive byte copy, but aligned long word copy ++ via the (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) ++ trick */ ++ ++/** ++ * @def stpcpy_s(dest,dmax,src,errp) ++ * @brief ++ * The stpcpy_s function copies the string pointed to by src ++ * (including the terminating null character) into the array ++ * pointed to by dest. The strings my not overlap. ++ * With SAFECLIB_STR_NULL_SLACK defined all elements following the ++ * terminating null character (if any) written by stpcpy_s in the ++ * array of dmax characters pointed to by dest are nulled when ++ * stpcpy_s returns. ++ * With modern compilers and constant arguments most errors ++ * will be caught at compile-time. ++ * ++ * @remark SPECIFIED IN ++ * * Since glibc 2.10: _POSIX_C_SOURCE >= 200809L ++ * * Before glibc 2.10: _GNU_SOURCE ++ * ++ * @param[out] dest pointer to string that will be replaced by src. ++ * @param[in] dmax restricted maximum length of dest ++ * @param[in] src pointer to the string that will be copied to dest ++ * @param[out] err EOK when successful operation, the characters in src were ++ * copied into dest and the result is null terminated. ++ * ESNULLP when dest or src is a NULL pointer ++ * ESZEROL when dmax = 0 ++ * ESLEMAX when dmax > RSIZE_MAX_STR ++ * EOVERFLOW when dmax > size of dest (optionally, when the compiler ++ * knows the object_size statically) ++ * ESLEWRNG when dmax != size of dest and --enable-error-dmax ++ * ESUNTERM when src is unterminated ++ * ESOVRLP when strings overlap ++ * ESNOSPC when dest < src ++ * ++ * @pre Neither dest, src nor err nor shall be a null pointer. ++ * @pre dmax shall be size of dest ++ * @pre dmax shall not be greater than RSIZE_MAX_STR or size of dest. ++ * @pre dmax shall not equal zero. ++ * @pre dmax shall be greater than strnlen_s(src, dmax). ++ * @pre Copying shall not take place between objects that overlap. ++ * ++ * @note C11 uses RSIZE_MAX, not RSIZE_MAX_STR. ++ * ++ * @return stpcpy_s() returns a pointer to the end of the string dest (that is, ++ * the address of the terminating null byte) rather than the beginning. ++ * @return If there is a runtime-constraint violation, and if dest ++ * and dmax are valid, then stpcpy_s nulls dest. ++ * ++ * @see ++ * stpncpy_s(), strcpy_s(), strncpy_s() ++ * ++ */ ++#ifdef FOR_DOXYGEN ++char *stpcpy_s(char *restrict dest, rsize_t dmax, const char *restrict src, ++ errno_t *restrict err) ++#else ++EXPORT char *_stpcpy_s_chk(char *restrict dest, rsize_t dmax, ++ const char *restrict src, errno_t *restrict err, ++ const size_t destbos, const size_t srcbos) ++#endif ++{ ++ rsize_t orig_dmax = dmax; ++ char* orig_dest = dest; ++ const char *overlap_bumper; ++ size_t slen; ++ ++ if (unlikely(err == NULL)) { ++ invoke_safe_str_constraint_handler("stpcpy_s: err is null", ++ (void *)dest, ESNULLP); ++ return NULL; ++ } ++ if (unlikely(dest == NULL)) { ++ invoke_safe_str_constraint_handler("stpcpy_s: dest is null", ++ (void *)dest, ESNULLP); ++ *err = RCNEGATE(ESNULLP); ++ return NULL; ++ } ++ if (unlikely(dmax == 0)) { ++ invoke_safe_str_constraint_handler("stpcpy_s: dmax is 0", (void *)dest, ++ ESNULLP); ++ *err = RCNEGATE(ESZEROL); ++ return NULL; ++ } ++ if (destbos == BOS_UNKNOWN) { ++ if (unlikely(dmax > RSIZE_MAX_STR)) { ++ invoke_safe_str_constraint_handler("stpcpy_s: dmax exceeds max", ++ (void *)dest, ESLEMAX); ++ *err = RCNEGATE(ESLEMAX); ++ return NULL; ++ } ++ BND_CHK_PTR_BOUNDS(dest, dmax); ++ } else { ++ if (unlikely(dmax > destbos)) { ++ if (dmax > RSIZE_MAX_STR) { ++ handle_error(dest, destbos, "stpcpy_s: dmax exceeds max", ++ ESLEMAX); ++ *err = RCNEGATE(ESLEMAX); ++ return NULL; ++ } else { ++ *err = handle_str_bos_overload("stpcpy_s: dmax exceeds dest", ++ (char *)dest, destbos); ++ return NULL; ++ } ++ } ++ } ++ if (unlikely(src == NULL)) { ++ handle_error(dest, _BOS_KNOWN(dest) ? BOS(dest) : dmax, ++ "strpcpy_s: src is null", ESNULLP); ++ *err = RCNEGATE(ESNULLP); ++ return NULL; ++ } ++ slen = 0; ++ ++ if (unlikely(dest == src)) { ++ /* walk to the terminating null character */ ++ while (dmax > 0) { ++ if (*dest == '\0') { ++ goto eok; ++ } ++ dmax--; ++ dest++; ++ } ++ goto enospc; ++ } ++ ++ if (dest < src) { ++ overlap_bumper = src; ++ ++ while (dmax > 0) { ++ if (unlikely(dest == overlap_bumper)) { ++ handle_error(orig_dest, orig_dmax, ++ "stpcpy_s: " ++ "overlapping objects", ++ ESOVRLP); ++ *err = RCNEGATE(ESOVRLP); ++ return NULL; ++ } ++ ++ *dest = *src; ++ if (*dest == '\0') ++ goto eok; ++ dmax--; ++ slen++; ++ dest++; ++ src++; ++ /* sentinel srcbos -1 = ULONG_MAX */ ++ if (unlikely(slen >= srcbos)) { ++ invoke_safe_str_constraint_handler("stpcpy_s: src unterminated", ++ (void *)src, ESUNTERM); ++ *err = RCNEGATE(ESUNTERM); ++ return NULL; ++ } ++ } ++ } else { ++ overlap_bumper = dest; ++ ++ while (dmax > 0) { ++ if (unlikely(src == overlap_bumper)) { ++ handle_error(orig_dest, orig_dmax, ++ "stpcpy_s: " ++ "overlapping objects", ++ ESOVRLP); ++ *err = RCNEGATE(ESOVRLP); ++ return NULL; ++ } ++ ++ *dest = *src; ++ if (*dest == '\0') { ++ eok: ++#ifdef SAFECLIB_STR_NULL_SLACK ++ /* null slack to clear any data */ ++ if (dmax > 0x20) ++ memset(dest, 0, dmax); ++ else { ++ while (dmax) { ++ *dest = '\0'; ++ dmax--; ++ dest++; ++ } ++ } ++#endif ++ *err = RCNEGATE(EOK); ++ return dest; ++ } ++ ++ dmax--; ++ slen++; ++ dest++; ++ src++; ++ if (unlikely(slen >= srcbos)) { ++ invoke_safe_str_constraint_handler("stpcpy_s: src unterminated", ++ (void *)src, ESUNTERM); ++ *err = RCNEGATE(ESUNTERM); ++ return NULL; ++ } ++ } ++ } ++ ++ enospc: ++ /* ++ * the entire src must have been copied, if not reset dest ++ * to null the string. (only with SAFECLIB_STR_NULL_SLACK) ++ */ ++ handle_error(orig_dest, orig_dmax, ++ "stpcpy_s: not enough space for src", ++ ESNOSPC); ++ *err = RCNEGATE(ESNOSPC); ++ return NULL; ++} ++#ifdef __KERNEL__ ++EXPORT_SYMBOL(_stpcpy_s_chk); ++#endif /* __KERNEL__ */ ++ +diff --git a/src/extstr/strcmp_s.c b/src/extstr/strcmp_s.c +index f07659c8..ef5ea890 100644 +--- a/src/extstr/strcmp_s.c ++++ b/src/extstr/strcmp_s.c +@@ -62,7 +62,7 @@ + * @retval 0 when strings the same + * @retval <0 when dest less than src + * @retval EOK when comparison is complete +- * @retval ESUNTERM when dest or src is unterminated, or dmax is too small. ++ * @retval ESUNTERM when src is unterminated + * @retval ESNULLP when dest/src/resultp is NULL pointer + * @retval ESZEROL when dmax = 0 + * @retval ESLEMAX when dmax > RSIZE_MAX_STR +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 9ace5de0..21d39595 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -118,6 +118,7 @@ SAFEC_BUILT_TESTS += \ + t_memzero_s \ + t_memzero32_s \ + t_memzero16_s \ ++ t_stpcpy_s \ + t_strcasecmp_s \ + t_strcasestr_s \ + t_strcmp_s \ +@@ -429,6 +430,7 @@ t_memset16_s_SOURCES = test_memset16_s.c $(SAFEC_TEST_COMMON) test_expm + t_memzero_s_SOURCES = test_memzero_s.c $(SAFEC_TEST_COMMON) test_expmem.h + t_memzero32_s_SOURCES = test_memzero32_s.c $(SAFEC_TEST_COMMON) test_expmem.h + t_memzero16_s_SOURCES = test_memzero16_s.c $(SAFEC_TEST_COMMON) test_expmem.h ++t_stpcpy_s_SOURCES = test_stpcpy_s.c $(SAFEC_TEST_COMMON) + t_strcasecmp_s_SOURCES = test_strcasecmp_s.c $(SAFEC_TEST_COMMON) + t_strcasestr_s_SOURCES = test_strcasestr_s.c $(SAFEC_TEST_COMMON) + t_strcmpfld_s_SOURCES = test_strcmpfld_s.c $(SAFEC_TEST_COMMON) +diff --git a/tests/test_msvcrt.h b/tests/test_msvcrt.h +index c0dd9768..0099c7c7 100644 +--- a/tests/test_msvcrt.h ++++ b/tests/test_msvcrt.h +@@ -116,6 +116,7 @@ void _errno_msvc(const int n, const int winerr, int *errp, const char *f, + #undef wmemcmp_s + #undef strcat_s + #undef strcpy_s ++#undef stpcpy_s + #undef strncat_s + #undef strncpy_s + #undef strnlen_s +diff --git a/tests/test_stpcpy_s.c b/tests/test_stpcpy_s.c +new file mode 100644 +index 00000000..484904c9 +--- /dev/null ++++ b/tests/test_stpcpy_s.c +@@ -0,0 +1,210 @@ ++/*------------------------------------------------------------------ ++ * test_stpcpy_s ++ * File 'extstr/stpcpy_s.c' ++ * Lines executed:100.00% of 48 ++ * ++ *------------------------------------------------------------------ ++ */ ++ ++#include "test_private.h" ++#include "safe_str_lib.h" ++#include "config.h" ++ ++#ifdef HAVE_STPCPY_S ++#define HAVE_NATIVE 1 ++#else ++#define HAVE_NATIVE 0 ++#endif ++ ++#define MAX (128) ++#define LEN (128) ++ ++static char str1[LEN]; ++static char str2[LEN]; ++int test_stpcpy_s(void); ++ ++int test_stpcpy_s(void) { ++ errno_t rc; ++ int len; ++ char* dest; ++ int errs = 0; ++ ++ /*--------------------------------------------------*/ ++ ++#ifndef HAVE_CT_BOS_OVR ++ EXPECT_BOS("empty dest") ++ dest = stpcpy_s(NULL, LEN, str2, &rc); ++ ERR(ESNULLP); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(str1, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); ++ len = strlen(str1); ++ ++ EXPECT_BOS("empty dest or dmax") ++ dest = stpcpy_s(str1, 0, str2, &rc); ++ ERR(ESZEROL); ++ ++ /*--------------------------------------------------*/ ++ ++#ifndef HAVE_ASAN /* With asan no BOS? */ ++ if (_BOS_KNOWN(str1)) { ++ EXPECT_BOS("dest overflow") ++ dest = stpcpy_s(str1, LEN + 1, str2, &rc); ++ ERR(EOVERFLOW); /* dmax exceeds dest */ ++ EXPSTR(str1, ""); /* cleared */ ++ CHECK_SLACK(str1, len); ++ } else { ++#ifdef HAVE___BUILTIN_OBJECT_SIZE ++ debug_printf("%s %u Warning unknown str1 size\n", __FUNCTION__, ++ __LINE__); ++#endif ++ } ++#endif ++ ++ EXPECT_BOS("dest overflow") ++ dest = stpcpy_s(str1, (RSIZE_MAX_STR + 1), str2, &rc); ++ ERR(ESLEMAX); ++ ++ EXPECT_BOS("dest overflow") ++ dest = stpcpy_s(str1, (size_t)-1L, str2, &rc); ++ ERR(ESLEMAX); ++ ++ strcpy(str1, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); ++ len = strlen(str1); ++ ++ EXPECT_BOS("empty src") ++ dest = stpcpy_s(str1, 5, NULL, &rc); ++ ERR(ESNULLP); ++ CHECK_SLACK(str1, 5); ++#endif ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(str1, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); ++ str2[0] = '\0'; ++ ++ dest = stpcpy_s(str1, LEN / 2, str2, &rc); ++ ERR(EOK) ++ CHECK_SLACK(str1, LEN / 2); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(str1, "aaaaa"); ++ len = strlen(str1); ++ ++ GCC_PUSH_WARN_RESTRICT ++ dest = stpcpy_s(str1, LEN, str1, &rc); ++ GCC_POP_WARN_RESTRICT ++ ERR(EOK); ++ EXPSTR(str1, "aaaaa"); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(&str1[0], "keep it simple"); ++ ++ dest = stpcpy_s(&str1[0], LEN, &str1[5], &rc); ++ ERR(ESOVRLP); ++ CHECK_SLACK(str1, LEN); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(&str1[0], "keep it simple"); ++ ++ dest = stpcpy_s(&str1[5], LEN - 5, &str1[0], &rc); ++ ERR(ESOVRLP); ++ CHECK_SLACK(&str1[5], LEN - 5); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(str1, "qqweqeqeqeq"); ++ strcpy(str2, "keep it simple"); ++ len = strlen(str1); ++ ++ dest = stpcpy_s(str2, LEN, str1, &rc); ++ ERR(EOK) ++ EXPSTR(str1, str2); ++ CHECK_SLACK(&str2[len], LEN - len); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(&str1[0], "keep it simple"); ++ str2[0] = '\0'; ++ ++ dest = stpcpy_s(str1, LEN, str2, &rc); ++ ERR(EOK) ++ EXPSTR(str1, str2); ++ CHECK_SLACK(str1, LEN); ++ ++ /*--------------------------------------------------*/ ++ ++ str1[0] = '\0'; ++ strcpy(&str2[0], "keep it simple"); ++ len = strlen(str2); ++ ++ dest = stpcpy_s(str1, LEN, str2, &rc); ++ ERR(EOK) ++ EXPSTR(str1, str2); ++ CHECK_SLACK(&str1[len], LEN - len); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(str1, "qqweqeqeqeq"); ++ strcpy(str2, "keep it simple"); ++ len = strlen(str2); ++ ++ dest = stpcpy_s(str1, LEN, str2, &rc); ++ ERR(EOK) ++ EXPSTR(str1, str2); ++ CHECK_SLACK(&str1[len], LEN - len); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(str1, "qqweqeqeqeq"); ++ strcpy(str2, "keep it simple"); ++ ++ dest = stpcpy_s(str1, 1, str2, &rc); ++ ERR(ESNOSPC); ++ CHECK_SLACK(str1, 1); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(str1, "qqweqeqeqeq"); ++ strcpy(str2, "keep it simple"); ++ ++ dest = stpcpy_s(str1, 2, str2, &rc); ++ ERR(ESNOSPC); ++ CHECK_SLACK(str1, 2); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(str1, "qqweqeqeqeq"); ++ strcpy(str2, "it"); ++ ++ dest = stpcpy_s(str1, 3, str2, &rc); ++ ERR(EOK) ++ EXPSTR(str1, str2); ++ CHECK_SLACK(&str1[2], 1); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(str1, "qq12345weqeqeqeq"); ++ strcpy(str2, "it"); ++ ++ dest = stpcpy_s(str1, 10, str2, &rc); ++ ERR(EOK); ++ EXPSTR(str1, str2); ++ CHECK_SLACK(&str1[2], 8); ++ /*for (i=0; i<10; i++) { ++ debug_printf("str1[%i] = %d \n", i, str1[i]); ++ }*/ ++ /*--------------------------------------------------*/ ++ ++ return (errs); ++} ++ ++#ifndef __KERNEL__ ++/* simple hack to get this to work for both userspace and Linux kernel, ++ until a better solution can be created. */ ++int main(void) { return (test_stpcpy_s()); } ++#endif diff --git a/meta-oe/recipes-core/safec/safec/0027-Cope-with-EOVERFLOW-being-an-enum-value-rather-than-.patch b/meta-oe/recipes-core/safec/safec/0027-Cope-with-EOVERFLOW-being-an-enum-value-rather-than-.patch new file mode 100644 index 000000000..09c528bff --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0027-Cope-with-EOVERFLOW-being-an-enum-value-rather-than-.patch @@ -0,0 +1,31 @@ +From e8bf1fff157ba931692130a0ec6f2833fa7d5f87 Mon Sep 17 00:00:00 2001 +From: Adam Borowski +Date: Mon, 18 Oct 2021 15:15:19 +0100 +Subject: [PATCH] Cope with EOVERFLOW being an enum value rather than a macro + on Hurd. + +Closes #101 +--- + tests/test_private.h | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/tests/test_private.h b/tests/test_private.h +index da3b8847..c6f35211 100644 +--- a/tests/test_private.h ++++ b/tests/test_private.h +@@ -176,6 +176,7 @@ + #endif + + /* mingw 3.4 */ ++#ifndef __gnu_hurd__ + #ifndef EOVERFLOW + #ifdef _WIN32 + #define EOVERFLOW 132 +@@ -183,6 +184,7 @@ + #define EOVERFLOW 75 + #endif + #endif ++#endif + + /* for a proper asctime string with 26 digits, i.e. max 4 digit year. + 01.01.10000 00:00 */ diff --git a/meta-oe/recipes-core/safec/safec/0028-stpcpy_s-doc-typo.patch b/meta-oe/recipes-core/safec/safec/0028-stpcpy_s-doc-typo.patch new file mode 100644 index 000000000..55b1a893f --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0028-stpcpy_s-doc-typo.patch @@ -0,0 +1,22 @@ +From e0d34d8158507b64162a733099e961a84dd4e3b5 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sun, 24 Oct 2021 19:55:11 +0200 +Subject: [PATCH] stpcpy_s doc typo + +--- + src/extstr/stpcpy_s.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/extstr/stpcpy_s.c b/src/extstr/stpcpy_s.c +index 8b42e79d..9d29b646 100644 +--- a/src/extstr/stpcpy_s.c ++++ b/src/extstr/stpcpy_s.c +@@ -44,7 +44,7 @@ + * @brief + * The stpcpy_s function copies the string pointed to by src + * (including the terminating null character) into the array +- * pointed to by dest. The strings my not overlap. ++ * pointed to by dest. The strings may not overlap. + * With SAFECLIB_STR_NULL_SLACK defined all elements following the + * terminating null character (if any) written by stpcpy_s in the + * array of dmax characters pointed to by dest are nulled when diff --git a/meta-oe/recipes-core/safec/safec/0029-avoid-macro-redefinition-warnings.patch b/meta-oe/recipes-core/safec/safec/0029-avoid-macro-redefinition-warnings.patch new file mode 100644 index 000000000..33b3d0381 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0029-avoid-macro-redefinition-warnings.patch @@ -0,0 +1,21 @@ +From 4256a9b26b08483715ee0f281ed4bc129dc5740b Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sun, 18 Apr 2021 19:03:41 +0200 +Subject: [PATCH] avoid macro redefinition warnings + +--- + src/safeclib_private.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/safeclib_private.h b/src/safeclib_private.h +index ae07cbcb..5bb3a7fb 100644 +--- a/src/safeclib_private.h ++++ b/src/safeclib_private.h +@@ -604,6 +604,7 @@ typedef unsigned long uintptr_t; + + #if SIZEOF_WCHAR_T > 2 + ++#undef _ENC_W16 + #define _dec_w16(src) *(src) + #define _ENC_W16(dest, dmax, cp) \ + *(dest)++ = (cp); \ diff --git a/meta-oe/recipes-core/safec/safec/0030-stpcpy_s-rename-err-arg-to-errp.patch b/meta-oe/recipes-core/safec/safec/0030-stpcpy_s-rename-err-arg-to-errp.patch new file mode 100644 index 000000000..20d9d2d28 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0030-stpcpy_s-rename-err-arg-to-errp.patch @@ -0,0 +1,145 @@ +From a6b1c99f71cdac8efe6b6470c718e5c226d7bfbc Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sat, 30 Oct 2021 18:13:31 +0200 +Subject: [PATCH] stpcpy_s: rename err arg to errp + +--- + src/extstr/stpcpy_s.c | 34 +++++++++++++++++----------------- + 1 file changed, 17 insertions(+), 17 deletions(-) + +diff --git a/src/extstr/stpcpy_s.c b/src/extstr/stpcpy_s.c +index 9d29b646..bdd2815f 100644 +--- a/src/extstr/stpcpy_s.c ++++ b/src/extstr/stpcpy_s.c +@@ -71,7 +71,7 @@ + * ESOVRLP when strings overlap + * ESNOSPC when dest < src + * +- * @pre Neither dest, src nor err nor shall be a null pointer. ++ * @pre Neither dest, src nor errp nor shall be a null pointer. + * @pre dmax shall be size of dest + * @pre dmax shall not be greater than RSIZE_MAX_STR or size of dest. + * @pre dmax shall not equal zero. +@@ -91,10 +91,10 @@ + */ + #ifdef FOR_DOXYGEN + char *stpcpy_s(char *restrict dest, rsize_t dmax, const char *restrict src, +- errno_t *restrict err) ++ errno_t *restrict errp) + #else + EXPORT char *_stpcpy_s_chk(char *restrict dest, rsize_t dmax, +- const char *restrict src, errno_t *restrict err, ++ const char *restrict src, errno_t *restrict errp, + const size_t destbos, const size_t srcbos) + #endif + { +@@ -103,28 +103,28 @@ EXPORT char *_stpcpy_s_chk(char *restrict dest, rsize_t dmax, + const char *overlap_bumper; + size_t slen; + +- if (unlikely(err == NULL)) { +- invoke_safe_str_constraint_handler("stpcpy_s: err is null", ++ if (unlikely(errp == NULL)) { ++ invoke_safe_str_constraint_handler("stpcpy_s: errp is null", + (void *)dest, ESNULLP); + return NULL; + } + if (unlikely(dest == NULL)) { + invoke_safe_str_constraint_handler("stpcpy_s: dest is null", + (void *)dest, ESNULLP); +- *err = RCNEGATE(ESNULLP); ++ *errp = RCNEGATE(ESNULLP); + return NULL; + } + if (unlikely(dmax == 0)) { + invoke_safe_str_constraint_handler("stpcpy_s: dmax is 0", (void *)dest, + ESNULLP); +- *err = RCNEGATE(ESZEROL); ++ *errp = RCNEGATE(ESZEROL); + return NULL; + } + if (destbos == BOS_UNKNOWN) { + if (unlikely(dmax > RSIZE_MAX_STR)) { + invoke_safe_str_constraint_handler("stpcpy_s: dmax exceeds max", + (void *)dest, ESLEMAX); +- *err = RCNEGATE(ESLEMAX); ++ *errp = RCNEGATE(ESLEMAX); + return NULL; + } + BND_CHK_PTR_BOUNDS(dest, dmax); +@@ -133,10 +133,10 @@ EXPORT char *_stpcpy_s_chk(char *restrict dest, rsize_t dmax, + if (dmax > RSIZE_MAX_STR) { + handle_error(dest, destbos, "stpcpy_s: dmax exceeds max", + ESLEMAX); +- *err = RCNEGATE(ESLEMAX); ++ *errp = RCNEGATE(ESLEMAX); + return NULL; + } else { +- *err = handle_str_bos_overload("stpcpy_s: dmax exceeds dest", ++ *errp = handle_str_bos_overload("stpcpy_s: dmax exceeds dest", + (char *)dest, destbos); + return NULL; + } +@@ -145,7 +145,7 @@ EXPORT char *_stpcpy_s_chk(char *restrict dest, rsize_t dmax, + if (unlikely(src == NULL)) { + handle_error(dest, _BOS_KNOWN(dest) ? BOS(dest) : dmax, + "strpcpy_s: src is null", ESNULLP); +- *err = RCNEGATE(ESNULLP); ++ *errp = RCNEGATE(ESNULLP); + return NULL; + } + slen = 0; +@@ -171,7 +171,7 @@ EXPORT char *_stpcpy_s_chk(char *restrict dest, rsize_t dmax, + "stpcpy_s: " + "overlapping objects", + ESOVRLP); +- *err = RCNEGATE(ESOVRLP); ++ *errp = RCNEGATE(ESOVRLP); + return NULL; + } + +@@ -186,7 +186,7 @@ EXPORT char *_stpcpy_s_chk(char *restrict dest, rsize_t dmax, + if (unlikely(slen >= srcbos)) { + invoke_safe_str_constraint_handler("stpcpy_s: src unterminated", + (void *)src, ESUNTERM); +- *err = RCNEGATE(ESUNTERM); ++ *errp = RCNEGATE(ESUNTERM); + return NULL; + } + } +@@ -199,7 +199,7 @@ EXPORT char *_stpcpy_s_chk(char *restrict dest, rsize_t dmax, + "stpcpy_s: " + "overlapping objects", + ESOVRLP); +- *err = RCNEGATE(ESOVRLP); ++ *errp = RCNEGATE(ESOVRLP); + return NULL; + } + +@@ -218,7 +218,7 @@ EXPORT char *_stpcpy_s_chk(char *restrict dest, rsize_t dmax, + } + } + #endif +- *err = RCNEGATE(EOK); ++ *errp = RCNEGATE(EOK); + return dest; + } + +@@ -229,7 +229,7 @@ EXPORT char *_stpcpy_s_chk(char *restrict dest, rsize_t dmax, + if (unlikely(slen >= srcbos)) { + invoke_safe_str_constraint_handler("stpcpy_s: src unterminated", + (void *)src, ESUNTERM); +- *err = RCNEGATE(ESUNTERM); ++ *errp = RCNEGATE(ESUNTERM); + return NULL; + } + } +@@ -243,7 +243,7 @@ EXPORT char *_stpcpy_s_chk(char *restrict dest, rsize_t dmax, + handle_error(orig_dest, orig_dmax, + "stpcpy_s: not enough space for src", + ESNOSPC); +- *err = RCNEGATE(ESNOSPC); ++ *errp = RCNEGATE(ESNOSPC); + return NULL; + } + #ifdef __KERNEL__ diff --git a/meta-oe/recipes-core/safec/safec/0031-add-stpncpy_s.patch b/meta-oe/recipes-core/safec/safec/0031-add-stpncpy_s.patch new file mode 100644 index 000000000..f731a8d7e --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0031-add-stpncpy_s.patch @@ -0,0 +1,665 @@ +From 137571277d9015460746ff716c0a7c854771a263 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sun, 8 Nov 2020 12:36:06 +0100 +Subject: [PATCH] add stpncpy_s + +analog to stpcpy +--- + configure.ac | 3 +- + include/safe_str_lib.h | 8 ++ + src/Makefile.am | 1 + + src/extstr/stpcpy_s.c | 2 +- + src/extstr/stpncpy_s.c | 295 +++++++++++++++++++++++++++++++++++++++++ + src/str/strncpy_s.c | 4 +- + tests/Makefile.am | 2 + + tests/test_stpcpy_s.c | 3 +- + tests/test_stpncpy_s.c | 217 ++++++++++++++++++++++++++++++ + 9 files changed, 530 insertions(+), 5 deletions(-) + create mode 100644 src/extstr/stpncpy_s.c + create mode 100644 tests/test_stpncpy_s.c + +diff --git a/configure.ac b/configure.ac +index 4d4220c5..45b013da 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -873,7 +873,7 @@ AC_CHECK_FUNCS([ memset strcmp strcasecmp strcasestr strcspn strpbrk strspn \ + vswprintf vsnwprintf vswscanf mbsrtowcs mbstowcs iswdigit iswspace \ + towlower towupper towctrans bcmp secure_getenv timingsafe_memcmp \ + timingsafe_bcmp explicit_bzero explicit_memset \ +- asctime_r ctime_r gmtime_r localtime_r memccpy stpcpy]) ++ asctime_r ctime_r gmtime_r localtime_r memccpy stpcpy stpncpy]) + + dnl add the extensions, pretending we want them + echo "#define __STDC_WANT_LIB_EXT1__ 1" >>confdefs.h +@@ -890,6 +890,7 @@ AC_CHECK_FUNCS( + strnlen_s strtok_s strerror_s vsprintf_s tmpnam_s snprintf_s \ + vsnprintf_s snwprintf_s \ + strspn_s strset_s strchr_s strrchr_s strstr_s strzero_s strnset_s \ ++ stpcpy_s stpncpy_s \ + mbsrtowcs_s mbstowcs_s wcsrtombs_s wcstombs_s \ + wcrtomb_s wctomb_s wcsnlen_s wcscpy_s wcsncpy_s wcscat_s wcsncat_s \ + wmemcpy_s wmemmove_s wcstok_s vswprintf_s swprintf_s vfwprintf_s \ +diff --git a/include/safe_str_lib.h b/include/safe_str_lib.h +index 7742d254..9f5a85ef 100644 +--- a/include/safe_str_lib.h ++++ b/include/safe_str_lib.h +@@ -253,6 +253,14 @@ EXTERN char *_stpcpy_s_chk(char *restrict dest, rsize_t dmax, + #define stpcpy_s(dest, dmax, src, errp) \ + _stpcpy_s_chk(dest, dmax, src, errp, BOS(dest), BOS(src)) + ++EXTERN char *_stpncpy_s_chk(char *restrict dest, rsize_t dmax, ++ const char *restrict src, rsize_t slen, ++ errno_t *restrict errp, ++ const size_t destbos, const size_t srcbos) ++ BOS_CHK(dest) BOS_CHK2(src, slen) BOS_NULL(errp); ++#define stpncpy_s(dest, dmax, src, slen, errp) \ ++ _stpncpy_s_chk(dest, dmax, src, slen, errp, BOS(dest), BOS(src)) ++ + /* string compare */ + EXTERN errno_t _strcmp_s_chk(const char *dest, rsize_t dmax, const char *src, + int *resultp, const size_t destbos, +diff --git a/src/Makefile.am b/src/Makefile.am +index 8a79881c..18284f0d 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -86,6 +86,7 @@ STD_UNSAFE_FILES = \ + + EXT_STR_FILES = \ + extstr/stpcpy_s.c \ ++ extstr/stpncpy_s.c \ + extstr/strcasecmp_s.c \ + extstr/strcasestr_s.c \ + extstr/strcmp_s.c \ +diff --git a/src/extstr/stpcpy_s.c b/src/extstr/stpcpy_s.c +index bdd2815f..49f2555f 100644 +--- a/src/extstr/stpcpy_s.c ++++ b/src/extstr/stpcpy_s.c +@@ -59,7 +59,7 @@ + * @param[out] dest pointer to string that will be replaced by src. + * @param[in] dmax restricted maximum length of dest + * @param[in] src pointer to the string that will be copied to dest +- * @param[out] err EOK when successful operation, the characters in src were ++ * @param[out] errp EOK success. the characters in src were + * copied into dest and the result is null terminated. + * ESNULLP when dest or src is a NULL pointer + * ESZEROL when dmax = 0 +diff --git a/src/extstr/stpncpy_s.c b/src/extstr/stpncpy_s.c +new file mode 100644 +index 00000000..c96c51b3 +--- /dev/null ++++ b/src/extstr/stpncpy_s.c +@@ -0,0 +1,295 @@ ++/*------------------------------------------------------------------ ++ * strncpy_s.c ++ * ++ * November 2020, Reini Urban ++ * ++ * Copyright (c) 2020 by Reini Urban ++ * All rights reserved. ++ * ++ * Permission is hereby granted, free of charge, to any person ++ * obtaining a copy of this software and associated documentation ++ * files (the "Software"), to deal in the Software without ++ * restriction, including without limitation the rights to use, ++ * copy, modify, merge, publish, distribute, sublicense, and/or ++ * sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following ++ * conditions: ++ * ++ * The above copyright notice and this permission notice shall be ++ * included in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES ++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ * OTHER DEALINGS IN THE SOFTWARE. ++ *------------------------------------------------------------------ ++ */ ++ ++#ifdef FOR_DOXYGEN ++#include "safe_str_lib.h" ++#else ++#include "safeclib_private.h" ++#endif ++ ++/* TODO not via the naive byte copy, but aligned long word copy ++ via the (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) ++ trick */ ++ ++/** ++ * @def stpncpy_s(dest,dmax,src,slen,errp) ++ * @brief ++ * The strncpy_s function copies max slen bytes of the string pointed ++ * to by src (excluding the terminating null character) into the array ++ * pointed to by dest. The strings may not overlap. ++ * @details ++ * All elements following the terminating null character (if ++ * any) written by stpncpy_s in the array of dmax characters ++ * pointed to by dest take unspecified values when stpncpy_s returns. ++ * With SAFECLIB_STR_NULL_SLACK defined all elements following the ++ * terminating null character (if any) written by stpncpy_s in the ++ * array of dmax characters pointed to by dest are nulled when ++ * stpncpy_s returns. ++ * With modern compilers and constant arguments most errors ++ * will be caught at compile-time. ++ * ++ * @remark SPECIFIED IN ++ * * Since glibc 2.10: _POSIX_C_SOURCE >= 200809L ++ * * Before glibc 2.10: _GNU_SOURCE ++ * ++ * @param[out] dest pointer to string that will be replaced by src. ++ * @param[in] dmax restricted maximum length of dest ++ * @param[in] src pointer to the string that will be copied to dest ++ * @param[in] slen the maximum number of bytes to copy from src ++ * @param[out] errp EOK success. the characters in src were ++ * copied into dest and the result is null terminated. ++ * ESNULLP when dest or src is a NULL pointer ++ * ESZEROL when dmax = 0 ++ * ESLEMAX when dmax or slen > RSIZE_MAX_STR ++ * EOVERFLOW when dmax/slen > size of dest/slen (optionally, when the compiler ++ * knows the object_size statically) ++ * ESLEWRNG when dmax != size of dest and --enable-error-dmax ++ * ESUNTERM when src is unterminated ++ * ESOVRLP when strings overlap ++ * ESNOSPC when src longer than dest ++ * ++ * @pre Neither dest, src nor err nor shall be a null pointer. ++ * @pre dmax shall be size of dest ++ * @pre dmax shall not be greater than RSIZE_MAX_STR or size of dest. ++ * @pre dmax shall not equal zero. ++ * @pre dmax shall be greater than strnlen_s(src, dmax). ++ * @pre If slen is either greater than or equal to dmax, then dmax should ++ * be more than strnlen_s(src,dmax) to avoid truncation. ++ * @pre Copying shall not take place between objects that overlap. ++ * ++ * @note C11 uses RSIZE_MAX, not RSIZE_MAX_STR. ++ * ++ * @return stpncpy() returns a pointer to the terminating null byte in dest, or, ++ if dest is not null-terminated, dest+n. ++ * @return If there is a runtime-constraint violation, and if dest ++ * and dmax are valid, then stpncpy_s nulls dest. ++ * ++ * @see ++ * stpcpy_s(), strcpy_s(), strncpy_s() ++ * ++ */ ++#ifdef FOR_DOXYGEN ++char *stpncpy_s(char *restrict dest, rsize_t dmax, const char *restrict src, ++ rsize_t slen, errno_t *restrict errp) ++#else ++EXPORT char *_stpncpy_s_chk(char *restrict dest, rsize_t dmax, ++ const char *restrict src, rsize_t slen, ++ errno_t *restrict errp, ++ const size_t destbos, const size_t srcbos) ++#endif ++{ ++ rsize_t orig_dmax = dmax; ++ char* orig_dest = dest; ++ const char *overlap_bumper; ++ ++ if (unlikely(errp == NULL)) { ++ invoke_safe_str_constraint_handler("stpncpy_s: errp is null", ++ (void *)dest, ESNULLP); ++ return NULL; ++ } ++ if (unlikely(dest == NULL)) { ++ invoke_safe_str_constraint_handler("stpncpy_s: dest is null", ++ (void *)dest, ESNULLP); ++ *errp = RCNEGATE(ESNULLP); ++ return NULL; ++ } ++ if (unlikely(dmax == 0)) { ++ invoke_safe_str_constraint_handler("stpncpy_s: dmax is 0", (void *)dest, ++ ESNULLP); ++ *errp = RCNEGATE(ESZEROL); ++ return NULL; ++ } ++ if (destbos == BOS_UNKNOWN) { ++ if (unlikely(dmax > RSIZE_MAX_STR)) { ++ invoke_safe_str_constraint_handler("stpncpy_s: dmax exceeds max", ++ (void *)dest, ESLEMAX); ++ *errp = RCNEGATE(ESLEMAX); ++ return NULL; ++ } ++ BND_CHK_PTR_BOUNDS(dest, dmax); ++ } else { ++ if (unlikely(dmax > destbos)) { ++ if (dmax > RSIZE_MAX_STR) { ++ handle_error(dest, destbos, "stpncpy_s: dmax exceeds max", ++ ESLEMAX); ++ *errp = RCNEGATE(ESLEMAX); ++ return NULL; ++ } else { ++ *errp = handle_str_bos_overload("stpncpy_s: dmax exceeds dest", ++ (char *)dest, destbos); ++ return NULL; ++ } ++ } ++ } ++ if (unlikely(src == NULL)) { ++ handle_error(dest, _BOS_KNOWN(dest) ? BOS(dest) : dmax, ++ "strpcpy_s: src is null", ESNULLP); ++ *errp = RCNEGATE(ESNULLP); ++ return NULL; ++ } ++ //CHK_SRC_OVR_CLEAR("stpncpy_s", src, slen, RSIZE_MAX_STR) ++ if (_BOS_KNOWN(src)) { ++ if (unlikely(_BOS_OVR_N(src, slen))) { ++ *errp = handle_str_bos_overload("stpncpy_s", (char *)dest, ++ _BOS_KNOWN(dest) ? BOS(dest) : dmax); ++ return NULL; ++ } ++ BND_CHK_PTR_BOUNDS(src, slen); ++ } ++ // CHK_SLEN_MAX_CLEAR("stpncpy_s", slen, RSIZE_MAX_STR) ++ if (unlikely(slen > RSIZE_MAX_STR)) { ++ handle_error(dest, _BOS_KNOWN(dest) ? BOS(dest) : strnlen_s(dest, dmax), ++ "stpncpy_s: " _XSTR(slen) " exceeds max", ESLEMAX); ++ *errp = RCNEGATE(ESLEMAX); ++ return NULL; ++ } ++ if (srcbos == BOS_UNKNOWN) { ++ BND_CHK_PTR_BOUNDS(src, slen); ++ } else if (unlikely(slen > srcbos)) { ++ *errp = handle_str_bos_overload("stpncpy_s: slen exceeds src", dest, ++ destbos); ++ return NULL; ++ } ++ ++ if (unlikely(dest == src)) { ++ /* walk to the terminating null character */ ++ while (dmax > 0) { ++ if (*dest == '\0') { ++ goto eok; ++ } ++ dmax--; ++ dest++; ++ } ++ goto enospc; ++ } ++ ++ if (dest < src) { ++ overlap_bumper = src; ++ ++ while (dmax > 0) { ++ if (unlikely(dest == overlap_bumper)) { ++ handle_error(orig_dest, orig_dmax, ++ "stpncpy_s: " ++ "overlapping objects", ++ ESOVRLP); ++ *errp = RCNEGATE(ESOVRLP); ++ return NULL; ++ } ++ if (unlikely(slen == 0)) { ++ /* ++ * Copying truncated to slen chars. Note that the TR says to ++ * copy slen chars plus the null char. We null the slack. ++ */ ++ goto eok; ++ } ++ ++ *dest = *src; ++ if (*dest == '\0') ++ goto eok; ++ dmax--; ++ slen++; ++ dest++; ++ src++; ++ if (unlikely(slen >= srcbos)) { ++ invoke_safe_str_constraint_handler("stpncpy_s: src unterminated", ++ (void *)src, ESUNTERM); ++ *errp = RCNEGATE(ESUNTERM); ++ return NULL; ++ } ++ } ++ } else { ++ overlap_bumper = dest; ++ ++ while (dmax > 0) { ++ if (unlikely(src == overlap_bumper)) { ++ handle_error(orig_dest, orig_dmax, ++ "stpncpy_s: " ++ "overlapping objects", ++ ESOVRLP); ++ *errp = RCNEGATE(ESOVRLP); ++ return NULL; ++ } ++ ++ if (unlikely(slen == 0)) { ++ /* ++ * Copying truncated to slen chars. Note that the TR says to ++ * copy slen chars plus the null char. We null the slack. ++ */ ++ goto eok; ++ } ++ ++ *dest = *src; ++ if (*dest == '\0') { ++ eok: ++#ifdef SAFECLIB_STR_NULL_SLACK ++ /* null slack to clear any data */ ++ if (dmax > 0x20) ++ memset(dest, 0, dmax); ++ else { ++ while (dmax) { ++ *dest = '\0'; ++ dmax--; ++ dest++; ++ } ++ } ++#endif ++ *errp = RCNEGATE(EOK); ++ return dest; ++ } ++ ++ dmax--; ++ slen++; ++ dest++; ++ src++; ++ if (unlikely(slen >= srcbos)) { ++ invoke_safe_str_constraint_handler("stpncpy_s: src unterminated", ++ (void *)src, ESUNTERM); ++ *errp = RCNEGATE(ESUNTERM); ++ return NULL; ++ } ++ } ++ } ++ ++ enospc: ++ /* ++ * the entire src must have been copied, if not reset dest ++ * to null the string. (only with SAFECLIB_STR_NULL_SLACK) ++ */ ++ handle_error(orig_dest, orig_dmax, ++ "stpncpy_s: not enough space for src", ++ ESNOSPC); ++ *errp = RCNEGATE(ESNOSPC); ++ return NULL; ++} ++#ifdef __KERNEL__ ++EXPORT_SYMBOL(_stpncpy_s_chk); ++#endif /* __KERNEL__ */ ++ +diff --git a/src/str/strncpy_s.c b/src/str/strncpy_s.c +index 3e595268..7e828be2 100644 +--- a/src/str/strncpy_s.c ++++ b/src/str/strncpy_s.c +@@ -86,12 +86,12 @@ + * @return If there is a runtime-constraint violation, and if dest and + * dmax are valid, then strncpy_s nulls dest. + * @retval EOK successful operation, when slen == 0 or the characters +- * in src were copied to dest and the result is null terminated. ++ * in src were copied to dest and the result is null terminated. + * @retval ESNULLP when dest/src is NULL pointer + * @retval ESZEROL when dmax = 0 + * @retval ESLEMAX when dmax/slen > RSIZE_MAX_STR + * @retval EOVERFLOW when dmax/slen > size of dest/src (optionally, when the +- * compiler knows the object_size statically) ++ * compiler knows the object_size statically) + * @retval ESLEWRNG when dmax != size of dest and --enable-error-dmax + * @retval ESOVRLP when strings overlap + * @retval ESNOSPC when src longer than dest +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 21d39595..f0b8ee2e 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -119,6 +119,7 @@ SAFEC_BUILT_TESTS += \ + t_memzero32_s \ + t_memzero16_s \ + t_stpcpy_s \ ++ t_stpncpy_s \ + t_strcasecmp_s \ + t_strcasestr_s \ + t_strcmp_s \ +@@ -431,6 +432,7 @@ t_memzero_s_SOURCES = test_memzero_s.c $(SAFEC_TEST_COMMON) test_expme + t_memzero32_s_SOURCES = test_memzero32_s.c $(SAFEC_TEST_COMMON) test_expmem.h + t_memzero16_s_SOURCES = test_memzero16_s.c $(SAFEC_TEST_COMMON) test_expmem.h + t_stpcpy_s_SOURCES = test_stpcpy_s.c $(SAFEC_TEST_COMMON) ++t_stpncpy_s_SOURCES = test_stpncpy_s.c $(SAFEC_TEST_COMMON) + t_strcasecmp_s_SOURCES = test_strcasecmp_s.c $(SAFEC_TEST_COMMON) + t_strcasestr_s_SOURCES = test_strcasestr_s.c $(SAFEC_TEST_COMMON) + t_strcmpfld_s_SOURCES = test_strcmpfld_s.c $(SAFEC_TEST_COMMON) +diff --git a/tests/test_stpcpy_s.c b/tests/test_stpcpy_s.c +index 484904c9..f8851168 100644 +--- a/tests/test_stpcpy_s.c ++++ b/tests/test_stpcpy_s.c +@@ -93,10 +93,11 @@ int test_stpcpy_s(void) { + strcpy(str1, "aaaaa"); + len = strlen(str1); + ++ /* test overlap */ + GCC_PUSH_WARN_RESTRICT + dest = stpcpy_s(str1, LEN, str1, &rc); + GCC_POP_WARN_RESTRICT +- ERR(EOK); ++ ERR(EOK); // same => OK + EXPSTR(str1, "aaaaa"); + + /*--------------------------------------------------*/ +diff --git a/tests/test_stpncpy_s.c b/tests/test_stpncpy_s.c +new file mode 100644 +index 00000000..2b7f9fd2 +--- /dev/null ++++ b/tests/test_stpncpy_s.c +@@ -0,0 +1,217 @@ ++/*------------------------------------------------------------------ ++ * test_strncpy_s ++ * File 'extstr/strncpy_s.c' ++ * Lines executed:100.00% of 48 ++ * ++ *------------------------------------------------------------------ ++ */ ++ ++#include "test_private.h" ++#include "safe_str_lib.h" ++#include "config.h" ++ ++#ifdef HAVE_STPNCPY_S ++#define HAVE_NATIVE 1 ++#else ++#define HAVE_NATIVE 0 ++#endif ++ ++#define MAX (128) ++#define LEN (128) ++ ++static char str1[LEN]; ++static char str2[LEN]; ++int test_strncpy_s(void); ++ ++int test_stpncpy_s(void) { ++ errno_t rc; ++ int len; ++ char* dest; ++ int errs = 0; ++ rsize_t slen = LEN; ++ ++ /*--------------------------------------------------*/ ++ ++#ifndef HAVE_CT_BOS_OVR ++ EXPECT_BOS("empty dest") ++ dest = stpncpy_s(NULL, LEN, str2, slen, &rc); ++ ERR(ESNULLP); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(str1, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); ++ len = strlen(str1); ++ ++ EXPECT_BOS("empty dest or dmax") ++ dest = stpncpy_s(str1, 0, str2, slen, &rc); ++ ERR(ESZEROL); ++ ++ /*--------------------------------------------------*/ ++ ++#ifndef HAVE_ASAN /* With asan no BOS? */ ++ if (_BOS_KNOWN(str1)) { ++ EXPECT_BOS("dest overflow") ++ dest = stpncpy_s(str1, LEN + 1, str2, slen, &rc); ++ ERR(EOVERFLOW); /* dmax exceeds dest */ ++ EXPSTR(str1, ""); /* cleared */ ++ CHECK_SLACK(str1, len); ++ } else { ++#ifdef HAVE___BUILTIN_OBJECT_SIZE ++ debug_printf("%s %u Warning unknown str1 size\n", __FUNCTION__, ++ __LINE__); ++#endif ++ } ++#endif ++ ++ EXPECT_BOS("dest overflow") ++ dest = stpncpy_s(str1, (RSIZE_MAX_STR + 1), str2, slen, &rc); ++ ERR(ESLEMAX); ++ ++ EXPECT_BOS("dest overflow") ++ dest = stpncpy_s(str1, (size_t)-1L, str2, slen, &rc); ++ ERR(ESLEMAX); ++ ++ strcpy(str1, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); ++ len = strlen(str1); ++ ++ EXPECT_BOS("empty src") ++ dest = stpncpy_s(str1, 5, NULL, slen, &rc); ++ ERR(ESNULLP); ++ CHECK_SLACK(str1, 5); ++#endif ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(str1, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); ++ str2[0] = '\0'; ++ slen = 10; ++ ++ dest = stpncpy_s(str1, LEN / 2, str2, slen, &rc); ++ ERR(EOK) ++ CHECK_SLACK(str1, LEN / 2); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(str1, "aaaaa"); ++ len = strlen(str1); ++ ++ /* test overlap */ ++ GCC_PUSH_WARN_RESTRICT ++ dest = stpncpy_s(str1, LEN, str1, slen, &rc); ++ GCC_POP_WARN_RESTRICT ++ ERR(EOK); // OK if the same ++ EXPSTR(str1, "aaaaa"); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(str1, "keep it simple"); ++ slen = strlen(str1); ++ ++ dest = stpncpy_s(&str1[0], LEN, &str1[5], slen - 5, &rc); ++ ERR(ESOVRLP); // TODO ++ CHECK_SLACK(str1, LEN); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(&str1[0], "keep it simple"); ++ slen = strlen(str1); ++ ++ dest = stpncpy_s(&str1[5], LEN - 5, &str1[0], slen, &rc); ++ ERR(ESOVRLP); ++ CHECK_SLACK(&str1[5], LEN - 5); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(str1, "qqweqeqeqeq"); ++ strcpy(str2, "keep it simple"); ++ slen = len = strlen(str1); ++ ++ dest = stpncpy_s(str2, LEN, str1, slen, &rc); ++ ERR(EOK) ++ EXPSTR(str1, str2); ++ CHECK_SLACK(&str2[len], LEN - len); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(&str1[0], "keep it simple"); ++ str2[0] = '\0'; ++ slen = 10; ++ ++ dest = stpncpy_s(str1, LEN, str2, slen, &rc); ++ ERR(EOK) ++ EXPSTR(str1, str2); ++ CHECK_SLACK(str1, LEN); ++ ++ /*--------------------------------------------------*/ ++ ++ str1[0] = '\0'; ++ strcpy(&str2[0], "keep it simple"); ++ slen = len = strlen(str2); ++ ++ dest = stpncpy_s(str1, LEN, str2, slen, &rc); ++ ERR(EOK) ++ EXPSTR(str1, str2); ++ CHECK_SLACK(&str1[len], LEN - len); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(str1, "qqweqeqeqeq"); ++ strcpy(str2, "keep it simple"); ++ slen = len = strlen(str2); ++ ++ dest = stpncpy_s(str1, LEN, str2, slen, &rc); ++ ERR(EOK) ++ EXPSTR(str1, str2); ++ CHECK_SLACK(&str1[len], LEN - len); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(str1, "qqweqeqeqeq"); ++ strcpy(str2, "keep it simple"); ++ slen = strlen(str2); ++ ++ dest = stpncpy_s(str1, 1, str2, slen, &rc); ++ ERR(ESNOSPC); ++ CHECK_SLACK(str1, 1); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(str1, "qqweqeqeqeq"); ++ strcpy(str2, "keep it simple"); ++ ++ dest = stpncpy_s(str1, 2, str2, slen, &rc); ++ ERR(ESNOSPC); ++ CHECK_SLACK(str1, 2); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(str1, "qqweqeqeqeq"); ++ strcpy(str2, "it"); ++ ++ dest = stpncpy_s(str1, 3, str2, 2, &rc); ++ ERR(EOK) ++ EXPSTR(str1, str2); ++ CHECK_SLACK(&str1[2], 1); ++ ++ /*--------------------------------------------------*/ ++ ++ strcpy(str1, "qq12345weqeqeqeq"); ++ strcpy(str2, "it"); ++ ++ dest = stpncpy_s(str1, 10, str2, 2, &rc); ++ ERR(EOK); ++ EXPSTR(str1, str2); ++ CHECK_SLACK(&str1[2], 8); ++ /*for (i=0; i<10; i++) { ++ debug_printf("str1[%i] = %d \n", i, str1[i]); ++ }*/ ++ /*--------------------------------------------------*/ ++ ++ return (errs); ++} ++ ++#ifndef __KERNEL__ ++/* simple hack to get this to work for both userspace and Linux kernel, ++ until a better solution can be created. */ ++int main(void) { return (test_stpncpy_s()); } ++#endif diff --git a/meta-oe/recipes-core/safec/safec/0032-configure-don-t-probe-for-wchar-with-disable-wchar.patch b/meta-oe/recipes-core/safec/safec/0032-configure-don-t-probe-for-wchar-with-disable-wchar.patch new file mode 100644 index 000000000..c7dda09f4 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0032-configure-don-t-probe-for-wchar-with-disable-wchar.patch @@ -0,0 +1,185 @@ +From f3b041f44e25d1d09269aed44337e503042becda Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Tue, 26 Oct 2021 19:27:49 +0200 +Subject: [PATCH] configure: don't probe for wchar with --disable-wchar + +minor performance optim +--- + configure.ac | 112 ++++++++++++++++++++++++++++++--------------------- + 1 file changed, 65 insertions(+), 47 deletions(-) + +diff --git a/configure.ac b/configure.ac +index 45b013da..8f568d77 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -849,6 +849,43 @@ AX_GCC_BUILTIN(__builtin___bnd_chk_ptr_bounds) + #AX_GCC_BUILTIN(__builtin___bnd_get_ptr_lbound) + #AX_GCC_BUILTIN(__builtin___bnd_get_ptr_ubound) + ++AC_CHECK_FUNCS([ vswprintf vswscanf mbsrtowcs ]) ++ ++dnl this user choice needs to probe first for the default ++AC_ARG_ENABLE(wchar, ++ AS_HELP_STRING([--disable-wchar], ++ [Disable multibyte and wchar support. @<:@default=no@:>@]), ++ [case "${enableval}" in ++ yes) enable_wchar=true ;; ++ no) enable_wchar=false ;; ++ dnl early mingw32 have only crippled wchar support: only wcscmp, wcslen ++ *) if test x$ac_cv_type_wchar_t = xyes -a x$ac_cv_func_vswprintf = xyes \ ++ -a x$ac_cv_header_wchar_h = xyes ++ then ++ enable_wchar=true ++ else ++ AC_MSG_WARN([no proper wchar support]) ++ enable_wchar=false ++ fi ;; ++ esac], [enable_wchar=true]) ++ ++AC_MSG_CHECKING([for --disable-wchar or broken wchar usability]) ++dnl catch mingw32 1.0 with crippled wchar ++ ++if test x$ac_cv_header_wchar_h = xyes -a x$enable_wchar = xtrue \ ++ -a x$ac_cv_func_vswprintf = xyes \ ++ -a x$ac_cv_func_mbsrtowcs = xyes -a x$ac_cv_func_vswscanf = xyes ++then ++ enable_wchar=true ++else ++ enable_wchar=false ++fi ++if test "x$enable_wchar" = "xtrue" ; then ++ AC_MSG_RESULT([no (default)]) ++else ++ AC_MSG_RESULT([yes]) ++fi ++ + AC_MSG_NOTICE([Check library functions]) + # =============================================== + # dynamic checks if registered via malloc (e.g. libmpx) +@@ -857,9 +894,9 @@ dnl bos enabled chk functions (but not yet usable) + #for b in $builtins_chk; do + AC_CHECK_FUNCS([__memcpy_chk __memmove_chk __memset_chk \ + __strcpy_chk __strncpy_chk __strcat_chk __strncat_chk \ +- __printf_chk __sprintf_chk __snprintf_chk __swprintf_chk \ ++ __printf_chk __sprintf_chk __snprintf_chk \ + __vfprintf_chk __vfwprintf_chk __vsprintf_chk __vsnprintf_chk \ +- __vsscanf_chk __vswscanf_chk ]) ++ __vsscanf_chk ]) + #done + dnl They need to include the relevant intrin header first + dnl TODO: probe for MEMORY_BARRIER and COMPILER_BARRIER here +@@ -869,46 +906,58 @@ AC_FUNC_MEMCMP + dnl no header needed as is checks if the linker can find it + dnl mbstowcs missing on cygwin64 + AC_CHECK_FUNCS([ memset strcmp strcasecmp strcasestr strcspn strpbrk strspn \ +- strnstr strnlen strrchr memrchr strstr wmemchr wmemcmp wcscmp wcsstr \ +- vswprintf vsnwprintf vswscanf mbsrtowcs mbstowcs iswdigit iswspace \ +- towlower towupper towctrans bcmp secure_getenv timingsafe_memcmp \ ++ strnstr strnlen strrchr memrchr strstr bcmp secure_getenv timingsafe_memcmp \ + timingsafe_bcmp explicit_bzero explicit_memset \ + asctime_r ctime_r gmtime_r localtime_r memccpy stpcpy stpncpy]) + ++if test "x$enable_wchar" = "xtrue" ; then ++ AC_CHECK_FUNCS([ wmemchr wmemcmp wcscmp wcsstr \ ++ vswprintf vsnwprintf vswscanf mbsrtowcs mbstowcs iswdigit iswspace \ ++ towlower towupper towctrans ]) ++ AC_CHECK_FUNCS([ __swprintf_chk __vfwprintf_chk __vswscanf_chk ]) ++fi ++ + dnl add the extensions, pretending we want them + echo "#define __STDC_WANT_LIB_EXT1__ 1" >>confdefs.h ++ + dnl native safec shadowing functions (should be none) + AC_CHECK_FUNCS([_memcpy_s_chk _memmove_s_chk _memset_s_chk _memcmp_s_chk \ + _strcpy_s_chk _strncpy_s_chk _strcat_s_chk _strncat_s_chk _strnlen_s_chk \ +- _printf_s_chk _sprintf_s_chk _snprintf_s_chk _swprintf_s_chk \ +- _vfprintf_s_chk _vfwprintf_s_chk _vsprintf_s_chk _vsnprintf_s_chk]) ++ _printf_s_chk _sprintf_s_chk _snprintf_s_chk \ ++ _vfprintf_s_chk _vsprintf_s_chk _vsnprintf_s_chk]) ++ + dnl native C11 Annex K functions + dnl vsnprintf_s vsnwprintf_s strtok_s wcstok_s deviate in mingw from c11 + AC_CHECK_FUNCS( + [ memset_s memcpy_s memmove_s memzero_s memchr_s memrchr_s memccpy_s \ + sprintf_s strcat_s strcpy_s strncat_s strncpy_s \ +- strnlen_s strtok_s strerror_s vsprintf_s tmpnam_s snprintf_s \ +- vsnprintf_s snwprintf_s \ ++ strnlen_s strtok_s strerror_s vsprintf_s tmpnam_s snprintf_s vsnprintf_s \ + strspn_s strset_s strchr_s strrchr_s strstr_s strzero_s strnset_s \ + stpcpy_s stpncpy_s \ +- mbsrtowcs_s mbstowcs_s wcsrtombs_s wcstombs_s \ ++ sscanf_s fscanf_s scanf_s vfscanf_s \ ++ vsscanf_s vscanf_s printf_s fprintf_s tmpfile_s vfprintf_s vprintf_s \ ++ fopen_s freopen_s gets_s bsearch_s qsort_s gmtime_s localtime_s \ ++ asctime_s ctime_s getenv_s ]) ++ ++if test "x$enable_wchar" = "xtrue" ; then ++ AC_CHECK_FUNCS( ++ [ mbsrtowcs_s mbstowcs_s wcsrtombs_s wcstombs_s \ + wcrtomb_s wctomb_s wcsnlen_s wcscpy_s wcsncpy_s wcscat_s wcsncat_s \ + wmemcpy_s wmemmove_s wcstok_s vswprintf_s swprintf_s vfwprintf_s \ +- vwprintf_s wprintf_s fwprintf_s swscanf_s vswscanf_s wscanf_s \ ++ vwprintf_s wprintf_s snwprintf_s fwprintf_s swscanf_s vswscanf_s wscanf_s \ + vfwscanf_s fwscanf_s vwscanf_s vsnwprintf_s wcsstr_s wmemcmp_s \ + wcscmp_s wcsncmp_s wcsicmp_s wcsset_s wcsnset_s wcscoll_s wcslwr_s \ +- wcsupr_s towfc_s wcsfc_s sscanf_s fscanf_s scanf_s vfscanf_s \ +- vsscanf_s vscanf_s printf_s fprintf_s tmpfile_s vfprintf_s vprintf_s \ +- fopen_s freopen_s gets_s bsearch_s qsort_s gmtime_s localtime_s \ +- asctime_s ctime_s getenv_s ]) ++ wcsupr_s towfc_s wcsfc_s ]) ++ AC_CHECK_FUNCS([ _swprintf_s_chk _vfwprintf_s_chk ]) ++fi + dnl but delete it, because we override it case by case + $GREP -v '__STDC_WANT_LIB_EXT1__' confdefs.h > confdefs.h.tmp + mv confdefs.h.tmp confdefs.h + + AM_CONDITIONAL([HAVE_WCSSTR], [test "x$ac_cv_func_wcsstr" = "xyes"]) + AM_CONDITIONAL([HAVE_MBSTOWCS], [test "x$ac_cv_func_mbstowcs" = "xyes"]) +-AM_CONDITIONAL([HAVE_MEMCPY_S], [test "x$ac_cv_func_memcpy_s" = "xyes"]) + AM_CONDITIONAL([HAVE_VSNWPRINTF_S], [test "x$ac_cv_func_vsnwprintf_s" = "xyes"]) ++AM_CONDITIONAL([HAVE_MEMCPY_S], [test "x$ac_cv_func_memcpy_s" = "xyes"]) + AM_CONDITIONAL([HAVE_TIMINGSAFE_BCMP], + [test "x$ac_cv_func_timingsafe_memcmp" = "xyes" -a "x$ac_cv_func_timingsafe_bcmp" = "xyes" ]) + +@@ -950,41 +999,10 @@ return strnstr("%s %n", "%n", 6) ? 0 : 1; + [ AC_MSG_RESULT([no (cross)]) ]) + fi + +-dnl this user choice needs to probe first for the default +-AC_ARG_ENABLE(wchar, +- AS_HELP_STRING([--disable-wchar], +- [Disable multibyte and wchar support. @<:@default=no@:>@]), +- [case "${enableval}" in +- yes) enable_wchar=true ;; +- no) enable_wchar=false ;; +- dnl early mingw32 have only crippled wchar support: only wcscmp, wcslen +- *) if test x$ac_cv_type_wchar_t = xyes -a x$ac_cv_func_vswprintf = xyes \ +- -a x$ac_cv_header_wchar_h = xyes +- then +- enable_wchar=true +- else +- AC_MSG_WARN([no proper wchar support]) +- enable_wchar=false +- fi ;; +- esac], [enable_wchar=true]) +-AC_MSG_CHECKING([for --disable-wchar or broken wchar usability]) +-dnl catch mingw32 1.0 with crippled wchar +- +- +-if test x$ac_cv_header_wchar_h = xyes -a x$enable_wchar = xtrue \ +- -a x$ac_cv_func_vswprintf = xyes \ +- -a x$ac_cv_func_mbsrtowcs = xyes -a x$ac_cv_func_vswscanf = xyes +-then +- enable_wchar=true +-else +- enable_wchar=false +-fi + if test "x$enable_wchar" = "xtrue" ; then +- AC_MSG_RESULT([no (default)]) + INSERT_DISABLE_WCHAR="#undef SAFECLIB_DISABLE_WCHAR" + AX_COMPILE_CHECK_SIZEOF(wchar_t, [#include ]) + else +- AC_MSG_RESULT([yes]) + INSERT_DISABLE_WCHAR="#define SAFECLIB_DISABLE_WCHAR 1" + ac_cv_header_wchar_h=no + fi diff --git a/meta-oe/recipes-core/safec/safec/0033-doxyfile-update.patch b/meta-oe/recipes-core/safec/safec/0033-doxyfile-update.patch new file mode 100644 index 000000000..21ecf020c --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0033-doxyfile-update.patch @@ -0,0 +1,64 @@ +From ac5baea3897ade0def2529059e66f287f94b4c87 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sat, 30 Oct 2021 17:10:44 +0200 +Subject: [PATCH] doxyfile update + +COLS_IN_ALPHA_INDEX is now obsolete +--- + Doxyfile.in | 1 - + src/str/snprintf_s.c | 2 +- + src/str/sprintf_s.c | 2 +- + src/wchar/snwprintf_s.c | 2 +- + 4 files changed, 3 insertions(+), 4 deletions(-) + +diff --git a/Doxyfile.in b/Doxyfile.in +index 57220b52..dfd37cb1 100644 +--- a/Doxyfile.in ++++ b/Doxyfile.in +@@ -147,7 +147,6 @@ VERBATIM_HEADERS = NO + # Configuration options related to the alphabetical class index + #--------------------------------------------------------------------------- + ALPHABETICAL_INDEX = YES +-COLS_IN_ALPHA_INDEX = 5 + IGNORE_PREFIX = + #--------------------------------------------------------------------------- + # Configuration options related to the HTML output +diff --git a/src/str/snprintf_s.c b/src/str/snprintf_s.c +index 9f27d210..5b4cfa5e 100644 +--- a/src/str/snprintf_s.c ++++ b/src/str/snprintf_s.c +@@ -43,7 +43,7 @@ any of the arguments corresponding to %s is a null pointer + */ + + /** +- * @def snprintf_s(dest,dmax,fmt,...) ++ * @def snprintf_s(dest, dmax, fmt, ...) + * @brief + * The truncating \c snprintf_s function composes a string with + * same test that would be printed if format was used on \c +diff --git a/src/str/sprintf_s.c b/src/str/sprintf_s.c +index 1c12b1c8..06c09eb6 100644 +--- a/src/str/sprintf_s.c ++++ b/src/str/sprintf_s.c +@@ -42,7 +42,7 @@ + #else + + /** +- * @def sprintf_s(dest,dmax,fmt,...) ++ * @def sprintf_s(dest, dmax, fmt, ...) + * @brief + * The \b sprintf_s function composes a string with the same content that + * would be printed if format was used on printf. Instead of being +diff --git a/src/wchar/snwprintf_s.c b/src/wchar/snwprintf_s.c +index b4a4c0b7..6c51dbef 100644 +--- a/src/wchar/snwprintf_s.c ++++ b/src/wchar/snwprintf_s.c +@@ -43,7 +43,7 @@ any of the arguments corresponding to %s is a null pointer. + */ + + /** +- * @def snwprintf_s(dest,dmax,fmt,...) ++ * @def snwprintf_s(dest, dmax, fmt, ...) + * @brief + * The truncating \c snwprintf_s function composes a wide string + * with same test that would be printed if format was used on \c diff --git a/meta-oe/recipes-core/safec/safec/0034-gcc-std-c-11-already-defines-_GNU_SOURCE.patch b/meta-oe/recipes-core/safec/safec/0034-gcc-std-c-11-already-defines-_GNU_SOURCE.patch new file mode 100644 index 000000000..bc8908877 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0034-gcc-std-c-11-already-defines-_GNU_SOURCE.patch @@ -0,0 +1,154 @@ +From 2f7cd39eecd192c8c89032f123fdf4e5e3a08132 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sat, 30 Oct 2021 18:08:39 +0200 +Subject: [PATCH] gcc -std=c++11 already defines _GNU_SOURCE + +--- + src/extmem/memzero_s.c | 2 ++ + src/io/gets_s.c | 2 ++ + src/os/asctime_s.c | 2 ++ + src/os/ctime_s.c | 2 ++ + src/os/gmtime_s.c | 2 ++ + src/os/localtime_s.c | 2 ++ + tests/test_stpcpy_s.c | 2 +- + tests/test_stpncpy_s.c | 2 ++ + tests/test_wcsfc_s.c | 2 +- + tests/test_wcstombs_s.c | 2 +- + 10 files changed, 17 insertions(+), 3 deletions(-) + +diff --git a/src/extmem/memzero_s.c b/src/extmem/memzero_s.c +index b4b03ef8..3ed7ba62 100644 +--- a/src/extmem/memzero_s.c ++++ b/src/extmem/memzero_s.c +@@ -31,7 +31,9 @@ + *------------------------------------------------------------------ + */ + ++#ifndef _GNU_SOURCE + #define _GNU_SOURCE ++#endif + + #ifdef FOR_DOXYGEN + #include "safe_mem_lib.h" +diff --git a/src/io/gets_s.c b/src/io/gets_s.c +index 05366dd1..22a9340e 100644 +--- a/src/io/gets_s.c ++++ b/src/io/gets_s.c +@@ -29,7 +29,9 @@ + *------------------------------------------------------------------ + */ + ++#ifndef _GNU_SOURCE + #define _GNU_SOURCE ++#endif + + #ifdef FOR_DOXYGEN + #include "safe_lib.h" +diff --git a/src/os/asctime_s.c b/src/os/asctime_s.c +index 9976c4aa..9d0e00d0 100644 +--- a/src/os/asctime_s.c ++++ b/src/os/asctime_s.c +@@ -29,7 +29,9 @@ + *------------------------------------------------------------------ + */ + ++#ifndef _GNU_SOURCE + #define _GNU_SOURCE ++#endif + + #ifdef FOR_DOXYGEN + #include "safe_lib.h" +diff --git a/src/os/ctime_s.c b/src/os/ctime_s.c +index 277c91ef..5fe707e5 100644 +--- a/src/os/ctime_s.c ++++ b/src/os/ctime_s.c +@@ -29,7 +29,9 @@ + *------------------------------------------------------------------ + */ + ++#ifndef _GNU_SOURCE + #define _GNU_SOURCE ++#endif + + #ifdef FOR_DOXYGEN + #include "safe_lib.h" +diff --git a/src/os/gmtime_s.c b/src/os/gmtime_s.c +index 0ef4418f..f76039bc 100644 +--- a/src/os/gmtime_s.c ++++ b/src/os/gmtime_s.c +@@ -29,7 +29,9 @@ + *------------------------------------------------------------------ + */ + ++#ifndef _GNU_SOURCE + #define _GNU_SOURCE ++#endif + + #ifdef FOR_DOXYGEN + #include "safe_lib.h" +diff --git a/src/os/localtime_s.c b/src/os/localtime_s.c +index 92ea21b9..b5bbbccf 100644 +--- a/src/os/localtime_s.c ++++ b/src/os/localtime_s.c +@@ -29,7 +29,9 @@ + *------------------------------------------------------------------ + */ + ++#ifndef _GNU_SOURCE + #define _GNU_SOURCE ++#endif + + #ifdef FOR_DOXYGEN + #include "safe_lib.h" +diff --git a/tests/test_stpcpy_s.c b/tests/test_stpcpy_s.c +index f8851168..7656f379 100644 +--- a/tests/test_stpcpy_s.c ++++ b/tests/test_stpcpy_s.c +@@ -1,7 +1,7 @@ + /*------------------------------------------------------------------ + * test_stpcpy_s + * File 'extstr/stpcpy_s.c' +- * Lines executed:100.00% of 48 ++ * Lines executed:83.53% of 85 + * + *------------------------------------------------------------------ + */ +diff --git a/tests/test_stpncpy_s.c b/tests/test_stpncpy_s.c +index 2b7f9fd2..83ca6b63 100644 +--- a/tests/test_stpncpy_s.c ++++ b/tests/test_stpncpy_s.c +@@ -1,6 +1,8 @@ + /*------------------------------------------------------------------ + * test_strncpy_s + * File 'extstr/strncpy_s.c' ++ * File 'stpncpy_s.c' ++ * Lines executed:75.25% of 101 + * Lines executed:100.00% of 48 + * + *------------------------------------------------------------------ +diff --git a/tests/test_wcsfc_s.c b/tests/test_wcsfc_s.c +index 02703e30..f81c5113 100644 +--- a/tests/test_wcsfc_s.c ++++ b/tests/test_wcsfc_s.c +@@ -1,7 +1,7 @@ + /*------------------------------------------------------------------ + * test_wcsfc_s + * File 'wcsfc_s.c' +- * Lines executed:52.21% of 136 ++ * Lines executed:94.12% of 136 + * + *------------------------------------------------------------------ + */ +diff --git a/tests/test_wcstombs_s.c b/tests/test_wcstombs_s.c +index 3b932770..46f4cb8d 100644 +--- a/tests/test_wcstombs_s.c ++++ b/tests/test_wcstombs_s.c +@@ -1,7 +1,7 @@ + /*------------------------------------------------------------------ + * test_wcstombs_s + * File 'wchar/wcstombs_s.c' +- * Lines executed:90.63% of 32 ++ * Lines executed:90.62% of 32 + * + *------------------------------------------------------------------ + */ diff --git a/meta-oe/recipes-core/safec/safec/0035-mingw-fixes-disable-p_memset_s-test.patch b/meta-oe/recipes-core/safec/safec/0035-mingw-fixes-disable-p_memset_s-test.patch new file mode 100644 index 000000000..634c1c303 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0035-mingw-fixes-disable-p_memset_s-test.patch @@ -0,0 +1,89 @@ +From ef647ca6d394184b074875734da5b3983a5eb517 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sat, 30 Oct 2021 18:59:51 +0200 +Subject: [PATCH] mingw fixes: disable p_memset_s test + +and improve the includes for some p_ deps +--- + src/mem/mem_primitives_lib.h | 2 +- + src/mem/safe_mem_constraint.h | 2 +- + src/str/safe_str_constraint.h | 2 +- + tests/Makefile.am | 11 +++++++++-- + tests/perf_memset_s.c | 2 +- + 5 files changed, 13 insertions(+), 6 deletions(-) + +diff --git a/src/mem/mem_primitives_lib.h b/src/mem/mem_primitives_lib.h +index 72365e4e..347b3a2f 100644 +--- a/src/mem/mem_primitives_lib.h ++++ b/src/mem/mem_primitives_lib.h +@@ -35,7 +35,7 @@ + #define __MEM_PRIMITIVES_LIB_H__ + + #ifndef FOR_DOXYGEN +-#include "safeclib_private.h" ++#include "src/safeclib_private.h" + #endif + + #ifndef __KERNEL__ +diff --git a/src/mem/safe_mem_constraint.h b/src/mem/safe_mem_constraint.h +index 41346819..748af001 100644 +--- a/src/mem/safe_mem_constraint.h ++++ b/src/mem/safe_mem_constraint.h +@@ -35,7 +35,7 @@ + #ifdef FOR_DOXYGEN + #include "safe_mem_lib.h" + #else +-#include "safeclib_private.h" ++#include "src/safeclib_private.h" + #endif + + /* +diff --git a/src/str/safe_str_constraint.h b/src/str/safe_str_constraint.h +index 19f1dd97..0a685185 100644 +--- a/src/str/safe_str_constraint.h ++++ b/src/str/safe_str_constraint.h +@@ -35,7 +35,7 @@ + #ifdef FOR_DOXYGEN + #include "safe_str_lib.h" + #else +-#include "safeclib_private.h" ++#include "src/safeclib_private.h" + #endif + + /* +diff --git a/tests/Makefile.am b/tests/Makefile.am +index f0b8ee2e..535e91e8 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -197,9 +197,16 @@ SAFEC_BUILT_TESTS += \ + endif + endif + +-SAFEC_BUILT_PERFS = p_memcpy_s p_memset_s p_strcpy_s ++SAFEC_BUILT_PERFS = \ ++ p_memcpy_s \ ++ p_strcpy_s ++if !HAVE_MINGW ++SAFEC_BUILT_PERFS += \ ++ p_memset_s ++endif + if ENABLE_EXTS +-SAFEC_BUILT_PERFS += p_memcpy32_s ++SAFEC_BUILT_PERFS += \ ++ p_memcpy32_s + endif + + SAFEC_TEST_COMMON = \ +diff --git a/tests/perf_memset_s.c b/tests/perf_memset_s.c +index ca89ceec..303ad14e 100644 +--- a/tests/perf_memset_s.c ++++ b/tests/perf_memset_s.c +@@ -28,7 +28,7 @@ + #include "safe_mem_lib.h" + #include "perf_private.h" + #undef debug_printf +-#include "mem/mem_primitives_lib.h" ++#include "src/mem/mem_primitives_lib.h" + + #if defined(TEST_MSVCRT) && defined(HAVE_MEMSET_S) + #undef memset_s diff --git a/meta-oe/recipes-core/safec/safec/0036-fixup-smoker-for-mingw.patch b/meta-oe/recipes-core/safec/safec/0036-fixup-smoker-for-mingw.patch new file mode 100644 index 000000000..96b9ef4e9 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0036-fixup-smoker-for-mingw.patch @@ -0,0 +1,106 @@ +From d39290baca0d475906d53ffa674c2dd5a075d7e7 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sat, 30 Oct 2021 19:39:03 +0200 +Subject: [PATCH] fixup smoker for mingw + +cross from linux might need libssp-0.dll, at least on fedora. +not on debian +--- + build-aux/smoke.sh | 25 ++++++++++++++----------- + tests/test_stpncpy_s.c | 3 --- + 2 files changed, 14 insertions(+), 14 deletions(-) + +diff --git a/build-aux/smoke.sh b/build-aux/smoke.sh +index 2d70978c..1a061077 100755 +--- a/build-aux/smoke.sh ++++ b/build-aux/smoke.sh +@@ -121,7 +121,7 @@ if [ -e /opt/pgi/osx86-64/2019/bin/pgcc ]; then + echo /opt/pgi/osx86-64/2019/bin/pgcc --enable-unsafe --enable-debug + CC=/opt/pgi/osx86-64/2019/bin/pgcc ./configure --enable-unsafe --enable-debug && \ + gmake -s j4 && gmake check-log +- # fails on several not null slack wirh >RMAX ++ # fails on several not null slack with >RMAX + gmake -s -j4 clean + fi + +@@ -129,15 +129,15 @@ fi + + Linux) + make -s clean +- for clang in clang clang-10 clang-7 clang-5.0 ++ if test -n "`which clang`"; then ++ echo clang -fsanitize=address -fno-omit-frame-pointer --enable-debug --enable-unsafe --enable-norm-compat ++ CC="clang -fsanitize=address -fno-omit-frame-pointer" \ ++ ./configure --enable-debug --enable-unsafe --enable-norm-compat && \ ++ make -s -j4 check-log || exit ++ make -s clean ++ fi ++ for clang in clang clang-{11,10,7,5.0} + do +- if test -n "`which clang`"; then +- echo $clang -fsanitize=address -fno-omit-frame-pointer --enable-debug --enable-unsafe --enable-norm-compat +- CC="clang -fsanitize=address -fno-omit-frame-pointer" \ +- ./configure --enable-debug --enable-unsafe --enable-norm-compat && \ +- make -s -j4 check-log || exit +- make -s clean +- fi + if test -n `which $clang`; then + echo $clang -march=native --disable-constraint-handler --enable-unsafe --enable-norm-compat + CC="$clang -march=native" \ +@@ -145,7 +145,7 @@ Linux) + make -s -j4 check-log && make -s -j4 -C tests tests-bos + fi + done +- for clang in clang-3.7 clang-3.6 clang-3.5 clang-3.4 ++ for clang in clang-{3.7,3.6,3.5,3.4} + do + if test -n "`which $clang`"; then + echo $clang -std=c99 --enable-debug --enable-unsafe --enable-norm-compat +@@ -169,7 +169,7 @@ Linux) + fi + #CC="g++-6 -std=c++11" ./configure && \ + # make -s -j4 check-log || exit +- for gcc in gcc-{10,9,8,7,6,5} ++ for gcc in gcc-{12,11,10,9,8,7,6,5} + do + if test -n "`which $gcc`"; then + if CC="$gcc" ./configure; then +@@ -309,6 +309,7 @@ git clean -dxf src tests + autoreconf + if test -n "`which x86_64-w64-mingw32-gcc`"; then + #CC="x86_64-w64-mingw32-gcc" ++ test -f libssp-0.dll.m64 && cp tests/libssp-0.dll + ./configure --enable-unsafe --host=x86_64-w64-mingw32 && \ + $make -s -j4 && $make -s -j4 -C tests tests && \ + if [ `uname` = Linux ]; then +@@ -321,6 +322,7 @@ if test -n "`which x86_64-w64-mingw32-gcc`"; then + autoreconf + fi + if test -n "`which i686-w64-mingw32-gcc`"; then ++ test -f libssp-0.dll.m32 && cp tests/libssp-0.dll + ./configure --enable-unsafe --host=i686-w64-mingw32 && \ + $make -s -j4 && $make -s -j4 -C tests tests && \ + if [ `uname` = Linux ]; then +@@ -344,6 +346,7 @@ if test -n "`which i686-w64-mingw32-gcc`"; then + fi + if test -n "`i386-mingw32-gcc`"; then + #CC="i386-mingw32-gcc" ++ test -f libssp-0.dll.m32 && cp tests/libssp-0.dll + ./configure --enable-unsafe --host=i386-mingw32 && \ + $make -s -j4 && $make -s -j4 -C tests tests && \ + if [ `uname` = Linux ]; then +diff --git a/tests/test_stpncpy_s.c b/tests/test_stpncpy_s.c +index 83ca6b63..ef2a1636 100644 +--- a/tests/test_stpncpy_s.c ++++ b/tests/test_stpncpy_s.c +@@ -1,10 +1,7 @@ + /*------------------------------------------------------------------ + * test_strncpy_s +- * File 'extstr/strncpy_s.c' + * File 'stpncpy_s.c' + * Lines executed:75.25% of 101 +- * Lines executed:100.00% of 48 +- * + *------------------------------------------------------------------ + */ + diff --git a/meta-oe/recipes-core/safec/safec/0037-fix-sprintf_s-with-arg-GH-97.patch b/meta-oe/recipes-core/safec/safec/0037-fix-sprintf_s-with-arg-GH-97.patch new file mode 100644 index 000000000..fbac3ae3e --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0037-fix-sprintf_s-with-arg-GH-97.patch @@ -0,0 +1,62 @@ +From ffd25a2709f536f59b93da9baefbb7564e91a983 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sat, 30 Oct 2021 22:32:51 +0200 +Subject: [PATCH] fix sprintf_s with "" arg, GH #97 + +all other printf's use < correctly +Fixes GH #97 +--- + src/str/sprintf_s.c | 2 +- + tests/test_snprintf_s.c | 8 ++++++++ + tests/test_sprintf_s.c | 6 ++++++ + 3 files changed, 15 insertions(+), 1 deletion(-) + +diff --git a/src/str/sprintf_s.c b/src/str/sprintf_s.c +index 06c09eb6..33b76fd0 100644 +--- a/src/str/sprintf_s.c ++++ b/src/str/sprintf_s.c +@@ -191,7 +191,7 @@ EXPORT int sprintf_s(char *restrict dest, rsize_t dmax, + but like all other implementations */ + } + +- if (unlikely(ret <= 0)) { ++ if (unlikely(ret < 0)) { + char errstr[128] = "sprintf_s: "; + strcat(errstr, strerror(errno)); + handle_error(dest, dmax, errstr, -ret); +diff --git a/tests/test_snprintf_s.c b/tests/test_snprintf_s.c +index e1899810..bb3c7c66 100644 +--- a/tests/test_snprintf_s.c ++++ b/tests/test_snprintf_s.c +@@ -228,6 +228,14 @@ int test_snprintf_s(void) { + ERR(0) + EXPNULL(str1) + ++ ++ strcpy(str1, "qqweqq"); ++ ++ rc = snprintf_s(str1, LEN, "%s", ""); ++ ERR(0) ++ EXPNULL(str1) ++ ++ + /*--------------------------------------------------*/ + + str1[0] = '\0'; +diff --git a/tests/test_sprintf_s.c b/tests/test_sprintf_s.c +index 3e8420be..3766b69d 100644 +--- a/tests/test_sprintf_s.c ++++ b/tests/test_sprintf_s.c +@@ -174,6 +174,12 @@ int test_sprintf_s(void) { + ERR(0) + EXPNULL(str1) + ++ strcpy(str1, "qqweqq"); ++ ++ rc = sprintf_s(str1, LEN, "%s", ""); ++ ERR(0) ++ EXPNULL(str1) ++ + /*--------------------------------------------------*/ + + str1[0] = '\0'; diff --git a/meta-oe/recipes-core/safec/safec/0038-WIP-start-with-our-own-printf.patch b/meta-oe/recipes-core/safec/safec/0038-WIP-start-with-our-own-printf.patch new file mode 100644 index 000000000..42b7e4183 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0038-WIP-start-with-our-own-printf.patch @@ -0,0 +1,1343 @@ +From 5e4905e2316a11b45afcf7024ee9303c2cfc53c2 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sat, 30 Oct 2021 20:51:59 +0200 +Subject: [PATCH] WIP start with our own printf + +based on the MIT printf from https://github.com/mpaland/printf/ +--- + src/io/printf_s.c | 29 +- + src/safeclib_private.h | 43 ++ + src/str/snprintf_s.c | 81 +--- + src/str/sprintf_s.c | 113 +---- + src/str/vsnprintf_s.c | 916 ++++++++++++++++++++++++++++++++++++++++- + 5 files changed, 975 insertions(+), 207 deletions(-) + +diff --git a/src/io/printf_s.c b/src/io/printf_s.c +index fee6f769..2b36a28c 100644 +--- a/src/io/printf_s.c ++++ b/src/io/printf_s.c +@@ -2,8 +2,9 @@ + * printf_s.c + * + * September 2017, Reini Urban ++ * November 2021, Reini Urban + * +- * Copyright (c) 2017 by Reini Urban ++ * Copyright (c) 2017, 2021 by Reini Urban + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person +@@ -66,29 +67,13 @@ + */ + + EXPORT int printf_s(const char *restrict fmt, ...) { +- va_list ap; ++ va_list va; + int ret; +- const char *p; ++ char buffer[1]; + +- if (unlikely(fmt == NULL)) { +- invoke_safe_str_constraint_handler("printf_s: fmt is null", NULL, +- ESNULLP); +- return -(ESNULLP); +- } +- +- if (unlikely((p = strnstr(fmt, "%n", RSIZE_MAX_STR)))) { +- /* at the beginning or if inside, not %%n */ +- if ((p - fmt == 0) || *(p - 1) != '%') { +- invoke_safe_str_constraint_handler("printf_s: illegal %n", NULL, +- EINVAL); +- return -(EINVAL); +- } +- } +- +- errno = 0; +- va_start(ap, fmt); +- ret = vprintf(fmt, ap); +- va_end(ap); ++ va_start(va, fmt); ++ ret = _vsnprintf_s(_out_char, buffer, (rsize_t)-1, fmt, va); ++ va_end(va); + + if (unlikely(ret < 0)) { + char errstr[128] = "printf_s: "; +diff --git a/src/safeclib_private.h b/src/safeclib_private.h +index 5bb3a7fb..b110aec6 100644 +--- a/src/safeclib_private.h ++++ b/src/safeclib_private.h +@@ -643,4 +643,47 @@ EXTERN int _decomp_s(wchar_t *restrict dest, rsize_t dmax, const uint32_t cp, + + #endif /* SAFECLIB_DISABLE_WCHAR */ + ++// internal helper for the *printf_s functions. ++// output function type ++typedef void (*out_fct_type)(char character, void *buffer, size_t idx, ++ size_t maxlen); ++// wrapper (used as buffer) for output function type ++typedef struct { ++ void (*fct)(char character, void *arg); ++ void *arg; ++} out_fct_wrap_type; ++ ++// internal buffer output ++static inline void _out_buffer(char character, void *buffer, size_t idx, ++ size_t maxlen) { ++ if (idx < maxlen) { ++ ((char *)buffer)[idx] = character; ++ } ++} ++ ++// internal putchar wrapper ++static inline void _out_char(char character, void *buffer, size_t idx, ++ size_t maxlen) { ++ (void)buffer; ++ (void)idx; ++ (void)maxlen; ++ if (character) { ++ putchar(character); ++ } ++} ++ ++// internal output function wrapper ++static inline void _out_fct(char character, void *buffer, size_t idx, ++ size_t maxlen) { ++ (void)idx; ++ (void)maxlen; ++ if (character) { ++ // buffer is the output fct pointer ++ ((out_fct_wrap_type *)buffer) ++ ->fct(character, ((out_fct_wrap_type *)buffer)->arg); ++ } ++} ++int _vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, ++ const char *format, va_list va); ++ + #endif /* __SAFECLIB_PRIVATE_H__ */ +diff --git a/src/str/snprintf_s.c b/src/str/snprintf_s.c +index 5b4cfa5e..8c8ee32f 100644 +--- a/src/str/snprintf_s.c ++++ b/src/str/snprintf_s.c +@@ -1,10 +1,9 @@ + /*------------------------------------------------------------------ + * snprintf_s.c + * +- * August 2017, Reini Urban +- * February 2018, Reini Urban ++ * November 2021, Reini Urban + * +- * Copyright (c) 2017, 2018 by Reini Urban ++ * Copyright (c) 2021 by Reini Urban + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person +@@ -91,7 +90,7 @@ any of the arguments corresponding to %s is a null pointer + * sprintf_s(), vsnprintf_s(), snwprintf_s() + */ + #if defined FOR_DOXYGEN +-int sprintf_s(char *restrict dest, rsize_t dmax, const char *restrict fmt, ...) ++int snprintf_s(char *restrict dest, rsize_t dmax, const char *restrict fmt, ...) + #elif defined SAFECLIB_HAVE_C99 + EXPORT int _snprintf_s_chk(char *restrict dest, rsize_t dmax, + const size_t destbos, const char *restrict fmt, ...) +@@ -100,75 +99,15 @@ EXPORT int snprintf_s(char *restrict dest, rsize_t dmax, + const char *restrict fmt, ...) + #endif + { +- va_list ap; +- const char *p; +- int ret = -1; +-#ifndef SAFECLIB_HAVE_C99 +- const size_t destbos = BOS_UNKNOWN; +-#endif +- +- if (unlikely(dest == NULL || +- fmt == NULL)) { /* for !dmax size-calc use sprintf_s */ +- invoke_safe_str_constraint_handler("snprintf_s: dest/fmt is null", NULL, +- ESNULLP); +- return -(ESNULLP); +- } +- if (unlikely(dmax == 0)) { +- invoke_safe_str_constraint_handler("snprintf_s: dmax is zero", dest, +- ESZEROL); +- return -ESZEROL; +- } +- if (unlikely(dmax > RSIZE_MAX_STR)) { +- invoke_safe_str_constraint_handler("snprintf_s: dmax exceeds max", dest, +- ESLEMAX); +- return -ESLEMAX; +- } +- if (destbos == BOS_UNKNOWN) { +- BND_CHK_PTR_BOUNDS(dest, dmax); +- } else { +- if (unlikely(dmax > destbos)) { +- return -(handle_str_bos_overload("snprintf_s: dmax exceeds dest", +- dest, destbos)); +- } +- } +- +- if (unlikely((p = strnstr(fmt, "%n", RSIZE_MAX_STR)))) { +- /* at the beginning or if inside, not %%n */ +- if ((p - fmt == 0) || *(p - 1) != '%') { +- invoke_safe_str_constraint_handler("snprintf_s: illegal %n", dest, +- EINVAL); +- return -(EINVAL); +- } +- } +- +- errno = 0; +- va_start(ap, fmt); +- ret = vsnprintf(dest, (size_t)dmax, fmt, ap); +- va_end(ap); +- +- if (unlikely(ret < 0)) { +- char errstr[128] = "snprintf_s: "; +-#ifdef HAVE_MINGW32 +- if (errno == ERANGE) +- strcat(errstr, "len exceeds dmax"); +- else +-#endif +- strcat(errstr, strerror(errno)); +- handle_error(dest, dmax, errstr, -ret); +- return ret; +- } +- /* manual truncation */ +-#ifdef SAFECLIB_STR_NULL_SLACK +- /* oops, ret would have been written if dmax was ignored */ +- if ((rsize_t)ret > dmax) { +- dest[dmax - 1] = '\0'; +- } else { +- memset(&dest[ret], 0, dmax - ret); +- } ++ va_list va; ++ int ret; ++ va_start(va, fmt); ++#if defined SAFECLIB_HAVE_C99 ++ ret = _vsnprintf_s_chk(dest, dmax, destbos, fmt, va); + #else +- dest[dmax - 1] = '\0'; ++ ret = vsnprintf_s(dest, dmax, fmt, va); + #endif +- ++ va_end(va); + return ret; + } + +diff --git a/src/str/sprintf_s.c b/src/str/sprintf_s.c +index 33b76fd0..5478911a 100644 +--- a/src/str/sprintf_s.c ++++ b/src/str/sprintf_s.c +@@ -1,12 +1,9 @@ + /*------------------------------------------------------------------ + * sprintf_s.c + * +- * November 2014, Charlie Lenahan +- * April 2017, Reini Urban +- * February 2018, Reini Urban ++ * November 2021, Reini Urban + * +- * Copyright (c) 2014 by Charlie Lenahan +- * Copyright (c) 2017,2018 by Reini Urban ++ * Copyright (c) 2021 by Reini Urban + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person +@@ -38,9 +35,6 @@ + #include "safeclib_private.h" + #endif + +-#if defined(TEST_MSVCRT) && defined(HAVE_SPRINTF_S) +-#else +- + /** + * @def sprintf_s(dest, dmax, fmt, ...) + * @brief +@@ -87,7 +81,7 @@ + * @retval -1 if an encoding error or a runtime constraint violation in the + * libc function \c vsnprintf occured. + * +- * @note The C11 standard was most likely wrong with changing the return value ++ * @note The C11 standard was most likely wrong with changing the return value to + * 0 on errors. All other functions and existing C11 implementations do return + * -1, so we return negative error codes. See the + * http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1141.pdf revision for their +@@ -106,101 +100,18 @@ EXPORT int sprintf_s(char *restrict dest, rsize_t dmax, + const char *restrict fmt, ...) + #endif + { +- int ret = -1; +- va_list ap; +- const char *p; +-#ifndef SAFECLIB_HAVE_C99 +- const size_t destbos = BOS_UNKNOWN; +-#endif +- +- if (unlikely(dmax && dest == NULL)) { +- invoke_safe_str_constraint_handler("sprintf_s: dest is null", NULL, +- ESNULLP); +- return -ESNULLP; +- } +- +- if (unlikely(fmt == NULL)) { +- invoke_safe_str_constraint_handler("sprintf_s: fmt is null", dest, +- ESNULLP); +- return -ESNULLP; +- } +- +- if (unlikely(dest && dmax == 0)) { +- invoke_safe_str_constraint_handler("sprintf_s: dmax is 0", dest, +- ESZEROL); +- return -ESZEROL; +- } +- +- if (unlikely(dmax > RSIZE_MAX_STR)) { +- invoke_safe_str_constraint_handler("sprintf_s: dmax exceeds max", dest, +- ESLEMAX); +- return -ESLEMAX; +- } +- if (destbos == BOS_UNKNOWN) { +- if (dmax) { +- BND_CHK_PTR_BOUNDS(dest, dmax); +- } +- } else { +- if (unlikely(dmax > destbos)) { +- return -(handle_str_bos_overload("sprintf_s: dmax exceeds dest", +- dest, destbos)); +- } +- } +- +- if (unlikely((p = strnstr(fmt, "%n", RSIZE_MAX_STR)))) { +- /* at the beginning or if inside, not %%n */ +- if ((p - fmt == 0) || *(p - 1) != '%') { +- invoke_safe_str_constraint_handler("sprintf_s: illegal %n", +- (char *restrict)fmt, EINVAL); +- return -1; /* EINVAL */ +- } +- } +- +- /* TODO: in order to check for NULL fmt args, need va_copy. +- va_copy(ap2, ap); +- void *ptr = va_arg(*ap2, void*); +- if (ptr == NULL) +- return -(ESNULLP); +- va_end(ap2); +- */ +- +- va_start(ap, fmt); +- /* FIXME: gcc 4.3 GCC_DIAG_IGNORE(-Wmissing-format-attribute) */ +-#if defined(_WIN32) && defined(HAVE_VSNPRINTF_S) +- /* to detect illegal format specifiers */ +- ret = vsnprintf_s(dest, (size_t)dmax, (size_t)dmax, fmt, ap); +- /*#elif defined(HAVE___VSNPRINTF_CHK) */ +- /* glibc allows %n from readonly strings, freebsd/darwin ignores flag. */ +- /*ret = __vsnprintf_chk(dest, (size_t)dmax, 2, (size_t)dmax, fmt, ap);*/ ++ va_list va; ++ int ret; ++ va_start(va, fmt); ++#if defined SAFECLIB_HAVE_C99 ++ ret = _vsnprintf_s_chk(dest, dmax, destbos, fmt, va); + #else +- ret = vsnprintf((char *)dest, (size_t)dmax, fmt, ap); +-#endif +- /* GCC_DIAG_RESTORE */ +- va_end(ap); +- +- if (unlikely(dmax && ret >= (int)dmax) +-#ifdef HAVE_MINGW32 +- || (ret == -1 && errno == ERANGE) +-#endif +- ) { +- handle_error(dest, dmax, "sprintf_s: len exceeds dmax", ESNOSPC); +-#ifdef HAVE_MINGW32 +- errno = 0; +-#endif +- return -ESNOSPC; /* different to the standard (=0), +- but like all other implementations */ +- } +- +- if (unlikely(ret < 0)) { +- char errstr[128] = "sprintf_s: "; +- strcat(errstr, strerror(errno)); +- handle_error(dest, dmax, errstr, -ret); +- } +- ++ ret = vsnprintf_s(dest, dmax, fmt, va); ++#endif ++ va_end(va); + return ret; + } ++ + #ifdef __KERNEL__ + EXPORT_SYMBOL(_sprintf_s_chk); + #endif /* __KERNEL__ */ +- +-#endif /* TEST_MSVCRT */ +diff --git a/src/str/vsnprintf_s.c b/src/str/vsnprintf_s.c +index 869e431d..6a438943 100644 +--- a/src/str/vsnprintf_s.c ++++ b/src/str/vsnprintf_s.c +@@ -1,10 +1,11 @@ + /*------------------------------------------------------------------ +- * vsnprintf_s_s.c ++ * vsnprintf_s.c + * +- * August 2017, Reini Urban +- * February 2018, Reini Urban ++ * 2014-2019 Marco Paland ++ * November 2021, Reini Urban + * +- * Copyright (c) 2017, 2018 by Reini Urban ++ * Copyright (c) 2014-2019, PALANDesign Hannover, Germany ++ * Copyright (c) 2021 by Reini Urban + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person +@@ -36,8 +37,900 @@ + #include "safeclib_private.h" + #endif + +-#if defined(_WIN32) && defined(HAVE_VSNPRINTF_S) ++/////////////////////////////////////////////////////////////////////////////// ++// \author (c) Marco Paland (info@paland.com) ++// 2014-2019, PALANDesign Hannover, Germany ++// ++// based on https://github.com/mpaland/printf/blob/master/printf.c ++// converted by Reini Urban Nov 2021 for the _s variants. ++// ++// \license The MIT License (MIT) ++// ++// Permission is hereby granted, free of charge, to any person obtaining a copy ++// of this software and associated documentation files (the "Software"), to deal ++// in the Software without restriction, including without limitation the rights ++// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++// copies of the Software, and to permit persons to whom the Software is ++// furnished to do so, subject to the following conditions: ++// ++// The above copyright notice and this permission notice shall be included in ++// all copies or substantial portions of the Software. ++// ++// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ++// THE SOFTWARE. ++// ++// \brief Tiny printf, sprintf and (v)snprintf implementation, optimized for ++// speed on ++// embedded systems with a very limited resources. These routines are ++// thread safe and reentrant! Use this instead of the bloated ++// standard/newlib printf cause these use malloc for printf (and may not ++// be thread safe). ++// ++/////////////////////////////////////////////////////////////////////////////// ++ ++#include ++#include ++ ++#ifdef FOR_DOXYGEN ++#include "safe_str_lib.h" + #else ++#include "safeclib_private.h" ++#endif ++ ++// define this globally (e.g. gcc -DPRINTF_INCLUDE_CONFIG_H ...) to include the ++// printf_config.h header file ++// default: undefined ++#ifdef PRINTF_INCLUDE_CONFIG_H ++#include "printf_config.h" ++#endif ++ ++// 'ntoa' conversion buffer size, this must be big enough to hold one converted ++// numeric number including padded zeros (dynamically created on stack) ++// default: 32 byte ++#ifndef PRINTF_NTOA_BUFFER_SIZE ++#define PRINTF_NTOA_BUFFER_SIZE 32U ++#endif ++ ++// 'ftoa' conversion buffer size, this must be big enough to hold one converted ++// float number including padded zeros (dynamically created on stack) ++// default: 32 byte ++#ifndef PRINTF_FTOA_BUFFER_SIZE ++#define PRINTF_FTOA_BUFFER_SIZE 32U ++#endif ++ ++// support for the floating point type (%f) ++// default: activated ++#ifndef PRINTF_DISABLE_SUPPORT_FLOAT ++#define PRINTF_SUPPORT_FLOAT ++#endif ++ ++// support for exponential floating point notation (%e/%g) ++// default: activated ++#ifndef PRINTF_DISABLE_SUPPORT_EXPONENTIAL ++#define PRINTF_SUPPORT_EXPONENTIAL ++#endif ++ ++// define the default floating point precision ++// default: 6 digits ++#ifndef PRINTF_DEFAULT_FLOAT_PRECISION ++#define PRINTF_DEFAULT_FLOAT_PRECISION 6U ++#endif ++ ++// define the largest float suitable to print with %f ++// default: 1e9 ++#ifndef PRINTF_MAX_FLOAT ++#define PRINTF_MAX_FLOAT 1e9 ++#endif ++ ++// support for the long long types (%llu or %p) ++// default: activated ++#ifndef PRINTF_DISABLE_SUPPORT_LONG_LONG ++#define PRINTF_SUPPORT_LONG_LONG ++#endif ++ ++// support for the ptrdiff_t type (%t) ++// ptrdiff_t is normally defined in as long or long long type ++// default: activated ++#ifndef PRINTF_DISABLE_SUPPORT_PTRDIFF_T ++#define PRINTF_SUPPORT_PTRDIFF_T ++#endif ++ ++/////////////////////////////////////////////////////////////////////////////// ++ ++// internal flag definitions ++#define FLAGS_ZEROPAD (1U << 0U) ++#define FLAGS_LEFT (1U << 1U) ++#define FLAGS_PLUS (1U << 2U) ++#define FLAGS_SPACE (1U << 3U) ++#define FLAGS_HASH (1U << 4U) ++#define FLAGS_UPPERCASE (1U << 5U) ++#define FLAGS_CHAR (1U << 6U) ++#define FLAGS_SHORT (1U << 7U) ++#define FLAGS_LONG (1U << 8U) ++#define FLAGS_LONG_LONG (1U << 9U) ++#define FLAGS_PRECISION (1U << 10U) ++#define FLAGS_ADAPT_EXP (1U << 11U) ++ ++// import float.h for DBL_MAX ++#if defined(PRINTF_SUPPORT_FLOAT) ++#include ++#endif ++ ++// internal secure strlen ++// \return The length of the string (excluding the terminating 0) limited by ++// 'maxsize' ++static inline unsigned int _strnlen_s(const char *str, size_t maxsize) { ++ const char *s; ++ for (s = str; *s && maxsize--; ++s) ++ ; ++ return (unsigned int)(s - str); ++} ++ ++// internal test if char is a digit (0-9) ++// \return true if char is a digit ++static inline bool _is_digit(char ch) { return (ch >= '0') && (ch <= '9'); } ++ ++// internal ASCII string to unsigned int conversion ++static unsigned int _atoi(const char **str) { ++ unsigned int i = 0U; ++ while (_is_digit(**str)) { ++ i = i * 10U + (unsigned int)(*((*str)++) - '0'); ++ } ++ return i; ++} ++ ++// output the specified string in reverse, taking care of any zero-padding ++static size_t _out_rev(out_fct_type out, char *buffer, size_t idx, ++ size_t maxlen, const char *buf, size_t len, ++ unsigned int width, unsigned int flags) { ++ const size_t start_idx = idx; ++ ++ // pad spaces up to given width ++ if (!(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) { ++ for (size_t i = len; i < width; i++) { ++ out(' ', buffer, idx++, maxlen); ++ } ++ } ++ ++ // reverse string ++ while (len) { ++ out(buf[--len], buffer, idx++, maxlen); ++ } ++ ++ // append pad spaces up to given width ++ if (flags & FLAGS_LEFT) { ++ while (idx - start_idx < width) { ++ out(' ', buffer, idx++, maxlen); ++ } ++ } ++ ++ return idx; ++} ++ ++// internal itoa format ++static size_t _ntoa_format(out_fct_type out, char *buffer, size_t idx, ++ size_t maxlen, char *buf, size_t len, bool negative, ++ unsigned int base, unsigned int prec, ++ unsigned int width, unsigned int flags) { ++ // pad leading zeros ++ if (!(flags & FLAGS_LEFT)) { ++ if (width && (flags & FLAGS_ZEROPAD) && ++ (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { ++ width--; ++ } ++ while ((len < prec) && (len < PRINTF_NTOA_BUFFER_SIZE)) { ++ buf[len++] = '0'; ++ } ++ while ((flags & FLAGS_ZEROPAD) && (len < width) && ++ (len < PRINTF_NTOA_BUFFER_SIZE)) { ++ buf[len++] = '0'; ++ } ++ } ++ ++ // handle hash ++ if (flags & FLAGS_HASH) { ++ if (!(flags & FLAGS_PRECISION) && len && ++ ((len == prec) || (len == width))) { ++ len--; ++ if (len && (base == 16U)) { ++ len--; ++ } ++ } ++ if ((base == 16U) && !(flags & FLAGS_UPPERCASE) && ++ (len < PRINTF_NTOA_BUFFER_SIZE)) { ++ buf[len++] = 'x'; ++ } else if ((base == 16U) && (flags & FLAGS_UPPERCASE) && ++ (len < PRINTF_NTOA_BUFFER_SIZE)) { ++ buf[len++] = 'X'; ++ } else if ((base == 2U) && (len < PRINTF_NTOA_BUFFER_SIZE)) { ++ buf[len++] = 'b'; ++ } ++ if (len < PRINTF_NTOA_BUFFER_SIZE) { ++ buf[len++] = '0'; ++ } ++ } ++ ++ if (len < PRINTF_NTOA_BUFFER_SIZE) { ++ if (negative) { ++ buf[len++] = '-'; ++ } else if (flags & FLAGS_PLUS) { ++ buf[len++] = '+'; // ignore the space if the '+' exists ++ } else if (flags & FLAGS_SPACE) { ++ buf[len++] = ' '; ++ } ++ } ++ ++ return _out_rev(out, buffer, idx, maxlen, buf, len, width, flags); ++} ++ ++// internal itoa for 'long' type ++static size_t _ntoa_long(out_fct_type out, char *buffer, size_t idx, ++ size_t maxlen, unsigned long value, bool negative, ++ unsigned long base, unsigned int prec, ++ unsigned int width, unsigned int flags) { ++ char buf[PRINTF_NTOA_BUFFER_SIZE]; ++ size_t len = 0U; ++ ++ // no hash for 0 values ++ if (!value) { ++ flags &= ~FLAGS_HASH; ++ } ++ ++ // write if precision != 0 and value is != 0 ++ if (!(flags & FLAGS_PRECISION) || value) { ++ do { ++ const char digit = (char)(value % base); ++ buf[len++] = ++ digit < 10 ? '0' + digit ++ : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; ++ value /= base; ++ } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); ++ } ++ ++ return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, ++ (unsigned int)base, prec, width, flags); ++} ++ ++// internal itoa for 'long long' type ++#if defined(PRINTF_SUPPORT_LONG_LONG) ++static size_t _ntoa_long_long(out_fct_type out, char *buffer, size_t idx, ++ size_t maxlen, unsigned long long value, ++ bool negative, unsigned long long base, ++ unsigned int prec, unsigned int width, ++ unsigned int flags) { ++ char buf[PRINTF_NTOA_BUFFER_SIZE]; ++ size_t len = 0U; ++ ++ // no hash for 0 values ++ if (!value) { ++ flags &= ~FLAGS_HASH; ++ } ++ ++ // write if precision != 0 and value is != 0 ++ if (!(flags & FLAGS_PRECISION) || value) { ++ do { ++ const char digit = (char)(value % base); ++ buf[len++] = ++ digit < 10 ? '0' + digit ++ : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; ++ value /= base; ++ } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); ++ } ++ ++ return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, ++ (unsigned int)base, prec, width, flags); ++} ++#endif // PRINTF_SUPPORT_LONG_LONG ++ ++#if defined(PRINTF_SUPPORT_FLOAT) ++ ++#if defined(PRINTF_SUPPORT_EXPONENTIAL) ++// forward declaration so that _ftoa can switch to exp notation for values > ++// PRINTF_MAX_FLOAT ++static size_t _etoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, ++ double value, unsigned int prec, unsigned int width, ++ unsigned int flags); ++#endif ++ ++// internal ftoa for fixed decimal floating point ++static size_t _ftoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, ++ double value, unsigned int prec, unsigned int width, ++ unsigned int flags) { ++ char buf[PRINTF_FTOA_BUFFER_SIZE]; ++ size_t len = 0U; ++ double tmp; ++ double diff = 0.0; ++ unsigned long frac; ++ int whole; ++ bool negative; ++ ++ // powers of 10 ++ static const double pow10[] = {1, 10, 100, 1000, ++ 10000, 100000, 1000000, 10000000, ++ 100000000, 1000000000}; ++ ++ // test for special values ++ if (value != value) ++ return _out_rev(out, buffer, idx, maxlen, "nan", 3, width, flags); ++ if (value < -DBL_MAX) ++ return _out_rev(out, buffer, idx, maxlen, "fni-", 4, width, flags); ++ if (value > DBL_MAX) ++ return _out_rev(out, buffer, idx, maxlen, ++ (flags & FLAGS_PLUS) ? "fni+" : "fni", ++ (flags & FLAGS_PLUS) ? 4U : 3U, width, flags); ++ ++ // test for very large values ++ // standard printf behavior is to print EVERY whole number digit -- which ++ // could be 100s of characters overflowing your buffers == bad ++ if ((value > PRINTF_MAX_FLOAT) || (value < -PRINTF_MAX_FLOAT)) { ++#if defined(PRINTF_SUPPORT_EXPONENTIAL) ++ return _etoa(out, buffer, idx, maxlen, value, prec, width, flags); ++#else ++ return 0U; ++#endif ++ } ++ ++ // test for negative ++ negative = false; ++ if (value < 0) { ++ negative = true; ++ value = 0 - value; ++ } ++ ++ // set default precision, if not set explicitly ++ if (!(flags & FLAGS_PRECISION)) { ++ prec = PRINTF_DEFAULT_FLOAT_PRECISION; ++ } ++ // limit precision to 9, cause a prec >= 10 can lead to overflow errors ++ while ((len < PRINTF_FTOA_BUFFER_SIZE) && (prec > 9U)) { ++ buf[len++] = '0'; ++ prec--; ++ } ++ ++ whole = (int)value; ++ tmp = (value - whole) * pow10[prec]; ++ frac = (unsigned long)tmp; ++ diff = tmp - frac; ++ ++ if (diff > 0.5) { ++ ++frac; ++ // handle rollover, e.g. case 0.99 with prec 1 is 1.0 ++ if (frac >= pow10[prec]) { ++ frac = 0; ++ ++whole; ++ } ++ } else if (diff < 0.5) { ++ } else if ((frac == 0U) || (frac & 1U)) { ++ // if halfway, round up if odd OR if last digit is 0 ++ ++frac; ++ } ++ ++ if (prec == 0U) { ++ diff = value - (double)whole; ++ if ((!(diff < 0.5) || (diff > 0.5)) && (whole & 1)) { ++ // exactly 0.5 and ODD, then round up ++ // 1.5 -> 2, but 2.5 -> 2 ++ ++whole; ++ } ++ } else { ++ unsigned int count = prec; ++ // now do fractional part, as an unsigned number ++ while (len < PRINTF_FTOA_BUFFER_SIZE) { ++ --count; ++ buf[len++] = (char)(48U + (frac % 10U)); ++ if (!(frac /= 10U)) { ++ break; ++ } ++ } ++ // add extra 0s ++ while ((len < PRINTF_FTOA_BUFFER_SIZE) && (count-- > 0U)) { ++ buf[len++] = '0'; ++ } ++ if (len < PRINTF_FTOA_BUFFER_SIZE) { ++ // add decimal ++ buf[len++] = '.'; ++ } ++ } ++ ++ // do whole part, number is reversed ++ while (len < PRINTF_FTOA_BUFFER_SIZE) { ++ buf[len++] = (char)(48 + (whole % 10)); ++ if (!(whole /= 10)) { ++ break; ++ } ++ } ++ ++ // pad leading zeros ++ if (!(flags & FLAGS_LEFT) && (flags & FLAGS_ZEROPAD)) { ++ if (width && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { ++ width--; ++ } ++ while ((len < width) && (len < PRINTF_FTOA_BUFFER_SIZE)) { ++ buf[len++] = '0'; ++ } ++ } ++ ++ if (len < PRINTF_FTOA_BUFFER_SIZE) { ++ if (negative) { ++ buf[len++] = '-'; ++ } else if (flags & FLAGS_PLUS) { ++ buf[len++] = '+'; // ignore the space if the '+' exists ++ } else if (flags & FLAGS_SPACE) { ++ buf[len++] = ' '; ++ } ++ } ++ ++ return _out_rev(out, buffer, idx, maxlen, buf, len, width, flags); ++} ++ ++#if defined(PRINTF_SUPPORT_EXPONENTIAL) ++// internal ftoa variant for exponential floating-point type, contributed by ++// Martijn Jasperse ++static size_t _etoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, ++ double value, unsigned int prec, unsigned int width, ++ unsigned int flags) { ++ union { ++ uint64_t U; ++ double F; ++ } conv; ++ int exp2, expval; ++ unsigned int minwidth, fwidth; ++ bool negative; ++ ++ // check for NaN and special values ++ if ((value != value) || (value > DBL_MAX) || (value < -DBL_MAX)) { ++ return _ftoa(out, buffer, idx, maxlen, value, prec, width, flags); ++ } ++ ++ // determine the sign ++ negative = value < 0; ++ if (negative) { ++ value = -value; ++ } ++ ++ // default precision ++ if (!(flags & FLAGS_PRECISION)) { ++ prec = PRINTF_DEFAULT_FLOAT_PRECISION; ++ } ++ ++ // determine the decimal exponent ++ // based on the algorithm by David Gay ++ // (https://www.ampl.com/netlib/fp/dtoa.c) ++ conv.F = value; ++ exp2 = (int)((conv.U >> 52U) & 0x07FFU) - 1023; // effectively log2 ++ conv.U = (conv.U & ((1ULL << 52U) - 1U)) | ++ (1023ULL << 52U); // drop the exponent so conv.F is now in [1,2) ++ // now approximate log10 from the log2 integer part and an expansion of ln ++ // around 1.5 ++ expval = (int)(0.1760912590558 + exp2 * 0.301029995663981 + ++ (conv.F - 1.5) * 0.289529654602168); ++ // now we want to compute 10^expval but we want to be sure it won't overflow ++ exp2 = (int)(expval * 3.321928094887362 + 0.5); ++ { ++ const double z = expval * 2.302585092994046 - exp2 * 0.6931471805599453; ++ const double z2 = z * z; ++ conv.U = (uint64_t)(exp2 + 1023) << 52U; ++ // compute exp(z) using continued fractions, see ++ // https://en.wikipedia.org/wiki/Exponential_function#Continued_fractions_for_ex ++ conv.F *= 1 + 2 * z / (2 - z + (z2 / (6 + (z2 / (10 + z2 / 14))))); ++ // correct for rounding errors ++ if (value < conv.F) { ++ expval--; ++ conv.F /= 10; ++ } ++ } ++ ++ // the exponent format is "%+03d" and largest value is "307", so set aside ++ // 4-5 characters ++ minwidth = ((expval < 100) && (expval > -100)) ? 4U : 5U; ++ ++ // in "%g" mode, "prec" is the number of *significant figures* not decimals ++ if (flags & FLAGS_ADAPT_EXP) { ++ // do we want to fall-back to "%f" mode? ++ if ((value >= 1e-4) && (value < 1e6)) { ++ if ((int)prec > expval) { ++ prec = (unsigned)((int)prec - expval - 1); ++ } else { ++ prec = 0; ++ } ++ flags |= FLAGS_PRECISION; // make sure _ftoa respects precision ++ // no characters in exponent ++ minwidth = 0U; ++ expval = 0; ++ } else { ++ // we use one sigfig for the whole part ++ if ((prec > 0) && (flags & FLAGS_PRECISION)) { ++ --prec; ++ } ++ } ++ } ++ ++ // will everything fit? ++ fwidth = width; ++ if (width > minwidth) { ++ // we didn't fall-back so subtract the characters required for the ++ // exponent ++ fwidth -= minwidth; ++ } else { ++ // not enough characters, so go back to default sizing ++ fwidth = 0U; ++ } ++ if ((flags & FLAGS_LEFT) && minwidth) { ++ // if we're padding on the right, DON'T pad the floating part ++ fwidth = 0U; ++ } ++ ++ // rescale the float value ++ if (expval) { ++ value /= conv.F; ++ } ++ ++ // output the floating part ++ { ++ const size_t start_idx = idx; ++ idx = _ftoa(out, buffer, idx, maxlen, negative ? -value : value, prec, ++ fwidth, flags & ~FLAGS_ADAPT_EXP); ++ ++ // output the exponent part ++ if (minwidth) { ++ // output the exponential symbol ++ out((flags & FLAGS_UPPERCASE) ? 'E' : 'e', buffer, idx++, maxlen); ++ // output the exponent value ++ idx = _ntoa_long(out, buffer, idx, maxlen, ++ (expval < 0) ? -expval : expval, expval < 0, 10, 0, ++ minwidth - 1, FLAGS_ZEROPAD | FLAGS_PLUS); ++ // might need to right-pad spaces ++ if (flags & FLAGS_LEFT) { ++ while (idx - start_idx < width) ++ out(' ', buffer, idx++, maxlen); ++ } ++ } ++ } ++ return idx; ++} ++#endif // PRINTF_SUPPORT_EXPONENTIAL ++#endif // PRINTF_SUPPORT_FLOAT ++ ++// internal vsnprintf, extended for _s ++int _vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, ++ const char *format, va_list va) ++{ ++ unsigned int flags, width, precision, n; ++ size_t idx = 0U; ++ ++ if (unlikely(buffer == NULL || format == NULL)) { /* for !bufsize size-calc use sprintf_s */ ++ invoke_safe_str_constraint_handler("vsnprintf_s: dest/fmt is null", NULL, ++ ESNULLP); ++ return -ESNULLP; ++ } ++ if (unlikely(bufsize == 0)) { ++ invoke_safe_str_constraint_handler("vsnprintf_s: dmax is zero", buffer, ++ ESZEROL); ++ return -ESZEROL; ++ } ++ if (unlikely(bufsize > RSIZE_MAX_STR)) { ++ invoke_safe_str_constraint_handler("vsnprintf_s: dmax exceeds max", buffer, ++ ESLEMAX); ++ return -ESLEMAX; ++ } ++ ++ while (*format) { ++ // format specifier? %[flags][width][.precision][length] ++ if (*format != '%') { ++ // no ++ out(*format, buffer, idx++, bufsize); ++ format++; ++ continue; ++ } else { ++ // yes, evaluate it ++ format++; ++ } ++ ++ // evaluate flags ++ flags = 0U; ++ do { ++ switch (*format) { ++ case '0': ++ flags |= FLAGS_ZEROPAD; ++ format++; ++ n = 1U; ++ break; ++ case '-': ++ flags |= FLAGS_LEFT; ++ format++; ++ n = 1U; ++ break; ++ case '+': ++ flags |= FLAGS_PLUS; ++ format++; ++ n = 1U; ++ break; ++ case ' ': ++ flags |= FLAGS_SPACE; ++ format++; ++ n = 1U; ++ break; ++ case '#': ++ flags |= FLAGS_HASH; ++ format++; ++ n = 1U; ++ break; ++ default: ++ n = 0U; ++ break; ++ } ++ } while (n); ++ ++ // evaluate width field ++ width = 0U; ++ if (_is_digit(*format)) { ++ width = _atoi(&format); ++ } else if (*format == '*') { ++ const int w = va_arg(va, int); ++ if (w < 0) { ++ flags |= FLAGS_LEFT; // reverse padding ++ width = (unsigned int)-w; ++ } else { ++ width = (unsigned int)w; ++ } ++ format++; ++ } ++ ++ // evaluate precision field ++ precision = 0U; ++ if (*format == '.') { ++ flags |= FLAGS_PRECISION; ++ format++; ++ if (_is_digit(*format)) { ++ precision = _atoi(&format); ++ } else if (*format == '*') { ++ const int prec = (int)va_arg(va, int); ++ precision = prec > 0 ? (unsigned int)prec : 0U; ++ format++; ++ } ++ } ++ ++ // evaluate length field ++ switch (*format) { ++ case 'l': ++ flags |= FLAGS_LONG; ++ format++; ++ if (*format == 'l') { ++ flags |= FLAGS_LONG_LONG; ++ format++; ++ } ++ break; ++ case 'h': ++ flags |= FLAGS_SHORT; ++ format++; ++ if (*format == 'h') { ++ flags |= FLAGS_CHAR; ++ format++; ++ } ++ break; ++#if defined(PRINTF_SUPPORT_PTRDIFF_T) ++ case 't': ++ flags |= (sizeof(ptrdiff_t) == sizeof(long) ? FLAGS_LONG ++ : FLAGS_LONG_LONG); ++ format++; ++ break; ++#endif ++ case 'j': ++ flags |= (sizeof(intmax_t) == sizeof(long) ? FLAGS_LONG ++ : FLAGS_LONG_LONG); ++ format++; ++ break; ++ case 'z': ++ flags |= ++ (sizeof(size_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); ++ format++; ++ break; ++ default: ++ break; ++ } ++ ++ // evaluate specifier ++ switch (*format) { ++ case 'd': ++ case 'i': ++ case 'u': ++ case 'x': ++ case 'X': ++ case 'o': ++ case 'b': { ++ // set the base ++ unsigned int base; ++ if (*format == 'x' || *format == 'X') { ++ base = 16U; ++ } else if (*format == 'o') { ++ base = 8U; ++ } else if (*format == 'b') { ++ base = 2U; ++ } else { ++ base = 10U; ++ flags &= ~FLAGS_HASH; // no hash for dec format ++ } ++ // uppercase ++ if (*format == 'X') { ++ flags |= FLAGS_UPPERCASE; ++ } ++ ++ // no plus or space flag for u, x, X, o, b ++ if ((*format != 'i') && (*format != 'd')) { ++ flags &= ~(FLAGS_PLUS | FLAGS_SPACE); ++ } ++ ++ // ignore '0' flag when precision is given ++ if (flags & FLAGS_PRECISION) { ++ flags &= ~FLAGS_ZEROPAD; ++ } ++ ++ // convert the integer ++ if ((*format == 'i') || (*format == 'd')) { ++ // signed ++ if (flags & FLAGS_LONG_LONG) { ++#if defined(PRINTF_SUPPORT_LONG_LONG) ++ const long long value = va_arg(va, long long); ++ idx = _ntoa_long_long( ++ out, buffer, idx, bufsize, ++ (unsigned long long)(value > 0 ? value : 0 - value), ++ value < 0, base, precision, width, flags); ++#endif ++ } else if (flags & FLAGS_LONG) { ++ const long value = va_arg(va, long); ++ idx = _ntoa_long( ++ out, buffer, idx, bufsize, ++ (unsigned long)(value > 0 ? value : 0 - value), ++ value < 0, base, precision, width, flags); ++ } else { ++ const int value = ++ (flags & FLAGS_CHAR) ? (char)va_arg(va, int) ++ : (flags & FLAGS_SHORT) ? (short int)va_arg(va, int) ++ : va_arg(va, int); ++ idx = _ntoa_long( ++ out, buffer, idx, bufsize, ++ (unsigned int)(value > 0 ? value : 0 - value), ++ value < 0, base, precision, width, flags); ++ } ++ } else { ++ // unsigned ++ if (flags & FLAGS_LONG_LONG) { ++#if defined(PRINTF_SUPPORT_LONG_LONG) ++ idx = _ntoa_long_long(out, buffer, idx, bufsize, ++ va_arg(va, unsigned long long), false, ++ base, precision, width, flags); ++#endif ++ } else if (flags & FLAGS_LONG) { ++ idx = _ntoa_long(out, buffer, idx, bufsize, ++ va_arg(va, unsigned long), false, base, ++ precision, width, flags); ++ } else { ++ const unsigned int value = ++ (flags & FLAGS_CHAR) ++ ? (unsigned char)va_arg(va, unsigned int) ++ : (flags & FLAGS_SHORT) ++ ? (unsigned short int)va_arg(va, unsigned int) ++ : va_arg(va, unsigned int); ++ idx = _ntoa_long(out, buffer, idx, bufsize, value, false, ++ base, precision, width, flags); ++ } ++ } ++ format++; ++ break; ++ } ++#if defined(PRINTF_SUPPORT_FLOAT) ++ case 'f': ++ case 'F': ++ if (*format == 'F') ++ flags |= FLAGS_UPPERCASE; ++ idx = _ftoa(out, buffer, idx, bufsize, va_arg(va, double), precision, ++ width, flags); ++ format++; ++ break; ++#if defined(PRINTF_SUPPORT_EXPONENTIAL) ++ case 'e': ++ case 'E': ++ case 'g': ++ case 'G': ++ if ((*format == 'g') || (*format == 'G')) ++ flags |= FLAGS_ADAPT_EXP; ++ if ((*format == 'E') || (*format == 'G')) ++ flags |= FLAGS_UPPERCASE; ++ idx = _etoa(out, buffer, idx, bufsize, va_arg(va, double), precision, ++ width, flags); ++ format++; ++ break; ++#endif // PRINTF_SUPPORT_EXPONENTIAL ++#endif // PRINTF_SUPPORT_FLOAT ++ case 'c': { ++ unsigned int l = 1U; ++ // pre padding ++ if (!(flags & FLAGS_LEFT)) { ++ while (l++ < width) { ++ out(' ', buffer, idx++, bufsize); ++ } ++ } ++ // char output ++ out((char)va_arg(va, int), buffer, idx++, bufsize); ++ // post padding ++ if (flags & FLAGS_LEFT) { ++ while (l++ < width) { ++ out(' ', buffer, idx++, bufsize); ++ } ++ } ++ format++; ++ break; ++ } ++ ++ case 's': { ++ const char *p = va_arg(va, char *); ++ unsigned int l = _strnlen_s(p, precision ? precision : (size_t)-1); ++ // pre padding ++ if (flags & FLAGS_PRECISION) { ++ l = (l < precision ? l : precision); ++ } ++ if (!(flags & FLAGS_LEFT)) { ++ while (l++ < width) { ++ out(' ', buffer, idx++, bufsize); ++ } ++ } ++ // string output ++ while ((*p != 0) && (!(flags & FLAGS_PRECISION) || precision--)) { ++ out(*(p++), buffer, idx++, bufsize); ++ } ++ // post padding ++ if (flags & FLAGS_LEFT) { ++ while (l++ < width) { ++ out(' ', buffer, idx++, bufsize); ++ } ++ } ++ format++; ++ break; ++ } ++ ++ case 'p': { ++ width = sizeof(void *) * 2U; ++ flags |= FLAGS_ZEROPAD | FLAGS_UPPERCASE; ++#if defined(PRINTF_SUPPORT_LONG_LONG) ++ if (sizeof(uintptr_t) == sizeof(long long)) { ++ idx = _ntoa_long_long(out, buffer, idx, bufsize, ++ (uintptr_t)va_arg(va, void *), false, 16U, ++ precision, width, flags); ++ } else { ++#endif ++ idx = _ntoa_long(out, buffer, idx, bufsize, ++ (unsigned long)((uintptr_t)va_arg(va, void *)), ++ false, 16U, precision, width, flags); ++#if defined(PRINTF_SUPPORT_LONG_LONG) ++ } ++#endif ++ format++; ++ break; ++ } ++ ++ case '%': ++ out('%', buffer, idx++, bufsize); ++ format++; ++ break; ++ ++ default: ++ out(*format, buffer, idx++, bufsize); ++ format++; ++ break; ++ } ++ } ++ ++ // termination ++ out((char)0, buffer, idx < bufsize ? idx : bufsize - 1U, bufsize); ++ ++ // return written chars without terminating \0 ++ return (int)idx; ++} + + /** + * @def vsnprintf_s(dest,dmax,fmt,ap) +@@ -98,14 +991,13 @@ EXPORT int _vsnprintf_s_chk(char *restrict dest, rsize_t dmax, + va_list ap) + #endif + { +- + int ret = -1; + const char *p; + + if (unlikely(dest == NULL || fmt == NULL)) { + invoke_safe_str_constraint_handler("vsnprintf_s: dest/fmt is null", +- NULL, ESNULLP); +- return -(ESNULLP); ++ dest, ESNULLP); ++ return -ESNULLP; + } + if (unlikely(dmax == 0)) { + invoke_safe_str_constraint_handler("vsnprintf_s: dmax is zero", dest, +@@ -125,7 +1017,7 @@ EXPORT int _vsnprintf_s_chk(char *restrict dest, rsize_t dmax, + dest, destbos)); + } + } +- ++#if 1 // TODO + if (unlikely((p = strnstr(fmt, "%n", RSIZE_MAX_STR)))) { + /* at the beginning or if inside, not %%n */ + if ((p - fmt == 0) || *(p - 1) != '%') { +@@ -134,9 +1026,10 @@ EXPORT int _vsnprintf_s_chk(char *restrict dest, rsize_t dmax, + return -(EINVAL); + } + } ++#endif + + errno = 0; +- ret = vsnprintf(dest, (size_t)dmax, fmt, ap); ++ ret = _vsnprintf_s(_out_buffer, dest, dmax, fmt, ap); + + if (unlikely(ret < 0)) { + char errstr[128] = "vsnprintf_s: "; +@@ -155,8 +1048,5 @@ EXPORT int _vsnprintf_s_chk(char *restrict dest, rsize_t dmax, + #else + dest[dmax - 1] = '\0'; + #endif +- + return ret; + } +- +-#endif /* MINGW64 */ diff --git a/meta-oe/recipes-core/safec/safec/0039-vsnprintf_s-catch-s-ESNULLP-and-ESNOSPC.patch b/meta-oe/recipes-core/safec/safec/0039-vsnprintf_s-catch-s-ESNULLP-and-ESNOSPC.patch new file mode 100644 index 000000000..6bf11a21c --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0039-vsnprintf_s-catch-s-ESNULLP-and-ESNOSPC.patch @@ -0,0 +1,406 @@ +From a928f894b0957b852d2f11ba994940e52bb73150 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sun, 31 Oct 2021 16:09:51 +0100 +Subject: [PATCH] vsnprintf_s: catch %s ESNULLP and ESNOSPC + +--- + src/safeclib_private.h | 3 +- + src/str/snprintf_s.c | 12 +----- + src/str/sprintf_s.c | 19 +++++---- + src/str/vsnprintf_s.c | 60 +++++++++++++++++++--------- + src/str/vsprintf_s.c | 88 +++++++----------------------------------- + tests/test_sprintf_s.c | 12 +++--- + 6 files changed, 73 insertions(+), 121 deletions(-) + +diff --git a/src/safeclib_private.h b/src/safeclib_private.h +index b110aec6..75369fa4 100644 +--- a/src/safeclib_private.h ++++ b/src/safeclib_private.h +@@ -679,8 +679,7 @@ static inline void _out_fct(char character, void *buffer, size_t idx, + (void)maxlen; + if (character) { + // buffer is the output fct pointer +- ((out_fct_wrap_type *)buffer) +- ->fct(character, ((out_fct_wrap_type *)buffer)->arg); ++ ((out_fct_wrap_type *)buffer)->fct(character, ((out_fct_wrap_type *)buffer)->arg); + } + } + int _vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, +diff --git a/src/str/snprintf_s.c b/src/str/snprintf_s.c +index 8c8ee32f..e71a4e9e 100644 +--- a/src/str/snprintf_s.c ++++ b/src/str/snprintf_s.c +@@ -35,12 +35,6 @@ + #include "safeclib_private.h" + #endif + +-#ifdef SAFECLIB_ENABLE_UNSAFE +- +-/* TODO: +-any of the arguments corresponding to %s is a null pointer +-*/ +- + /** + * @def snprintf_s(dest, dmax, fmt, ...) + * @brief +@@ -69,8 +63,7 @@ any of the arguments corresponding to %s is a null pointer + * @pre \c dmax shall not be zero. + * @pre \c dmax shall not be greater than \c RSIZE_MAX_STR and size of dest. + * @pre \c fmt shall not contain the conversion specifier \c %n. +- * @pre None of the arguments corresponding to \c %s is a null pointer. (not +- * yet) ++ * @pre None of the arguments corresponding to \c %s is a null pointer. + * @pre No encoding error shall occur. + * + * @return If the buffer \c dest is too small for the formatted text, +@@ -81,6 +74,7 @@ any of the arguments corresponding to %s is a null pointer + * constraints violation or an encoding error occurred. + * + * @retval -ESNULLP when \c dest/fmt is NULL pointer ++ * @retval -ESNULLP when a \c %s argument is NULL + * @retval -ESZEROL when \c dmax == 0 + * @retval -ESLEMAX when \c dmax > \c RSIZE_MAX_STR + * @retval -EOVERFLOW when \c dmax > size of dest +@@ -110,5 +104,3 @@ EXPORT int snprintf_s(char *restrict dest, rsize_t dmax, + va_end(va); + return ret; + } +- +-#endif /* SAFECLIB_ENABLE_UNSAFE */ +diff --git a/src/str/sprintf_s.c b/src/str/sprintf_s.c +index 5478911a..75165d5a 100644 +--- a/src/str/sprintf_s.c ++++ b/src/str/sprintf_s.c +@@ -70,16 +70,15 @@ + * including the terminating null, then the buffer is cleared, and the + * invalid parameter handler is invoked. + * +- * @retval -ESNULLP when \c fmt is NULL pointer +- * -ESNULLP when \c dest is NULL and dmax > 0 +- * -ESZEROL when \c dmax = 0 and dest is not NULL +- * -ESLEMAX when \c dmax > \c RSIZE_MAX_STR or dmax > size of dest +- * -EOVERFLOW when \c dmax > size of dest +- * -ESNOSPC when return value exceeds dmax unless dmax is zero and dest +- * is NULL -EINVAL when \c fmt contains \c %n +- * +- * @retval -1 if an encoding error or a runtime constraint violation in the +- * libc function \c vsnprintf occured. ++ * @retval -ESNULLP when \c fmt is NULL pointer ++ * @retval -ESNULLP when \c dest is NULL and dmax > 0 ++ * @retval -ESNULLP when a \c %s argument is NULL ++ * @retval -ESZEROL when \c dmax = 0 and dest is not NULL ++ * @retval -ESLEMAX when \c dmax > \c RSIZE_MAX_STR or dmax > size of dest ++ * @retval -EOVERFLOW when \c dmax > size of dest ++ * @retval -ESNOSPC when return value exceeds dmax unless dmax is zero and dest ++ * is NULL ++ * @retval -EINVAL when \c fmt contains \c %n + * + * @note The C11 standard was most likely wrong with changing the return value to + * 0 on errors. All other functions and existing C11 implementations do return +diff --git a/src/str/vsnprintf_s.c b/src/str/vsnprintf_s.c +index 6a438943..6fd7ff7e 100644 +--- a/src/str/vsnprintf_s.c ++++ b/src/str/vsnprintf_s.c +@@ -82,7 +82,7 @@ + #include "safeclib_private.h" + #endif + +-// define this globally (e.g. gcc -DPRINTF_INCLUDE_CONFIG_H ...) to include the ++// optionally define this globally (e.g. gcc -DPRINTF_INCLUDE_CONFIG_H ...) to include the + // printf_config.h header file + // default: undefined + #ifdef PRINTF_INCLUDE_CONFIG_H +@@ -869,7 +869,17 @@ int _vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + + case 's': { + const char *p = va_arg(va, char *); ++ if (!p) { ++ invoke_safe_str_constraint_handler("vsnprintf_s: %s arg is null", ++ NULL, ESNULLP); ++ return -(ESNULLP); ++ } + unsigned int l = _strnlen_s(p, precision ? precision : (size_t)-1); ++ if (l + idx > bufsize) { ++ invoke_safe_str_constraint_handler("vsnprintf_s: %s arg exceeds dmax", ++ NULL, ESNULLP); ++ return -(ESNOSPC); ++ } + // pre padding + if (flags & FLAGS_PRECISION) { + l = (l < precision ? l : precision); +@@ -894,17 +904,18 @@ int _vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + } + + case 'p': { ++ uintptr_t arg = (uintptr_t)va_arg(va, void *); + width = sizeof(void *) * 2U; + flags |= FLAGS_ZEROPAD | FLAGS_UPPERCASE; + #if defined(PRINTF_SUPPORT_LONG_LONG) + if (sizeof(uintptr_t) == sizeof(long long)) { + idx = _ntoa_long_long(out, buffer, idx, bufsize, +- (uintptr_t)va_arg(va, void *), false, 16U, ++ arg, false, 16U, + precision, width, flags); + } else { + #endif + idx = _ntoa_long(out, buffer, idx, bufsize, +- (unsigned long)((uintptr_t)va_arg(va, void *)), ++ (unsigned long)arg, + false, 16U, precision, width, flags); + #if defined(PRINTF_SUPPORT_LONG_LONG) + } +@@ -918,6 +929,11 @@ int _vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + format++; + break; + ++ case 'n': ++ invoke_safe_str_constraint_handler("vsprintf_s: illegal %n", NULL, ++ EINVAL); ++ return -1; ++ + default: + out(*format, buffer, idx++, bufsize); + format++; +@@ -961,8 +977,7 @@ int _vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + * @pre \c dmax shall not be greater than \c RSIZE_MAX_STR and the size of + * dest. + * @pre \c fmt shall not contain the conversion specifier \c %n. +- * @pre None of the arguments corresponding to \c %s is a null pointer. (not +- * yet) ++ * @pre None of the arguments corresponding to \c %s is a null pointer. + * @pre No encoding error shall occur. + * + * @note C11 uses RSIZE_MAX, not RSIZE_MAX_STR. +@@ -974,6 +989,7 @@ int _vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + * and null terminated. + * + * @retval -ESNULLP when \c dest/fmt is NULL pointer ++ * @retval -ESNULLP when a \c %s argument is NULL + * @retval -ESZEROL when \c dmax == 0 + * @retval -ESLEMAX when \c dmax > \c RSIZE_MAX_STR + * @retval -EOVERFLOW when \c dmax > size of dest +@@ -991,8 +1007,8 @@ EXPORT int _vsnprintf_s_chk(char *restrict dest, rsize_t dmax, + va_list ap) + #endif + { +- int ret = -1; + const char *p; ++ int ret; + + if (unlikely(dest == NULL || fmt == NULL)) { + invoke_safe_str_constraint_handler("vsnprintf_s: dest/fmt is null", +@@ -1017,7 +1033,7 @@ EXPORT int _vsnprintf_s_chk(char *restrict dest, rsize_t dmax, + dest, destbos)); + } + } +-#if 1 // TODO ++ // catch %n early, before it outputs anything + if (unlikely((p = strnstr(fmt, "%n", RSIZE_MAX_STR)))) { + /* at the beginning or if inside, not %%n */ + if ((p - fmt == 0) || *(p - 1) != '%') { +@@ -1026,27 +1042,35 @@ EXPORT int _vsnprintf_s_chk(char *restrict dest, rsize_t dmax, + return -(EINVAL); + } + } +-#endif + + errno = 0; + ret = _vsnprintf_s(_out_buffer, dest, dmax, fmt, ap); + +- if (unlikely(ret < 0)) { +- char errstr[128] = "vsnprintf_s: "; +- strcat(errstr, strerror(errno)); +- handle_error(dest, dmax, errstr, -ret); +- return ret; +- } ++ //if (unlikely(ret < 0)) { ++ // char errstr[128] = "vsnprintf_s: "; ++ // strcat(errstr, strerror(errno)); ++ // handle_error(dest, dmax, errstr, -ret); ++ // return ret; ++ //} ++ + /* manual truncation */ ++ if (ret >= 0) { + #ifdef SAFECLIB_STR_NULL_SLACK + /* oops, ret would have been written if dmax was ignored */ +- if ((rsize_t)ret > dmax) { ++ if ((rsize_t)ret > dmax) { ++ dest[dmax - 1] = '\0'; ++ } else { ++ memset(&dest[ret], 0, dmax - ret); ++ } ++#else + dest[dmax - 1] = '\0'; ++#endif + } else { +- memset(&dest[ret], 0, dmax - ret); +- } ++#ifdef SAFECLIB_STR_NULL_SLACK ++ memset(dest, 0, dmax); + #else +- dest[dmax - 1] = '\0'; ++ *dest = '\0'; + #endif ++ } + return ret; + } +diff --git a/src/str/vsprintf_s.c b/src/str/vsprintf_s.c +index da0f1de5..8d8b3fb2 100644 +--- a/src/str/vsprintf_s.c ++++ b/src/str/vsprintf_s.c +@@ -1,10 +1,11 @@ + /*------------------------------------------------------------------ +- * vsprintf_s_s.c ++ * vsprintf_s.c + * + * August 2017, Reini Urban + * February 2018, Reini Urban ++ * November 2021, Reini Urban + * +- * Copyright (c) 2017,2018 by Reini Urban ++ * Copyright (c) 2017,2018,2021 by Reini Urban + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person +@@ -75,16 +76,15 @@ + * including the terminating null, then the buffer is cleared, and the + * invalid parameter handler is invoked. + * +- * @retval -ESNULLP when \c fmt is NULL pointer +- * -ESNULLP when \c dest is NULL and dmax > 0 +- * -ESZEROL when \c dmax = 0 and dest is not NULL +- * -ESLEMAX when \c dmax > \c RSIZE_MAX_STR +- * -EOVERFLOW when \c dmax > size of dest +- * -ESNOSPC when return value exceeds dmax unless dmax is zero and dest +- * is NULL -EINVAL when \c fmt contains \c %n +- * +- * @retval -1 if an encoding error or a runtime constraint violation in the +- * libc function \c vsnprintf occured. ++ * @retval -ESNULLP when \c fmt is NULL pointer ++ * @retval -ESNULLP when \c dest is NULL and dmax > 0 ++ * @retval -ESNULLP when a \c %s argument is NULL ++ * @retval -ESZEROL when \c dmax = 0 and dest is not NULL ++ * @retval -ESLEMAX when \c dmax > \c RSIZE_MAX_STR ++ * @retval -EOVERFLOW when \c dmax > size of dest ++ * @retval -ESNOSPC when return value exceeds dmax unless dmax is zero and dest ++ * is NULL ++ * @retval -EINVAL when \c fmt contains \c %n + * + * @note The C11 standard was most likely wrong with changing the return value + * 0 on errors. All other functions and existing C11 implementations do return +@@ -105,62 +105,8 @@ EXPORT int _vsprintf_s_chk(char *restrict dest, const rsize_t dmax, + va_list ap) + #endif + { +- +- int ret = -1; +- const char *p; +- +- if (unlikely(dmax && dest == NULL)) { +- invoke_safe_str_constraint_handler("vsprintf_s: dest is null", NULL, +- ESNULLP); +- return -ESNULLP; +- } +- +- if (unlikely(fmt == NULL)) { +- invoke_safe_str_constraint_handler("vsprintf_s: fmt is null", NULL, +- ESNULLP); +- return -ESNULLP; +- } +- +- if (unlikely(dest && dmax == 0)) { +- invoke_safe_str_constraint_handler("vsprintf_s: dmax is 0", dest, +- ESZEROL); +- return -ESZEROL; +- } +- +- if (unlikely(dmax > RSIZE_MAX_STR)) { +- invoke_safe_str_constraint_handler("vsprintf_s: dmax exceeds max", dest, +- ESLEMAX); +- return -ESLEMAX; +- } +- if (destbos == BOS_UNKNOWN) { +- if (dmax) { +- BND_CHK_PTR_BOUNDS(dest, dmax); +- } +- } else { +- if (unlikely(dmax > destbos)) { +- return -(handle_str_bos_overload("vsprintf_s: dmax exceeds dest", +- dest, destbos)); +- } +- } +- +- if (unlikely((p = strnstr(fmt, "%n", RSIZE_MAX_STR)))) { +- /* at the beginning or if inside, not %%n */ +- if ((p - fmt == 0) || *(p - 1) != '%') { +- invoke_safe_str_constraint_handler("vsprintf_s: illegal %n", NULL, +- EINVAL); +- return -1; /* EINVAL */ +- } +- } +- +-#if defined(_WIN32) && defined(HAVE_VSNPRINTF_S) +- /* to detect illegal format specifiers */ +- ret = vsnprintf_s(dest, (size_t)dmax, (size_t)dmax, fmt, ap); +- /*#elif defined(HAVE___VSNPRINTF_CHK) */ +- /* glibc allows %n from readonly strings, freebsd/darwin ignores flag. */ +- /*ret = __vsnprintf_chk(dest, (size_t)dmax, 2, (size_t)dmax, fmt, ap);*/ +-#else +- ret = vsnprintf(dest, (size_t)dmax, fmt, ap); +-#endif ++ int ret; ++ ret = _vsnprintf_s_chk(dest, dmax, destbos, fmt, ap); + + if (unlikely(dmax && ret >= (int)dmax) + #ifdef HAVE_MINGW32 +@@ -175,12 +121,6 @@ EXPORT int _vsprintf_s_chk(char *restrict dest, const rsize_t dmax, + but like all other implementations */ + } + +- if (unlikely(ret < 0)) { +- char errstr[128] = "vsprintf_s: "; +- strcat(errstr, strerror(errno)); +- handle_error(dest, dmax, errstr, -ret); +- } +- + return ret; + } + +diff --git a/tests/test_sprintf_s.c b/tests/test_sprintf_s.c +index 3766b69d..aedc3964 100644 +--- a/tests/test_sprintf_s.c ++++ b/tests/test_sprintf_s.c +@@ -64,7 +64,7 @@ int test_sprintf_s(void) { + rc = sprintf_s(str1, LEN, NULL); + ERR_MSVC(-ESNULLP, -1); + ERRNO_MSVC(0, EINVAL); +-#endif ++ #endif + + /*--------------------------------------------------*/ + +@@ -76,7 +76,7 @@ int test_sprintf_s(void) { + /*--------------------------------------------------*/ + + rc = sprintf_s(str1, LEN, "%s %n", str2, &ind); +- ERR(-1); /* EINVAL */ ++ ERR(-EINVAL); + errno = 0; + + rc = sprintf_s(str1, LEN, "%s %%n", str2); +@@ -87,11 +87,9 @@ int test_sprintf_s(void) { + + /*--------------------------------------------------*/ + +- /* TODO not yet implemented +- rc = sprintf_s(str1, LEN, "%p", NULL); +- ERR(-1); +- ERRNO_MSVC(ESNULLP, EINVAL); +- */ ++ rc = sprintf_s(str1, LEN, "%s", NULL); ++ ERR(-ESNULLP); ++ ERRNO_MSVC(0, EINVAL); // ?? + + /*--------------------------------------------------*/ + diff --git a/meta-oe/recipes-core/safec/safec/0040-new-safe-f-printf_s-also.patch b/meta-oe/recipes-core/safec/safec/0040-new-safe-f-printf_s-also.patch new file mode 100644 index 000000000..c672c2783 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0040-new-safe-f-printf_s-also.patch @@ -0,0 +1,270 @@ +From a40bf4ac3643562eb32d9e69dd1284be7868988f Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sun, 31 Oct 2021 16:40:00 +0100 +Subject: [PATCH] new safe (f)printf_s also + +--- + src/io/fprintf_s.c | 20 ++++++++------------ + src/io/printf_s.c | 24 ++++++++++++++++++++---- + src/safeclib_private.h | 12 ++++++++++-- + src/str/vsnprintf_s.c | 21 +++------------------ + tests/test_fprintf_s.c | 14 +++++++++----- + tests/test_sprintf_s.c | 7 +++++++ + 6 files changed, 57 insertions(+), 41 deletions(-) + +diff --git a/src/io/fprintf_s.c b/src/io/fprintf_s.c +index cfdbdce6..436c7961 100644 +--- a/src/io/fprintf_s.c ++++ b/src/io/fprintf_s.c +@@ -35,9 +35,6 @@ + #include "safeclib_private.h" + #endif + +-#if defined(TEST_MSVCRT) && defined(HAVE_FPRINTF_S) +-#else +- + /** + * @brief + * The fprintf_s function composes a string via the format string +@@ -59,14 +56,14 @@ + * + * @pre Neither stream nor fmt shall be a null pointer. + * @pre fmt shall not contain the conversion specifier %n. +- * @pre None of the arguments corresponding to %s is a null pointer. (not yet) ++ * @pre None of the arguments corresponding to %s is a null pointer. + * @pre No encoding error shall occur. + * + * @return On success the total number of characters written is returned. + * @return On failure a negative number is returned. +- * @retval -ESNULLP when stream/fmt is NULL pointer ++ * @retval -ESNULLP when stream or fmt is NULL pointer + * @retval -EINVAL when fmt contains %n +- * @retval -1 on some other error. errno is set then. ++ * @retval -1 on some other error. errno may be set then. + * + */ + +@@ -74,19 +71,20 @@ EXPORT int fprintf_s(FILE *restrict stream, const char *restrict fmt, ...) { + va_list ap; + int ret; + const char *p; ++ out_fct_wrap_type wrap = { ++ .arg = stream ++ }; + + if (unlikely(stream == NULL)) { + invoke_safe_str_constraint_handler("fprintf_s: stream is null", NULL, + ESNULLP); + return -(ESNULLP); + } +- + if (unlikely(fmt == NULL)) { + invoke_safe_str_constraint_handler("fprintf_s: fmt is null", NULL, + ESNULLP); + return -(ESNULLP); + } +- + if (unlikely((p = strnstr(fmt, "%n", RSIZE_MAX_STR)))) { + /* at the beginning or if inside, not %%n */ + if ((p - fmt == 0) || *(p - 1) != '%') { +@@ -98,10 +96,10 @@ EXPORT int fprintf_s(FILE *restrict stream, const char *restrict fmt, ...) { + + errno = 0; + va_start(ap, fmt); +- ret = vfprintf(stream, fmt, ap); ++ ret = _vsnprintf_s(_out_fchar, (char*)&wrap, (rsize_t)-1, fmt, ap); + va_end(ap); + +- if (unlikely(ret < 0)) { ++ if (unlikely(ret < 0 && errno != 0)) { + char errstr[128] = "fprintf_s: "; + strcat(errstr, strerror(errno)); + invoke_safe_str_constraint_handler(errstr, NULL, -ret); +@@ -109,5 +107,3 @@ EXPORT int fprintf_s(FILE *restrict stream, const char *restrict fmt, ...) { + + return ret; + } +- +-#endif /* TEST_MSVCRT */ +diff --git a/src/io/printf_s.c b/src/io/printf_s.c +index 2b36a28c..84521ea6 100644 +--- a/src/io/printf_s.c ++++ b/src/io/printf_s.c +@@ -39,7 +39,7 @@ + /** + * @brief + * The printf_s function composes a string via the format string +- * and writes it to a FILE buffer. ++ * and writes it to the STDOUT file. + * + * @note + * POSIX specifies that \c errno is set on error. However, the safeclib +@@ -56,26 +56,42 @@ + * + * @pre fmt shall not be a null pointer. + * @pre fmt shall not contain the conversion specifier %n. +- * @pre None of the arguments corresponding to %s is a null pointer. (not yet) ++ * @pre None of the arguments corresponding to %s is a null pointer. + * @pre No encoding error shall occur. + * + * @return On success the total number of characters written is returned. + * @return On failure a negative number is returned. + * @retval -ESNULLP when fmt is NULL pointer + * @retval -EINVAL when fmt contains %n +- * @retval -1 on some other error. errno is set then. ++ * @retval -1 on some other error. errno might be set then. + */ + + EXPORT int printf_s(const char *restrict fmt, ...) { + va_list va; + int ret; ++ const char *p; + char buffer[1]; + ++ if (unlikely(fmt == NULL)) { ++ invoke_safe_str_constraint_handler("vsnprintf_s: fmt is null", ++ NULL, ESNULLP); ++ return -ESNULLP; ++ } ++ // catch %n early, before it outputs anything ++ if (unlikely((p = strnstr(fmt, "%n", RSIZE_MAX_STR)))) { ++ /* at the beginning or if inside, not %%n */ ++ if ((p - fmt == 0) || *(p - 1) != '%') { ++ invoke_safe_str_constraint_handler("vsnprintf_s: illegal %n", NULL, ++ EINVAL); ++ return -(EINVAL); ++ } ++ } ++ + va_start(va, fmt); + ret = _vsnprintf_s(_out_char, buffer, (rsize_t)-1, fmt, va); + va_end(va); + +- if (unlikely(ret < 0)) { ++ if (unlikely(ret < 0 && errno != 0)) { + char errstr[128] = "printf_s: "; + strcat(errstr, strerror(errno)); + invoke_safe_str_constraint_handler(errstr, NULL, -ret); +diff --git a/src/safeclib_private.h b/src/safeclib_private.h +index 75369fa4..e7d43215 100644 +--- a/src/safeclib_private.h ++++ b/src/safeclib_private.h +@@ -672,14 +672,22 @@ static inline void _out_char(char character, void *buffer, size_t idx, + } + } + ++// special-case of _out_fct for fprintf_s ++static inline void _out_fchar(char character, void *wrap, size_t idx, ++ size_t maxlen) { ++ (void)idx; ++ (void)maxlen; ++ fprintf(((out_fct_wrap_type *)wrap)->arg, "%c", character); ++} ++ + // internal output function wrapper +-static inline void _out_fct(char character, void *buffer, size_t idx, ++static inline void _out_fct(char character, void *wrap, size_t idx, + size_t maxlen) { + (void)idx; + (void)maxlen; + if (character) { + // buffer is the output fct pointer +- ((out_fct_wrap_type *)buffer)->fct(character, ((out_fct_wrap_type *)buffer)->arg); ++ ((out_fct_wrap_type *)wrap)->fct(character, ((out_fct_wrap_type *)wrap)->arg); + } + } + int _vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, +diff --git a/src/str/vsnprintf_s.c b/src/str/vsnprintf_s.c +index 6fd7ff7e..8d1ce3ad 100644 +--- a/src/str/vsnprintf_s.c ++++ b/src/str/vsnprintf_s.c +@@ -596,29 +596,14 @@ static size_t _etoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, + #endif // PRINTF_SUPPORT_EXPONENTIAL + #endif // PRINTF_SUPPORT_FLOAT + +-// internal vsnprintf, extended for _s ++// internal vsnprintf, extended for _s. ++// already checked in the caller + int _vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, +- const char *format, va_list va) ++ const char *format, va_list va) + { + unsigned int flags, width, precision, n; + size_t idx = 0U; + +- if (unlikely(buffer == NULL || format == NULL)) { /* for !bufsize size-calc use sprintf_s */ +- invoke_safe_str_constraint_handler("vsnprintf_s: dest/fmt is null", NULL, +- ESNULLP); +- return -ESNULLP; +- } +- if (unlikely(bufsize == 0)) { +- invoke_safe_str_constraint_handler("vsnprintf_s: dmax is zero", buffer, +- ESZEROL); +- return -ESZEROL; +- } +- if (unlikely(bufsize > RSIZE_MAX_STR)) { +- invoke_safe_str_constraint_handler("vsnprintf_s: dmax exceeds max", buffer, +- ESLEMAX); +- return -ESLEMAX; +- } +- + while (*format) { + // format specifier? %[flags][width][.precision][length] + if (*format != '%') { +diff --git a/tests/test_fprintf_s.c b/tests/test_fprintf_s.c +index 454a7496..2706f33c 100644 +--- a/tests/test_fprintf_s.c ++++ b/tests/test_fprintf_s.c +@@ -70,17 +70,21 @@ int test_fprintf_s(void) { + + /*--------------------------------------------------*/ + +- /* TODO +- rc = fprintf_s(out, "%p", NULL); ++ rc = fprintf_s(out, "%s", NULL); + NEGERR(ESNULLP) +- */ + + /*--------------------------------------------------*/ + + strcpy(str, "keep it simple"); + + rc = fprintf_s(out, "%s", str); +- NOERRNULL() ++ NOERR() ++ ++ rc = fprintf_s(out, "%d", -10000); ++ ERR(6) ++ ++ rc = fprintf_s(out, "%ld", -10000L); ++ NOERR() + + /*--------------------------------------------------*/ + +@@ -94,7 +98,7 @@ int test_fprintf_s(void) { + strcpy(str, "keep it simple"); + + rc = fprintf_s(out, "%s", str); +- NOERRNULL() ++ ERR(strlen(str)) + + /*--------------------------------------------------*/ + +diff --git a/tests/test_sprintf_s.c b/tests/test_sprintf_s.c +index aedc3964..6ceb968c 100644 +--- a/tests/test_sprintf_s.c ++++ b/tests/test_sprintf_s.c +@@ -154,6 +154,13 @@ int test_sprintf_s(void) { + ERRNO_MSVC(0, ERANGE); + EXPNULL(str1) + ++ str1[0] = '\0'; ++ ++ rc = sprintf_s(str1, 5, "%ld", -10000000L); ++ ERR_MSVC(-ESNOSPC, -1); ++ ERRNO_MSVC(0, ERANGE); ++ EXPNULL(str1) ++ + /*--------------------------------------------------*/ + + str1[0] = '\0'; diff --git a/meta-oe/recipes-core/safec/safec/0041-printf_s-catch-more-ESNOSPC-errors.patch b/meta-oe/recipes-core/safec/safec/0041-printf_s-catch-more-ESNOSPC-errors.patch new file mode 100644 index 000000000..39660c12d --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0041-printf_s-catch-more-ESNOSPC-errors.patch @@ -0,0 +1,142 @@ +From 13e413f7d0718cdf33a28793eed9ad53bc5b48e8 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sun, 31 Oct 2021 16:52:06 +0100 +Subject: [PATCH] printf_s: catch more ESNOSPC errors + +--- + src/safeclib_private.h | 3 +++ + src/str/vsnprintf_s.c | 28 +++++++++++++++++++++++++++- + 2 files changed, 30 insertions(+), 1 deletion(-) + +diff --git a/src/safeclib_private.h b/src/safeclib_private.h +index e7d43215..516faca3 100644 +--- a/src/safeclib_private.h ++++ b/src/safeclib_private.h +@@ -658,6 +658,9 @@ static inline void _out_buffer(char character, void *buffer, size_t idx, + size_t maxlen) { + if (idx < maxlen) { + ((char *)buffer)[idx] = character; ++ } else { ++ invoke_safe_str_constraint_handler("vsnprintf_s: exceeds dmax", ++ (char*)buffer, ESNOSPC); + } + } + +diff --git a/src/str/vsnprintf_s.c b/src/str/vsnprintf_s.c +index 8d1ce3ad..60b0b691 100644 +--- a/src/str/vsnprintf_s.c ++++ b/src/str/vsnprintf_s.c +@@ -194,18 +194,24 @@ static size_t _out_rev(out_fct_type out, char *buffer, size_t idx, + if (!(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) { + for (size_t i = len; i < width; i++) { + out(' ', buffer, idx++, maxlen); ++ if (out == _out_buffer && idx > maxlen) ++ return -(ESNOSPC); + } + } + + // reverse string + while (len) { + out(buf[--len], buffer, idx++, maxlen); ++ if (out == _out_buffer && idx > maxlen) ++ return -(ESNOSPC); + } + + // append pad spaces up to given width + if (flags & FLAGS_LEFT) { + while (idx - start_idx < width) { + out(' ', buffer, idx++, maxlen); ++ if (out == _out_buffer && idx > maxlen) ++ return -(ESNOSPC); + } + } + +@@ -605,6 +611,8 @@ int _vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + size_t idx = 0U; + + while (*format) { ++ if ((long)idx < 0) ++ return idx; + // format specifier? %[flags][width][.precision][length] + if (*format != '%') { + // no +@@ -838,14 +846,20 @@ int _vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + if (!(flags & FLAGS_LEFT)) { + while (l++ < width) { + out(' ', buffer, idx++, bufsize); ++ if (out == _out_buffer && idx > bufsize) ++ return -(ESNOSPC); + } + } + // char output + out((char)va_arg(va, int), buffer, idx++, bufsize); ++ if (out == _out_buffer && idx > bufsize) ++ return -(ESNOSPC); + // post padding + if (flags & FLAGS_LEFT) { + while (l++ < width) { + out(' ', buffer, idx++, bufsize); ++ if (out == _out_buffer && idx > bufsize) ++ return -(ESNOSPC); + } + } + format++; +@@ -862,7 +876,7 @@ int _vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + unsigned int l = _strnlen_s(p, precision ? precision : (size_t)-1); + if (l + idx > bufsize) { + invoke_safe_str_constraint_handler("vsnprintf_s: %s arg exceeds dmax", +- NULL, ESNULLP); ++ NULL, ESNOSPC); + return -(ESNOSPC); + } + // pre padding +@@ -872,16 +886,22 @@ int _vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + if (!(flags & FLAGS_LEFT)) { + while (l++ < width) { + out(' ', buffer, idx++, bufsize); ++ if (out == _out_buffer && idx > bufsize) ++ return -(ESNOSPC); + } + } + // string output + while ((*p != 0) && (!(flags & FLAGS_PRECISION) || precision--)) { + out(*(p++), buffer, idx++, bufsize); ++ if (out == _out_buffer && idx > bufsize) ++ return -(ESNOSPC); + } + // post padding + if (flags & FLAGS_LEFT) { + while (l++ < width) { + out(' ', buffer, idx++, bufsize); ++ if (out == _out_buffer && idx > bufsize) ++ return -(ESNOSPC); + } + } + format++; +@@ -911,6 +931,8 @@ int _vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + + case '%': + out('%', buffer, idx++, bufsize); ++ if (out == _out_buffer && idx > bufsize) ++ return -(ESNOSPC); + format++; + break; + +@@ -921,6 +943,8 @@ int _vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + + default: + out(*format, buffer, idx++, bufsize); ++ if (out == _out_buffer && idx > bufsize) ++ return -(ESNOSPC); + format++; + break; + } +@@ -928,6 +952,8 @@ int _vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + + // termination + out((char)0, buffer, idx < bufsize ? idx : bufsize - 1U, bufsize); ++ if (out == _out_buffer && idx > bufsize) ++ return -(ESNOSPC); + + // return written chars without terminating \0 + return (int)idx; diff --git a/meta-oe/recipes-core/safec/safec/0042-fix-all-printf_s-tests.patch b/meta-oe/recipes-core/safec/safec/0042-fix-all-printf_s-tests.patch new file mode 100644 index 000000000..28639b70d --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0042-fix-all-printf_s-tests.patch @@ -0,0 +1,420 @@ +From 637a4b856b035bf94faa782b004b065226e5e0eb Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Tue, 2 Nov 2021 20:18:56 +0100 +Subject: [PATCH] fix all printf_s tests + +--- + src/safeclib_private.h | 3 ++- + src/str/vsprintf_s.c | 5 ---- + tests/test_snprintf_s.c | 56 +++++++++++----------------------------- + tests/test_sprintf_s.c | 10 +++---- + tests/test_vfprintf_s.c | 16 +++++------- + tests/test_vsnprintf_s.c | 32 +++++++++++------------ + tests/test_vsprintf_s.c | 28 ++++++++++---------- + 7 files changed, 58 insertions(+), 92 deletions(-) + +diff --git a/src/safeclib_private.h b/src/safeclib_private.h +index 516faca3..cc4b7c3f 100644 +--- a/src/safeclib_private.h ++++ b/src/safeclib_private.h +@@ -643,7 +643,8 @@ EXTERN int _decomp_s(wchar_t *restrict dest, rsize_t dmax, const uint32_t cp, + + #endif /* SAFECLIB_DISABLE_WCHAR */ + +-// internal helper for the *printf_s functions. ++// internal helpers for the *printf_s functions: ++ + // output function type + typedef void (*out_fct_type)(char character, void *buffer, size_t idx, + size_t maxlen); +diff --git a/src/str/vsprintf_s.c b/src/str/vsprintf_s.c +index 8d8b3fb2..a727a383 100644 +--- a/src/str/vsprintf_s.c ++++ b/src/str/vsprintf_s.c +@@ -37,9 +37,6 @@ + #include "safeclib_private.h" + #endif + +-#if defined(TEST_MSVCRT) && defined(HAVE_VSPRINTF_S) +-#else +- + /** + * @def vsprintf_s(dest,dmax,fmt,va_args) + * @brief +@@ -123,5 +120,3 @@ EXPORT int _vsprintf_s_chk(char *restrict dest, const rsize_t dmax, + + return ret; + } +- +-#endif /* TEST_MSVCRT */ +diff --git a/tests/test_snprintf_s.c b/tests/test_snprintf_s.c +index bb3c7c66..caf0b3a7 100644 +--- a/tests/test_snprintf_s.c ++++ b/tests/test_snprintf_s.c +@@ -16,11 +16,11 @@ EXTERN int snprintf_s(char *restrict dest, rsize_t dmax, + #endif + #endif + +-#ifdef HAVE_SNPRINTF_S +-#define HAVE_NATIVE 1 +-#else +-#define HAVE_NATIVE 0 +-#endif ++//#ifdef HAVE_SNPRINTF_S ++//#define HAVE_NATIVE 1 ++//#else ++//#define HAVE_NATIVE 0 ++//#endif + #include "test_msvcrt.h" + + #define LEN (128) +@@ -86,16 +86,15 @@ int test_snprintf_s(void) { + + /*--------------------------------------------------*/ + +- /* TODO +- rc = snprintf_s(str1, LEN, "%p", NULL); +- NEGERR(ESNULLP) +- */ ++ rc = snprintf_s(str1, LEN, "%p", NULL); // %p NULL is allowed ++ NOERR(); + + /*--------------------------------------------------*/ + + strcpy(str1, "123456"); + strcpy(str2, "keep it simple"); + ++ // note: compare to the insecure variant + rc = snprintf(str1, 1, "%s", str2); + /* number of characters (not including the terminating null character) + which would have been written to buffer if dmax was ignored */ +@@ -120,7 +119,7 @@ int test_snprintf_s(void) { + * RSIZE_MAX), which would have been written to buffer if bufsz + * was ignored. */ + #if !defined(HAVE_MINGW32) || defined(HAVE_MINGW64) +- ERR(14); /* but truncated, written only 1, the \0 */ ++ ERR(-ESNOSPC); + #else + ERR(-1); + #endif +@@ -136,6 +135,7 @@ int test_snprintf_s(void) { + strcpy(str1, "123456"); + strcpy(str2, "keep it simple"); + ++ // compare to the insecure variant + rc = snprintf(str1, 2, "%s", str2); + #if !defined(HAVE_MINGW32) || defined(HAVE_MINGW64) + ERR(14); /* but truncated, written only 2: k\0 */ +@@ -152,18 +152,8 @@ int test_snprintf_s(void) { + + strcpy(str1, "123456"); + rc = snprintf_s(str1, 2, "%s", str2); +-#if !defined(HAVE_MINGW32) || defined(HAVE_MINGW64) +- ERR(14); /* but truncated, written only 2: k\0 */ +- EXPSTR(str1, "k") +- if ((ind = memcmp(str1, "k\0003456\000", 7))) { +- debug_printf("%s %u snprintf truncation: %d \"%s\"\n", __FUNCTION__, +- __LINE__, ind, str1); +- errs++; +- } +-#else +- ERR(-1); ++ ERR(-ESNOSPC); + EXPSTR(str1, "") +-#endif + + /*--------------------------------------------------*/ + +@@ -190,12 +180,8 @@ int test_snprintf_s(void) { + strcpy(str2, "keep it simple"); + + rc = snprintf_s(str1, 5, "%s", str2); +-#if !defined(HAVE_MINGW32) || defined(HAVE_MINGW64) +- NOERRNULL() /* no ENOSPC */ +- EXPSTR(str1, "keep") +-#else ++ ERR(-ESNOSPC); + EXPSTR(str1, "") +-#endif + + /*--------------------------------------------------*/ + +@@ -203,12 +189,8 @@ int test_snprintf_s(void) { + strcpy(str2, "keep it simple"); + + rc = snprintf_s(str1, 2, "%s", str2); +-#if !defined(HAVE_MINGW32) || defined(HAVE_MINGW64) +- NOERRNULL() +- EXPSTR(str1, "k") +-#else ++ ERR(-ESNOSPC); + EXPSTR(str1, "") +-#endif + + /*--------------------------------------------------*/ + +@@ -260,12 +242,8 @@ int test_snprintf_s(void) { + strcpy(str2, "keep it simple"); + + rc = snprintf_s(str1, 12, "%s", str2); +-#if !defined(HAVE_MINGW32) || defined(HAVE_MINGW64) +- ERR(14) /* sic! unsafe */ +-#else +- ERR(-1); ++ ERR(-ESNOSPC); + EXPSTR(str1, "") +-#endif + + /*--------------------------------------------------*/ + +@@ -281,12 +259,8 @@ int test_snprintf_s(void) { + strcpy(str1, "12345678901234567890"); + + rc = snprintf_s(str1, 8, "%s", &str1[7]); +-#if !defined(HAVE_MINGW32) || defined(HAVE_MINGW64) +- ERR(13) /* sic! unsafe */ +-#else +- ERR(-1); ++ ERR(-ESNOSPC); + EXPSTR(str1, "") +-#endif + + /*--------------------------------------------------*/ + +diff --git a/tests/test_sprintf_s.c b/tests/test_sprintf_s.c +index 6ceb968c..a2df855f 100644 +--- a/tests/test_sprintf_s.c ++++ b/tests/test_sprintf_s.c +@@ -16,11 +16,11 @@ EXTERN int sprintf_s(char *restrict dest, rsize_t dmax, + #endif + #endif + +-#ifdef HAVE_SPRINTF_S +-#define HAVE_NATIVE 1 +-#else +-#define HAVE_NATIVE 0 +-#endif ++//#ifdef HAVE_SPRINTF_S ++//#define HAVE_NATIVE 1 ++//#else ++//#define HAVE_NATIVE 0 ++//#endif + #include "test_msvcrt.h" + + #define LEN (128) +diff --git a/tests/test_vfprintf_s.c b/tests/test_vfprintf_s.c +index e0e00853..fecdc227 100644 +--- a/tests/test_vfprintf_s.c ++++ b/tests/test_vfprintf_s.c +@@ -10,11 +10,11 @@ + #include "safe_str_lib.h" + #include + +-#ifdef HAVE_VFPRINTF_S +-#define HAVE_NATIVE 1 +-#else +-#define HAVE_NATIVE 0 +-#endif ++//#ifdef HAVE_VFPRINTF_S ++//#define HAVE_NATIVE 1 ++//#else ++//#define HAVE_NATIVE 0 ++//#endif + #include "test_msvcrt.h" + + #define TMP "tmpvfp" +@@ -55,10 +55,8 @@ int test_vfprintf_s(void) { + rc = vtfprintf_s(out, "", NULL); + NEGERR(EOK) + +- /* TODO + rc = vtfprintf_s(NULL, "%s", NULL); + NEGERR(ESNULLP); +- */ + + /*--------------------------------------------------*/ + +@@ -80,10 +78,8 @@ int test_vfprintf_s(void) { + + /*--------------------------------------------------*/ + +- /* TODO + rc = vtfprintf_s(out, "%s", NULL); + NEGERR(ESNULLP) +- */ + + /*--------------------------------------------------*/ + +@@ -95,7 +91,7 @@ int test_vfprintf_s(void) { + + /*--------------------------------------------------*/ + +-#if 0 ++#if 1 + /* 0x7fffffff + 1 >INT_MAX */ + rc = printf_s("\n%2147483648d\n", INT_MAX); + ANYERR(); +diff --git a/tests/test_vsnprintf_s.c b/tests/test_vsnprintf_s.c +index c5e346fe..adc4f7dc 100644 +--- a/tests/test_vsnprintf_s.c ++++ b/tests/test_vsnprintf_s.c +@@ -10,11 +10,11 @@ + #include "safe_str_lib.h" + #include + +-#ifdef HAVE_VSNPRINTF_S +-#define HAVE_NATIVE 1 +-#else +-#define HAVE_NATIVE 0 +-#endif ++//#ifdef HAVE_VSNPRINTF_S ++//#define HAVE_NATIVE 1 ++//#else ++//#define HAVE_NATIVE 0 ++//#endif + #include "test_msvcrt.h" + + #if defined(_WIN32) && defined(HAVE_VSNPRINTF_S) +@@ -127,7 +127,7 @@ int test_vsnprintf_s(void) { + + rc = vtprintf_s(str1, 1, "%s", str2); + if (!use_msvcrt) { +- ERR(14); ++ ERR(-ESNOSPC); + } else { + ERR(-1); + } +@@ -140,7 +140,7 @@ int test_vsnprintf_s(void) { + + rc = vtprintf_s(str1, 2, "%s", str2); + if (!use_msvcrt) { +- ERR(14); ++ ERR(-ESNOSPC); + } else { + ERR(-1); + } +@@ -171,12 +171,11 @@ int test_vsnprintf_s(void) { + + rc = vtprintf_s(str1, 5, "%s", str2); + #ifndef HAVE_MINGW32 +- NOERRNULL() /* no ENOSPC */ +- EXPSTR(str1, "keep") ++ ERR(-ESNOSPC); + #else + ERR(-1); +- EXPSTR(str1, "") + #endif ++ EXPSTR(str1, "") + + /*--------------------------------------------------*/ + +@@ -185,12 +184,11 @@ int test_vsnprintf_s(void) { + + rc = vtprintf_s(str1, 2, "%s", str2); + #ifndef HAVE_MINGW32 +- ERR(14) /* sic! unsafe */ +- EXPSTR(str1, "k") ++ ERR(-ESNOSPC); + #else + ERR(-1); +- EXPSTR(str1, "") + #endif ++ EXPSTR(str1, "") + + /*--------------------------------------------------*/ + +@@ -235,11 +233,11 @@ int test_vsnprintf_s(void) { + + rc = vtprintf_s(str1, 12, "%s", str2); + #ifndef HAVE_MINGW32 +- ERR(14) /* sic! unsafe */ ++ ERR(-ESNOSPC); + #else + ERR(-1); +- EXPSTR(str1, "") + #endif ++ EXPSTR(str1, "") + + /*--------------------------------------------------*/ + +@@ -256,11 +254,11 @@ int test_vsnprintf_s(void) { + + rc = vtprintf_s(str1, 8, "%s", &str1[7]); + #ifndef HAVE_MINGW32 +- ERR(13) /* sic! unsafe */ ++ EXPSTR(str1, "") + #else + ERR(-1); +- EXPSTR(str1, "") + #endif ++ EXPSTR(str1, "") + + /*--------------------------------------------------*/ + +diff --git a/tests/test_vsprintf_s.c b/tests/test_vsprintf_s.c +index deb0d17a..30fbfd8a 100644 +--- a/tests/test_vsprintf_s.c ++++ b/tests/test_vsprintf_s.c +@@ -15,11 +15,11 @@ EXTERN int vsprintf_s(char *restrict dest, rsize_t dmax, + const char *restrict fmt, va_list ap); + #endif + +-#ifdef HAVE_VSPRINTF_S +-#define HAVE_NATIVE 1 +-#else +-#define HAVE_NATIVE 0 +-#endif ++//#ifdef HAVE_VSPRINTF_S ++//#define HAVE_NATIVE 1 ++//#else ++//#define HAVE_NATIVE 0 ++//#endif + #include "test_msvcrt.h" + + #define LEN (128) +@@ -48,11 +48,9 @@ int test_vsprintf_s(void) { + + /*--------------------------------------------------*/ + +- /* not testable, and not implemented. +- rc = vtprintf_s(str1, LEN, "%s", NULL); +- ERR(0); +- ERRNO(ESNULLP); +- */ ++ rc = vtprintf_s(str1, LEN, "%s", NULL); ++ ERR(-ESNULLP); ++ ERRNO_MSVC(0, EINVAL); + + /*--------------------------------------------------*/ + +@@ -97,7 +95,7 @@ int test_vsprintf_s(void) { + /* wine msvcrt doesn't check %n neither */ + #if !(defined(_WINE_MSVCRT) && defined(TEST_MSVCRT) && defined(HAVE_VSPRINTF_S)) + rc = vtprintf_s(str1, LEN, "%s %n", str2); +- ERR(-1); ++ ERR(-EINVAL); + ERRNO_MSVC(0, EINVAL); + #endif + +@@ -159,6 +157,11 @@ int test_vsprintf_s(void) { + ERRNO_MSVC(0, ERANGE); + EXPNULL(str1) + ++ rc = vtprintf_s(str1, 5, "%ld", -10000000L); ++ ERR_MSVC(-ESNOSPC, -1); ++ ERRNO_MSVC(0, ERANGE); ++ EXPNULL(str1) ++ + /*--------------------------------------------------*/ + + str1[0] = '\0'; +@@ -263,8 +266,7 @@ int test_vsprintf_s(void) { + /* everybody incorrectly accepts illegal % specifiers, only musl not. */ + rc = vtprintf_s(str1, LEN, "%y"); + /* TODO: dietlibc, uClibc, minilibc */ +-#if defined(__GLIBC__) || defined(BSD_ALL_LIKE) /* and older mingw versions \ +- */ ++#if defined(__GLIBC__) || defined(BSD_ALL_LIKE) /* and older mingw versions */ + /* they print unknown formats verbatim */ + NOERR(); + #else diff --git a/meta-oe/recipes-core/safec/safec/0043-rename-_vsnprintf_s-to-__vsnprintf_s.patch b/meta-oe/recipes-core/safec/safec/0043-rename-_vsnprintf_s-to-__vsnprintf_s.patch new file mode 100644 index 000000000..cf8ba4740 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0043-rename-_vsnprintf_s-to-__vsnprintf_s.patch @@ -0,0 +1,76 @@ +From 7960db0e3b6c545ee12b83eb55f54a45376f9031 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Tue, 2 Nov 2021 21:25:08 +0100 +Subject: [PATCH] rename _vsnprintf_s to __vsnprintf_s + +clashes with mingw +--- + src/io/fprintf_s.c | 2 +- + src/io/printf_s.c | 2 +- + src/safeclib_private.h | 3 ++- + src/str/vsnprintf_s.c | 5 +++-- + 4 files changed, 7 insertions(+), 5 deletions(-) + +diff --git a/src/io/fprintf_s.c b/src/io/fprintf_s.c +index 436c7961..3f31bb53 100644 +--- a/src/io/fprintf_s.c ++++ b/src/io/fprintf_s.c +@@ -96,7 +96,7 @@ EXPORT int fprintf_s(FILE *restrict stream, const char *restrict fmt, ...) { + + errno = 0; + va_start(ap, fmt); +- ret = _vsnprintf_s(_out_fchar, (char*)&wrap, (rsize_t)-1, fmt, ap); ++ ret = __vsnprintf_s(_out_fchar, (char*)&wrap, (rsize_t)-1, fmt, ap); + va_end(ap); + + if (unlikely(ret < 0 && errno != 0)) { +diff --git a/src/io/printf_s.c b/src/io/printf_s.c +index 84521ea6..b0d1fa62 100644 +--- a/src/io/printf_s.c ++++ b/src/io/printf_s.c +@@ -88,7 +88,7 @@ EXPORT int printf_s(const char *restrict fmt, ...) { + } + + va_start(va, fmt); +- ret = _vsnprintf_s(_out_char, buffer, (rsize_t)-1, fmt, va); ++ ret = __vsnprintf_s(_out_char, buffer, (rsize_t)-1, fmt, va); + va_end(va); + + if (unlikely(ret < 0 && errno != 0)) { +diff --git a/src/safeclib_private.h b/src/safeclib_private.h +index cc4b7c3f..13b2bab8 100644 +--- a/src/safeclib_private.h ++++ b/src/safeclib_private.h +@@ -694,7 +694,8 @@ static inline void _out_fct(char character, void *wrap, size_t idx, + ((out_fct_wrap_type *)wrap)->fct(character, ((out_fct_wrap_type *)wrap)->arg); + } + } +-int _vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, ++// mingw has a _vsnprintf_s ++int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + const char *format, va_list va); + + #endif /* __SAFECLIB_PRIVATE_H__ */ +diff --git a/src/str/vsnprintf_s.c b/src/str/vsnprintf_s.c +index 60b0b691..f15c3294 100644 +--- a/src/str/vsnprintf_s.c ++++ b/src/str/vsnprintf_s.c +@@ -604,7 +604,8 @@ static size_t _etoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, + + // internal vsnprintf, extended for _s. + // already checked in the caller +-int _vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, ++// mingw has a _vsnprintf_s(char *_DstBuf,size_t _DstSize,size_t _MaxCount,const char *_Format,va_list _ArgList); ++int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + const char *format, va_list va) + { + unsigned int flags, width, precision, n; +@@ -1055,7 +1056,7 @@ EXPORT int _vsnprintf_s_chk(char *restrict dest, rsize_t dmax, + } + + errno = 0; +- ret = _vsnprintf_s(_out_buffer, dest, dmax, fmt, ap); ++ ret = __vsnprintf_s(_out_buffer, dest, dmax, fmt, ap); + + //if (unlikely(ret < 0)) { + // char errstr[128] = "vsnprintf_s: "; diff --git a/meta-oe/recipes-core/safec/safec/0044-disable-fixup-some-io-for-the-kernel.patch b/meta-oe/recipes-core/safec/safec/0044-disable-fixup-some-io-for-the-kernel.patch new file mode 100644 index 000000000..c33835313 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0044-disable-fixup-some-io-for-the-kernel.patch @@ -0,0 +1,37 @@ +From 4c65989c0a674631a59fdf9bb12b9e3f41fc95b7 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Tue, 2 Nov 2021 22:05:35 +0100 +Subject: [PATCH] disable/fixup some io for the kernel + +--- + src/safeclib_private.h | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/src/safeclib_private.h b/src/safeclib_private.h +index 13b2bab8..46ece93b 100644 +--- a/src/safeclib_private.h ++++ b/src/safeclib_private.h +@@ -672,10 +672,15 @@ static inline void _out_char(char character, void *buffer, size_t idx, + (void)idx; + (void)maxlen; + if (character) { ++#ifndef __KERNEL__ + putchar(character); ++#else ++ slprintf("%c", character); ++#endif + } + } + ++#ifndef __KERNEL__ + // special-case of _out_fct for fprintf_s + static inline void _out_fchar(char character, void *wrap, size_t idx, + size_t maxlen) { +@@ -683,6 +688,7 @@ static inline void _out_fchar(char character, void *wrap, size_t idx, + (void)maxlen; + fprintf(((out_fct_wrap_type *)wrap)->arg, "%c", character); + } ++#endif + + // internal output function wrapper + static inline void _out_fct(char character, void *wrap, size_t idx, diff --git a/meta-oe/recipes-core/safec/safec/0045-let-vfprintf_s-use-the-new-secure-vsnprintf_s.patch b/meta-oe/recipes-core/safec/safec/0045-let-vfprintf_s-use-the-new-secure-vsnprintf_s.patch new file mode 100644 index 000000000..af5c0608f --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0045-let-vfprintf_s-use-the-new-secure-vsnprintf_s.patch @@ -0,0 +1,151 @@ +From eb722776c9a5d0604ae8e7cec09e8efcabea8f87 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Tue, 2 Nov 2021 22:38:48 +0100 +Subject: [PATCH] let vfprintf_s use the new secure vsnprintf_s + +--- + src/io/fprintf_s.c | 5 ++--- + src/io/vfprintf_s.c | 15 +++++++++++++-- + src/safeclib_private.h | 3 ++- + src/str/vsnprintf_s.c | 8 +++++++- + tests/test_vfprintf_s.c | 10 ++++++---- + 5 files changed, 30 insertions(+), 11 deletions(-) + +diff --git a/src/io/fprintf_s.c b/src/io/fprintf_s.c +index 3f31bb53..e580d2e5 100644 +--- a/src/io/fprintf_s.c ++++ b/src/io/fprintf_s.c +@@ -71,9 +71,7 @@ EXPORT int fprintf_s(FILE *restrict stream, const char *restrict fmt, ...) { + va_list ap; + int ret; + const char *p; +- out_fct_wrap_type wrap = { +- .arg = stream +- }; ++ out_fct_wrap_type wrap; + + if (unlikely(stream == NULL)) { + invoke_safe_str_constraint_handler("fprintf_s: stream is null", NULL, +@@ -95,6 +93,7 @@ EXPORT int fprintf_s(FILE *restrict stream, const char *restrict fmt, ...) { + } + + errno = 0; ++ wrap.arg = stream; + va_start(ap, fmt); + ret = __vsnprintf_s(_out_fchar, (char*)&wrap, (rsize_t)-1, fmt, ap); + va_end(ap); +diff --git a/src/io/vfprintf_s.c b/src/io/vfprintf_s.c +index a95f5c6a..92d71cc3 100644 +--- a/src/io/vfprintf_s.c ++++ b/src/io/vfprintf_s.c +@@ -61,7 +61,7 @@ + * + * @return On success the total number of characters written is returned. + * @return On failure a negative number is returned. +- * @retval -ESNULLP when stream/fmt is NULL pointer ++ * @retval -ESNULLP when stream or fmt is NULL pointer + * @retval -EINVAL when fmt contains %n + * @retval -1 on some other error. errno is set then. + * +@@ -71,6 +71,7 @@ EXPORT int vfprintf_s(FILE *restrict stream, const char *restrict fmt, + va_list ap) { + int ret; + const char *p; ++ out_fct_wrap_type wrap; + + if (unlikely(stream == NULL)) { + invoke_safe_str_constraint_handler("vfprintf_s: stream is null", NULL, +@@ -94,13 +95,23 @@ EXPORT int vfprintf_s(FILE *restrict stream, const char *restrict fmt, + } + + errno = 0; ++#if 0 + ret = vfprintf(stream, fmt, ap); +- + if (unlikely(ret < 0)) { + char errstr[128] = "vfprintf_s: "; + strcat(errstr, strerror(errno)); + invoke_safe_str_constraint_handler(errstr, NULL, -ret); + } ++#else ++ wrap.arg = stream; ++ ret = __vsnprintf_s(_out_fchar, (char*)&wrap, (rsize_t)-1, fmt, ap); ++ ++ if (unlikely(ret < 0 && errno != 0)) { ++ char errstr[128] = "vfprintf_s: "; ++ strcat(errstr, strerror(errno)); ++ invoke_safe_str_constraint_handler(errstr, NULL, -ret); ++ } ++#endif + + return ret; + } +diff --git a/src/safeclib_private.h b/src/safeclib_private.h +index 46ece93b..355bf164 100644 +--- a/src/safeclib_private.h ++++ b/src/safeclib_private.h +@@ -686,7 +686,8 @@ static inline void _out_fchar(char character, void *wrap, size_t idx, + size_t maxlen) { + (void)idx; + (void)maxlen; +- fprintf(((out_fct_wrap_type *)wrap)->arg, "%c", character); ++ //((out_fct_wrap_type *)wrap)->fct(character, ((out_fct_wrap_type *)wrap)->arg); ++ fprintf((FILE*)((out_fct_wrap_type *)wrap)->arg, "%c", character); + } + #endif + +diff --git a/src/str/vsnprintf_s.c b/src/str/vsnprintf_s.c +index f15c3294..765014d6 100644 +--- a/src/str/vsnprintf_s.c ++++ b/src/str/vsnprintf_s.c +@@ -270,6 +270,11 @@ static size_t _ntoa_format(out_fct_type out, char *buffer, size_t idx, + buf[len++] = ' '; + } + } ++ if (width > 2147483614) { ++ invoke_safe_str_constraint_handler("vsnprintf_s: width exceeds max", ++ NULL, ESLEMAX); ++ return -ESLEMAX; ++ } + + return _out_rev(out, buffer, idx, maxlen, buf, len, width, flags); + } +@@ -868,13 +873,14 @@ int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + } + + case 's': { ++ unsigned int l; + const char *p = va_arg(va, char *); + if (!p) { + invoke_safe_str_constraint_handler("vsnprintf_s: %s arg is null", + NULL, ESNULLP); + return -(ESNULLP); + } +- unsigned int l = _strnlen_s(p, precision ? precision : (size_t)-1); ++ l = _strnlen_s(p, precision ? precision : (size_t)-1); + if (l + idx > bufsize) { + invoke_safe_str_constraint_handler("vsnprintf_s: %s arg exceeds dmax", + NULL, ESNOSPC); +diff --git a/tests/test_vfprintf_s.c b/tests/test_vfprintf_s.c +index fecdc227..340ad3d6 100644 +--- a/tests/test_vfprintf_s.c ++++ b/tests/test_vfprintf_s.c +@@ -94,12 +94,14 @@ int test_vfprintf_s(void) { + #if 1 + /* 0x7fffffff + 1 >INT_MAX */ + rc = printf_s("\n%2147483648d\n", INT_MAX); +- ANYERR(); +-#if defined(__GLIBC__) +- ERRNO(EOVERFLOW); ++ NEGERR(ESLEMAX); ++ //#if defined(__GLIBC__) ++ //ERRNO(EOVERFLOW); ++ //#endif + #endif + +- /* segfaults under darwin */ ++#if 0 ++ /* segfaults */ + rc = printf_s("%s\n", L'\xd834df01'); + ANYERR(); + #endif diff --git a/meta-oe/recipes-core/safec/safec/0046-doc-fix-retval-doxygen-warnings.patch b/meta-oe/recipes-core/safec/safec/0046-doc-fix-retval-doxygen-warnings.patch new file mode 100644 index 000000000..7dfb19383 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0046-doc-fix-retval-doxygen-warnings.patch @@ -0,0 +1,101 @@ +From 66e6c0a731363e85643ca76495520a12068e3de2 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Fri, 5 Nov 2021 08:12:21 +0100 +Subject: [PATCH] doc: fix @retval doxygen warnings + +warning: return value '-ESNULLP' of *printf_s has multiple documentation sections +--- + src/io/gets_s.c | 12 ++++++------ + src/str/snprintf_s.c | 4 ++-- + src/str/sprintf_s.c | 6 +++--- + src/str/vsnprintf_s.c | 4 ++-- + src/str/vsprintf_s.c | 6 +++--- + 5 files changed, 16 insertions(+), 16 deletions(-) + +diff --git a/src/io/gets_s.c b/src/io/gets_s.c +index 22a9340e..35f33039 100644 +--- a/src/io/gets_s.c ++++ b/src/io/gets_s.c +@@ -90,12 +90,12 @@ + * @retval int >0 when on successful operation, all the characters from src + * were appended to dest and the result in dest is null + * terminated. +- * @retval 0 + errno=ESNULLP when dest is a NULL pointer +- * @retval 0 + errno=ESZEROL when dmax = 0 +- * @retval 0 + errno=ESLEMAX when dmax > RSIZE_MAX_STR +- * @retval 0 + errno=EOVERFLOW when dmax > size of dest +- * @retval 0 + errno=ESUNTERM endline or eof not encountered after storing +- * dmax-1 characters to dest. ++ * @retval 0,errno=ESNULLP when dest is a NULL pointer ++ * @retval 0,errno=ESZEROL when dmax = 0 ++ * @retval 0,errno=ESLEMAX when dmax > RSIZE_MAX_STR ++ * @retval 0,errno=EOVERFLOW when dmax > size of dest ++ * @retval 0,errno=ESUNTERM endline or eof not encountered after storing ++ * dmax-1 characters to dest. + * + * @see + * scanf_s() +diff --git a/src/str/snprintf_s.c b/src/str/snprintf_s.c +index e71a4e9e..e0dae533 100644 +--- a/src/str/snprintf_s.c ++++ b/src/str/snprintf_s.c +@@ -73,8 +73,8 @@ + * character, or a negative error number if a runtime + * constraints violation or an encoding error occurred. + * +- * @retval -ESNULLP when \c dest/fmt is NULL pointer +- * @retval -ESNULLP when a \c %s argument is NULL ++ * @retval -ESNULLP when \c dest/fmt is NULL pointer, or ++ * when a \c %s argument is NULL + * @retval -ESZEROL when \c dmax == 0 + * @retval -ESLEMAX when \c dmax > \c RSIZE_MAX_STR + * @retval -EOVERFLOW when \c dmax > size of dest +diff --git a/src/str/sprintf_s.c b/src/str/sprintf_s.c +index 75165d5a..dbaa6208 100644 +--- a/src/str/sprintf_s.c ++++ b/src/str/sprintf_s.c +@@ -70,9 +70,9 @@ + * including the terminating null, then the buffer is cleared, and the + * invalid parameter handler is invoked. + * +- * @retval -ESNULLP when \c fmt is NULL pointer +- * @retval -ESNULLP when \c dest is NULL and dmax > 0 +- * @retval -ESNULLP when a \c %s argument is NULL ++ * @retval -ESNULLP when \c fmt is NULL pointer, or ++ * when \c dest is NULL and dmax > 0, or ++ * when a \c %s argument is NULL + * @retval -ESZEROL when \c dmax = 0 and dest is not NULL + * @retval -ESLEMAX when \c dmax > \c RSIZE_MAX_STR or dmax > size of dest + * @retval -EOVERFLOW when \c dmax > size of dest +diff --git a/src/str/vsnprintf_s.c b/src/str/vsnprintf_s.c +index 765014d6..0e758967 100644 +--- a/src/str/vsnprintf_s.c ++++ b/src/str/vsnprintf_s.c +@@ -1006,8 +1006,8 @@ int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + * including the terminating null, then the buffer is truncated + * and null terminated. + * +- * @retval -ESNULLP when \c dest/fmt is NULL pointer +- * @retval -ESNULLP when a \c %s argument is NULL ++ * @retval -ESNULLP when \c dest or fmt is NULL pointer, or ++ * when a \c %s argument is NULL + * @retval -ESZEROL when \c dmax == 0 + * @retval -ESLEMAX when \c dmax > \c RSIZE_MAX_STR + * @retval -EOVERFLOW when \c dmax > size of dest +diff --git a/src/str/vsprintf_s.c b/src/str/vsprintf_s.c +index a727a383..69095c4b 100644 +--- a/src/str/vsprintf_s.c ++++ b/src/str/vsprintf_s.c +@@ -73,9 +73,9 @@ + * including the terminating null, then the buffer is cleared, and the + * invalid parameter handler is invoked. + * +- * @retval -ESNULLP when \c fmt is NULL pointer +- * @retval -ESNULLP when \c dest is NULL and dmax > 0 +- * @retval -ESNULLP when a \c %s argument is NULL ++ * @retval -ESNULLP when \c fmt is NULL pointer, or ++ * when \c dest is NULL and dmax > 0, or ++ * when a \c %s argument is NULL + * @retval -ESZEROL when \c dmax = 0 and dest is not NULL + * @retval -ESLEMAX when \c dmax > \c RSIZE_MAX_STR + * @retval -EOVERFLOW when \c dmax > size of dest diff --git a/meta-oe/recipes-core/safec/safec/0047-add-ESNOSPC-check-to-qsort_s.patch b/meta-oe/recipes-core/safec/safec/0047-add-ESNOSPC-check-to-qsort_s.patch new file mode 100644 index 000000000..77da43845 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0047-add-ESNOSPC-check-to-qsort_s.patch @@ -0,0 +1,94 @@ +From a266031fa0ca6942ddb44e9782d8b2e1b0c62675 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Mon, 8 Nov 2021 17:57:44 +0100 +Subject: [PATCH] add ESNOSPC check to qsort_s + +check BOS(base) if known +--- + src/misc/qsort_s.c | 39 ++++++++++++++++++++++++++++++--------- + tests/test_qsort_s.c | 4 ++-- + 2 files changed, 32 insertions(+), 11 deletions(-) + +diff --git a/src/misc/qsort_s.c b/src/misc/qsort_s.c +index 688b468b..5d1fd15f 100644 +--- a/src/misc/qsort_s.c ++++ b/src/misc/qsort_s.c +@@ -117,8 +117,9 @@ typedef unsigned long uint64_t; + * + * @return Zero on success, an errno_t on errors. + * @retval EOK when operation is successful +- * @retval -ESNULLP when base/compar is NULL pointer and nmemb > 0 +- * @retval -ESLEMAX when nmemb/size > RSIZE_MAX_MEM ++ * @retval -ESNULLP when base * compar is NULL pointer and nmemb > 0 ++ * @retval -ESLEMAX when nmemb or size > RSIZE_MAX_MEM ++ * @retval -ESNOSPC when nmemb*size > sizeof base + * + * @see + * bsearch_s() +@@ -351,21 +352,41 @@ errno_t qsort_s(void *base, rsize_t nmemb, rsize_t size, + EXPORT errno_t _qsort_s_chk(void *base, rsize_t nmemb, rsize_t size, + int (*compar)(const void *k, const void *y, + void *context), +- void *context, const size_t destbos) ++ void *context, const size_t basebos) + #endif + { ++ (void)basebos; + if (likely(nmemb != 0)) { + if (unlikely(base == NULL || compar == NULL)) { +- invoke_safe_str_constraint_handler("qsort_s: base/compar is null", ++ invoke_safe_str_constraint_handler("qsort_s: base or compar is null", + NULL, ESNULLP); + return RCNEGATE(ESNULLP); + } + } +- +- if (unlikely(nmemb > RSIZE_MAX_MEM || size > RSIZE_MAX_MEM)) { +- invoke_safe_str_constraint_handler("qsort_s: nmemb/size exceeds max", +- NULL, ESLEMAX); +- return RCNEGATE(ESLEMAX); ++ if (basebos == BOS_UNKNOWN) { ++ if (unlikely(nmemb > RSIZE_MAX_MEM || size > RSIZE_MAX_MEM || ++ ((basebos != BOS_UNKNOWN) && (basebos > RSIZE_MAX_MEM)))) { ++ invoke_safe_str_constraint_handler("qsort_s: nmemb or size exceeds max", ++ NULL, ESLEMAX); ++ return RCNEGATE(ESLEMAX); ++ } ++ BND_CHK_PTR_BOUNDS(base, nmemb * size); ++ } else { ++ rsize_t basesz = nmemb * size; ++ if (unlikely(basesz > basebos)) { ++ invoke_safe_str_constraint_handler("qsort_s: nmemb*size exceeds sizeof base", ++ NULL, ESNOSPC); ++ return RCNEGATE(ESNOSPC); ++ } ++#ifdef HAVE_WARN_DMAX ++ if (unlikely(basesz != basebos)) { ++ handle_mem_bos_chk_warn("qsort_s", (void *)base, basesz, basebos); ++#ifdef HAVE_ERROR_DMAX ++ errno = ESLEWRNG; ++ return NULL; ++#endif ++ } ++#endif + } + + qsort_musl(base, (size_t)nmemb, (size_t)size, compar, context); +diff --git a/tests/test_qsort_s.c b/tests/test_qsort_s.c +index be9708e8..31fc393f 100644 +--- a/tests/test_qsort_s.c ++++ b/tests/test_qsort_s.c +@@ -72,11 +72,11 @@ int test_qsort_s(void) { + if (!use_msvcrt) { + EXPECT_BOS("base overflow") + rc = qsort_s(array, RSIZE_MAX_MEM + 1, sizeof(array[0]), comp, NULL); +- ERR(ESLEMAX); ++ ERR(ESNOSPC); + + EXPECT_BOS("base overflow") + rc = qsort_s(array, LEN, RSIZE_MAX_MEM + 1, comp, NULL); +- ERR(ESLEMAX); ++ ERR(ESNOSPC); + } + #endif + diff --git a/meta-oe/recipes-core/safec/safec/0048-adjust-bsearch_s-error-messages-to-qsort_s.patch b/meta-oe/recipes-core/safec/safec/0048-adjust-bsearch_s-error-messages-to-qsort_s.patch new file mode 100644 index 000000000..ad1480f9c --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0048-adjust-bsearch_s-error-messages-to-qsort_s.patch @@ -0,0 +1,96 @@ +From c3fa0b9e75a3f9b45dc6b993ffb01f1638c7d146 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Mon, 8 Nov 2021 18:06:45 +0100 +Subject: [PATCH] adjust bsearch_s error messages to qsort_s + +--- + include/safe_lib.h | 6 +++--- + src/misc/bsearch_s.c | 9 +++++---- + tests/test_bsearch_s.c | 4 ++-- + 3 files changed, 10 insertions(+), 9 deletions(-) + +diff --git a/include/safe_lib.h b/include/safe_lib.h +index 73f2172b..30e022e3 100644 +--- a/include/safe_lib.h ++++ b/include/safe_lib.h +@@ -179,7 +179,7 @@ _bsearch_s_chk(const void *key, const void *base, rsize_t nmemb, rsize_t size, + void *context, const size_t basebos) + BOS_ATTR(nmemb && (_BOS_NULL(key) || _BOS_NULL(base) || + _BOS_ZERO(base, nmemb *size)), +- "empty buf or bufsize") BOS_OVR2_BUTNULL(base, nmemb *size) ++ "empty buf or bufsize") BOS_OVR2_BUTNULL(base, nmemb * size) + BOS_ATTR(nmemb && !compar, "empty compar"); + #define bsearch_s(key, base, nmemb, size, compar, context) \ + _bsearch_s_chk(key, base, nmemb, size, compar, context, BOS(base)) +@@ -188,8 +188,8 @@ EXTERN errno_t _qsort_s_chk(void *base, rsize_t nmemb, rsize_t size, + int (*compar)(const void *x, const void *y, + void *context), + void *context, const size_t basebos) +- BOS_ATTR(nmemb && (_BOS_NULL(base) || _BOS_ZERO(base, nmemb *size)), +- "empty buf or bufsize") BOS_OVR2_BUTNULL(base, nmemb *size) ++ BOS_ATTR(nmemb && (_BOS_NULL(base) || _BOS_ZERO(base, nmemb * size)), ++ "empty buf or bufsize") BOS_OVR2_BUTNULL(base, nmemb * size) + BOS_ATTR(nmemb && !compar, "empty compar"); + #ifndef MINGW_HAS_SECURE_API + #define qsort_s(base, nmemb, size, compar, context) \ +diff --git a/src/misc/bsearch_s.c b/src/misc/bsearch_s.c +index e40b908c..f65ce7f1 100644 +--- a/src/misc/bsearch_s.c ++++ b/src/misc/bsearch_s.c +@@ -80,7 +80,7 @@ + * @pre nmemb or size shall not be greater than RSIZE_MAX_MEM. + * + * If the array contains several elements that compar would indicate as +- * equal to the element searched for, then it is unspecified which element the ++ * equal to the element searched for, then it is unspecified which element the + * function will return as the result. + * + * @return Pointer to an element in the array that compares equal to *key, or +@@ -100,6 +100,7 @@ + * errno values: + * ESNULLP when key, base or compar are a NULL pointer, and nmemb is > 0 + * ESLEMAX when nmemb or size > RSIZE_MAX_MEM ++ * ESNOSPC when nmemb * size > sizeof base + * + * @see + * qsort_s() +@@ -128,7 +129,7 @@ _bsearch_s_chk(const void *key, const void *base, rsize_t nmemb, rsize_t size, + if (basebos == BOS_UNKNOWN) { + if (unlikely(nmemb > RSIZE_MAX_MEM || size > RSIZE_MAX_MEM)) { + invoke_safe_mem_constraint_handler( +- "bsearch_s: nmemb/size exceeds max", (void *)base, ESLEMAX); ++ "bsearch_s: nmemb or size exceeds max", (void *)base, ESLEMAX); + errno = ESLEMAX; + return NULL; + } +@@ -137,8 +138,8 @@ _bsearch_s_chk(const void *key, const void *base, rsize_t nmemb, rsize_t size, + rsize_t basesz = nmemb * size; + if (unlikely(basesz > basebos)) { + invoke_safe_mem_constraint_handler( +- "bsearch_s: nmemb*size exceeds base", (void *)base, ESLEMAX); +- errno = ESLEMAX; ++ "bsearch_s: nmemb*size exceeds sizeof base", (void *)base, ESNOSPC); ++ errno = ESNOSPC; + return NULL; + } + #ifdef HAVE_WARN_DMAX +diff --git a/tests/test_bsearch_s.c b/tests/test_bsearch_s.c +index 304e80a8..8801333d 100644 +--- a/tests/test_bsearch_s.c ++++ b/tests/test_bsearch_s.c +@@ -77,13 +77,13 @@ int test_bsearch_s(void) { + + EXPECT_BOS("base overflow") + vitem = bsearch_s(&key, array, RSIZE_MAX_MEM + 1, sizeof(array[0]), comp, NULL); +- ERRNO_MSVC(ESLEMAX, EOF); ++ ERRNO_MSVC(ESNOSPC, EOF); + if (!use_msvcrt) + PTRNULL(vitem); + + EXPECT_BOS("base overflow") + vitem = bsearch_s(&key, array, LEN, RSIZE_MAX_MEM + 1, comp, NULL); +- ERRNO_MSVC(ESLEMAX, EOF); ++ ERRNO_MSVC(ESNOSPC, EOF); + if (!use_msvcrt) + PTRNULL(vitem); + #endif diff --git a/meta-oe/recipes-core/safec/safec/0049-add-safec_-prefix-for-internal-printf-function.patch b/meta-oe/recipes-core/safec/safec/0049-add-safec_-prefix-for-internal-printf-function.patch new file mode 100644 index 000000000..057e42d93 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0049-add-safec_-prefix-for-internal-printf-function.patch @@ -0,0 +1,572 @@ +From b4a1e3c3844fe22eca05d62b44eb5588336891c4 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Mon, 8 Nov 2021 19:22:27 +0100 +Subject: [PATCH] add safec_ prefix for internal printf function + +using _ is reserved +--- + src/io/fprintf_s.c | 2 +- + src/io/printf_s.c | 2 +- + src/io/vfprintf_s.c | 2 +- + src/safeclib_private.h | 22 +++--- + src/str/vsnprintf_s.c | 156 ++++++++++++++++++++++------------------- + 5 files changed, 97 insertions(+), 87 deletions(-) + +diff --git a/src/io/fprintf_s.c b/src/io/fprintf_s.c +index e580d2e5..446471d5 100644 +--- a/src/io/fprintf_s.c ++++ b/src/io/fprintf_s.c +@@ -95,7 +95,7 @@ EXPORT int fprintf_s(FILE *restrict stream, const char *restrict fmt, ...) { + errno = 0; + wrap.arg = stream; + va_start(ap, fmt); +- ret = __vsnprintf_s(_out_fchar, (char*)&wrap, (rsize_t)-1, fmt, ap); ++ ret = safec_vsnprintf_s(safec_out_fchar, (char*)&wrap, (rsize_t)-1, fmt, ap); + va_end(ap); + + if (unlikely(ret < 0 && errno != 0)) { +diff --git a/src/io/printf_s.c b/src/io/printf_s.c +index b0d1fa62..babc1c9a 100644 +--- a/src/io/printf_s.c ++++ b/src/io/printf_s.c +@@ -88,7 +88,7 @@ EXPORT int printf_s(const char *restrict fmt, ...) { + } + + va_start(va, fmt); +- ret = __vsnprintf_s(_out_char, buffer, (rsize_t)-1, fmt, va); ++ ret = safec_vsnprintf_s(safec_out_char, buffer, (rsize_t)-1, fmt, va); + va_end(va); + + if (unlikely(ret < 0 && errno != 0)) { +diff --git a/src/io/vfprintf_s.c b/src/io/vfprintf_s.c +index 92d71cc3..e37897e5 100644 +--- a/src/io/vfprintf_s.c ++++ b/src/io/vfprintf_s.c +@@ -104,7 +104,7 @@ EXPORT int vfprintf_s(FILE *restrict stream, const char *restrict fmt, + } + #else + wrap.arg = stream; +- ret = __vsnprintf_s(_out_fchar, (char*)&wrap, (rsize_t)-1, fmt, ap); ++ ret = safec_vsnprintf_s(safec_out_fchar, (char*)&wrap, (rsize_t)-1, fmt, ap); + + if (unlikely(ret < 0 && errno != 0)) { + char errstr[128] = "vfprintf_s: "; +diff --git a/src/safeclib_private.h b/src/safeclib_private.h +index 355bf164..8dc59d12 100644 +--- a/src/safeclib_private.h ++++ b/src/safeclib_private.h +@@ -655,8 +655,9 @@ typedef struct { + } out_fct_wrap_type; + + // internal buffer output +-static inline void _out_buffer(char character, void *buffer, size_t idx, +- size_t maxlen) { ++static inline void safec_out_buffer(char character, void *buffer, size_t idx, ++ size_t maxlen) ++{ + if (idx < maxlen) { + ((char *)buffer)[idx] = character; + } else { +@@ -666,8 +667,9 @@ static inline void _out_buffer(char character, void *buffer, size_t idx, + } + + // internal putchar wrapper +-static inline void _out_char(char character, void *buffer, size_t idx, +- size_t maxlen) { ++static inline void safec_out_char(char character, void *buffer, size_t idx, ++ size_t maxlen) ++{ + (void)buffer; + (void)idx; + (void)maxlen; +@@ -681,8 +683,8 @@ static inline void _out_char(char character, void *buffer, size_t idx, + } + + #ifndef __KERNEL__ +-// special-case of _out_fct for fprintf_s +-static inline void _out_fchar(char character, void *wrap, size_t idx, ++// special-case of safec_out_fct for fprintf_s ++static inline void safec_out_fchar(char character, void *wrap, size_t idx, + size_t maxlen) { + (void)idx; + (void)maxlen; +@@ -692,8 +694,8 @@ static inline void _out_fchar(char character, void *wrap, size_t idx, + #endif + + // internal output function wrapper +-static inline void _out_fct(char character, void *wrap, size_t idx, +- size_t maxlen) { ++static inline void safec_out_fct(char character, void *wrap, size_t idx, ++ size_t maxlen) { + (void)idx; + (void)maxlen; + if (character) { +@@ -702,7 +704,7 @@ static inline void _out_fct(char character, void *wrap, size_t idx, + } + } + // mingw has a _vsnprintf_s +-int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, +- const char *format, va_list va); ++int safec_vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, ++ const char *format, va_list va); + + #endif /* __SAFECLIB_PRIVATE_H__ */ +diff --git a/src/str/vsnprintf_s.c b/src/str/vsnprintf_s.c +index 0e758967..06a579e4 100644 +--- a/src/str/vsnprintf_s.c ++++ b/src/str/vsnprintf_s.c +@@ -164,7 +164,8 @@ + // internal secure strlen + // \return The length of the string (excluding the terminating 0) limited by + // 'maxsize' +-static inline unsigned int _strnlen_s(const char *str, size_t maxsize) { ++static inline unsigned int safec_strnlen_s(const char *str, size_t maxsize) ++{ + const char *s; + for (s = str; *s && maxsize--; ++s) + ; +@@ -173,28 +174,30 @@ static inline unsigned int _strnlen_s(const char *str, size_t maxsize) { + + // internal test if char is a digit (0-9) + // \return true if char is a digit +-static inline bool _is_digit(char ch) { return (ch >= '0') && (ch <= '9'); } ++static inline bool safec_is_digit(char ch) { return (ch >= '0') && (ch <= '9'); } + + // internal ASCII string to unsigned int conversion +-static unsigned int _atoi(const char **str) { ++static unsigned int safec_atoi(const char **str) ++{ + unsigned int i = 0U; +- while (_is_digit(**str)) { ++ while (safec_is_digit(**str)) { + i = i * 10U + (unsigned int)(*((*str)++) - '0'); + } + return i; + } + + // output the specified string in reverse, taking care of any zero-padding +-static size_t _out_rev(out_fct_type out, char *buffer, size_t idx, +- size_t maxlen, const char *buf, size_t len, +- unsigned int width, unsigned int flags) { ++static size_t safec_out_rev(out_fct_type out, char *buffer, size_t idx, ++ size_t maxlen, const char *buf, size_t len, ++ unsigned int width, unsigned int flags) ++{ + const size_t start_idx = idx; + + // pad spaces up to given width + if (!(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) { + for (size_t i = len; i < width; i++) { + out(' ', buffer, idx++, maxlen); +- if (out == _out_buffer && idx > maxlen) ++ if (out == safec_out_buffer && idx > maxlen) + return -(ESNOSPC); + } + } +@@ -202,7 +205,7 @@ static size_t _out_rev(out_fct_type out, char *buffer, size_t idx, + // reverse string + while (len) { + out(buf[--len], buffer, idx++, maxlen); +- if (out == _out_buffer && idx > maxlen) ++ if (out == safec_out_buffer && idx > maxlen) + return -(ESNOSPC); + } + +@@ -210,7 +213,7 @@ static size_t _out_rev(out_fct_type out, char *buffer, size_t idx, + if (flags & FLAGS_LEFT) { + while (idx - start_idx < width) { + out(' ', buffer, idx++, maxlen); +- if (out == _out_buffer && idx > maxlen) ++ if (out == safec_out_buffer && idx > maxlen) + return -(ESNOSPC); + } + } +@@ -219,10 +222,11 @@ static size_t _out_rev(out_fct_type out, char *buffer, size_t idx, + } + + // internal itoa format +-static size_t _ntoa_format(out_fct_type out, char *buffer, size_t idx, +- size_t maxlen, char *buf, size_t len, bool negative, +- unsigned int base, unsigned int prec, +- unsigned int width, unsigned int flags) { ++static size_t safec_ntoa_format(out_fct_type out, char *buffer, size_t idx, ++ size_t maxlen, char *buf, size_t len, bool negative, ++ unsigned int base, unsigned int prec, ++ unsigned int width, unsigned int flags) ++{ + // pad leading zeros + if (!(flags & FLAGS_LEFT)) { + if (width && (flags & FLAGS_ZEROPAD) && +@@ -276,14 +280,15 @@ static size_t _ntoa_format(out_fct_type out, char *buffer, size_t idx, + return -ESLEMAX; + } + +- return _out_rev(out, buffer, idx, maxlen, buf, len, width, flags); ++ return safec_out_rev(out, buffer, idx, maxlen, buf, len, width, flags); + } + + // internal itoa for 'long' type +-static size_t _ntoa_long(out_fct_type out, char *buffer, size_t idx, +- size_t maxlen, unsigned long value, bool negative, +- unsigned long base, unsigned int prec, +- unsigned int width, unsigned int flags) { ++static size_t safec_ntoa_long(out_fct_type out, char *buffer, size_t idx, ++ size_t maxlen, unsigned long value, bool negative, ++ unsigned long base, unsigned int prec, ++ unsigned int width, unsigned int flags) ++{ + char buf[PRINTF_NTOA_BUFFER_SIZE]; + size_t len = 0U; + +@@ -303,17 +308,18 @@ static size_t _ntoa_long(out_fct_type out, char *buffer, size_t idx, + } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + +- return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, +- (unsigned int)base, prec, width, flags); ++ return safec_ntoa_format(out, buffer, idx, maxlen, buf, len, negative, ++ (unsigned int)base, prec, width, flags); + } + + // internal itoa for 'long long' type + #if defined(PRINTF_SUPPORT_LONG_LONG) +-static size_t _ntoa_long_long(out_fct_type out, char *buffer, size_t idx, +- size_t maxlen, unsigned long long value, +- bool negative, unsigned long long base, +- unsigned int prec, unsigned int width, +- unsigned int flags) { ++static size_t safec_ntoa_long_long(out_fct_type out, char *buffer, size_t idx, ++ size_t maxlen, unsigned long long value, ++ bool negative, unsigned long long base, ++ unsigned int prec, unsigned int width, ++ unsigned int flags) ++{ + char buf[PRINTF_NTOA_BUFFER_SIZE]; + size_t len = 0U; + +@@ -333,25 +339,26 @@ static size_t _ntoa_long_long(out_fct_type out, char *buffer, size_t idx, + } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + +- return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, +- (unsigned int)base, prec, width, flags); ++ return safec_ntoa_format(out, buffer, idx, maxlen, buf, len, negative, ++ (unsigned int)base, prec, width, flags); + } + #endif // PRINTF_SUPPORT_LONG_LONG + + #if defined(PRINTF_SUPPORT_FLOAT) + + #if defined(PRINTF_SUPPORT_EXPONENTIAL) +-// forward declaration so that _ftoa can switch to exp notation for values > ++// forward declaration so that safec_ftoa can switch to exp notation for values > + // PRINTF_MAX_FLOAT +-static size_t _etoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, +- double value, unsigned int prec, unsigned int width, +- unsigned int flags); ++static size_t safec_etoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, ++ double value, unsigned int prec, unsigned int width, ++ unsigned int flags); + #endif + + // internal ftoa for fixed decimal floating point +-static size_t _ftoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, +- double value, unsigned int prec, unsigned int width, +- unsigned int flags) { ++static size_t safec_ftoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, ++ double value, unsigned int prec, unsigned int width, ++ unsigned int flags) ++{ + char buf[PRINTF_FTOA_BUFFER_SIZE]; + size_t len = 0U; + double tmp; +@@ -367,11 +374,11 @@ static size_t _ftoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, + + // test for special values + if (value != value) +- return _out_rev(out, buffer, idx, maxlen, "nan", 3, width, flags); ++ return safec_out_rev(out, buffer, idx, maxlen, "nan", 3, width, flags); + if (value < -DBL_MAX) +- return _out_rev(out, buffer, idx, maxlen, "fni-", 4, width, flags); ++ return safec_out_rev(out, buffer, idx, maxlen, "fni-", 4, width, flags); + if (value > DBL_MAX) +- return _out_rev(out, buffer, idx, maxlen, ++ return safec_out_rev(out, buffer, idx, maxlen, + (flags & FLAGS_PLUS) ? "fni+" : "fni", + (flags & FLAGS_PLUS) ? 4U : 3U, width, flags); + +@@ -380,7 +387,7 @@ static size_t _ftoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, + // could be 100s of characters overflowing your buffers == bad + if ((value > PRINTF_MAX_FLOAT) || (value < -PRINTF_MAX_FLOAT)) { + #if defined(PRINTF_SUPPORT_EXPONENTIAL) +- return _etoa(out, buffer, idx, maxlen, value, prec, width, flags); ++ return safec_etoa(out, buffer, idx, maxlen, value, prec, width, flags); + #else + return 0U; + #endif +@@ -476,15 +483,16 @@ static size_t _ftoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, + } + } + +- return _out_rev(out, buffer, idx, maxlen, buf, len, width, flags); ++ return safec_out_rev(out, buffer, idx, maxlen, buf, len, width, flags); + } + + #if defined(PRINTF_SUPPORT_EXPONENTIAL) + // internal ftoa variant for exponential floating-point type, contributed by + // Martijn Jasperse +-static size_t _etoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, +- double value, unsigned int prec, unsigned int width, +- unsigned int flags) { ++static size_t safec_etoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, ++ double value, unsigned int prec, unsigned int width, ++ unsigned int flags) ++{ + union { + uint64_t U; + double F; +@@ -495,7 +503,7 @@ static size_t _etoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, + + // check for NaN and special values + if ((value != value) || (value > DBL_MAX) || (value < -DBL_MAX)) { +- return _ftoa(out, buffer, idx, maxlen, value, prec, width, flags); ++ return safec_ftoa(out, buffer, idx, maxlen, value, prec, width, flags); + } + + // determine the sign +@@ -549,7 +557,7 @@ static size_t _etoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, + } else { + prec = 0; + } +- flags |= FLAGS_PRECISION; // make sure _ftoa respects precision ++ flags |= FLAGS_PRECISION; // make sure safec_ftoa respects precision + // no characters in exponent + minwidth = 0U; + expval = 0; +@@ -584,7 +592,7 @@ static size_t _etoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, + // output the floating part + { + const size_t start_idx = idx; +- idx = _ftoa(out, buffer, idx, maxlen, negative ? -value : value, prec, ++ idx = safec_ftoa(out, buffer, idx, maxlen, negative ? -value : value, prec, + fwidth, flags & ~FLAGS_ADAPT_EXP); + + // output the exponent part +@@ -592,7 +600,7 @@ static size_t _etoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, + // output the exponential symbol + out((flags & FLAGS_UPPERCASE) ? 'E' : 'e', buffer, idx++, maxlen); + // output the exponent value +- idx = _ntoa_long(out, buffer, idx, maxlen, ++ idx = safec_ntoa_long(out, buffer, idx, maxlen, + (expval < 0) ? -expval : expval, expval < 0, 10, 0, + minwidth - 1, FLAGS_ZEROPAD | FLAGS_PLUS); + // might need to right-pad spaces +@@ -610,8 +618,8 @@ static size_t _etoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, + // internal vsnprintf, extended for _s. + // already checked in the caller + // mingw has a _vsnprintf_s(char *_DstBuf,size_t _DstSize,size_t _MaxCount,const char *_Format,va_list _ArgList); +-int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, +- const char *format, va_list va) ++int safec_vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, ++ const char *format, va_list va) + { + unsigned int flags, width, precision, n; + size_t idx = 0U; +@@ -667,8 +675,8 @@ int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + + // evaluate width field + width = 0U; +- if (_is_digit(*format)) { +- width = _atoi(&format); ++ if (safec_is_digit(*format)) { ++ width = safec_atoi(&format); + } else if (*format == '*') { + const int w = va_arg(va, int); + if (w < 0) { +@@ -685,8 +693,8 @@ int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + if (*format == '.') { + flags |= FLAGS_PRECISION; + format++; +- if (_is_digit(*format)) { +- precision = _atoi(&format); ++ if (safec_is_digit(*format)) { ++ precision = safec_atoi(&format); + } else if (*format == '*') { + const int prec = (int)va_arg(va, int); + precision = prec > 0 ? (unsigned int)prec : 0U; +@@ -775,14 +783,14 @@ int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + if (flags & FLAGS_LONG_LONG) { + #if defined(PRINTF_SUPPORT_LONG_LONG) + const long long value = va_arg(va, long long); +- idx = _ntoa_long_long( ++ idx = safec_ntoa_long_long( + out, buffer, idx, bufsize, + (unsigned long long)(value > 0 ? value : 0 - value), + value < 0, base, precision, width, flags); + #endif + } else if (flags & FLAGS_LONG) { + const long value = va_arg(va, long); +- idx = _ntoa_long( ++ idx = safec_ntoa_long( + out, buffer, idx, bufsize, + (unsigned long)(value > 0 ? value : 0 - value), + value < 0, base, precision, width, flags); +@@ -791,7 +799,7 @@ int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + (flags & FLAGS_CHAR) ? (char)va_arg(va, int) + : (flags & FLAGS_SHORT) ? (short int)va_arg(va, int) + : va_arg(va, int); +- idx = _ntoa_long( ++ idx = safec_ntoa_long( + out, buffer, idx, bufsize, + (unsigned int)(value > 0 ? value : 0 - value), + value < 0, base, precision, width, flags); +@@ -800,12 +808,12 @@ int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + // unsigned + if (flags & FLAGS_LONG_LONG) { + #if defined(PRINTF_SUPPORT_LONG_LONG) +- idx = _ntoa_long_long(out, buffer, idx, bufsize, ++ idx = safec_ntoa_long_long(out, buffer, idx, bufsize, + va_arg(va, unsigned long long), false, + base, precision, width, flags); + #endif + } else if (flags & FLAGS_LONG) { +- idx = _ntoa_long(out, buffer, idx, bufsize, ++ idx = safec_ntoa_long(out, buffer, idx, bufsize, + va_arg(va, unsigned long), false, base, + precision, width, flags); + } else { +@@ -815,7 +823,7 @@ int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + : (flags & FLAGS_SHORT) + ? (unsigned short int)va_arg(va, unsigned int) + : va_arg(va, unsigned int); +- idx = _ntoa_long(out, buffer, idx, bufsize, value, false, ++ idx = safec_ntoa_long(out, buffer, idx, bufsize, value, false, + base, precision, width, flags); + } + } +@@ -827,7 +835,7 @@ int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + case 'F': + if (*format == 'F') + flags |= FLAGS_UPPERCASE; +- idx = _ftoa(out, buffer, idx, bufsize, va_arg(va, double), precision, ++ idx = safec_ftoa(out, buffer, idx, bufsize, va_arg(va, double), precision, + width, flags); + format++; + break; +@@ -840,7 +848,7 @@ int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + flags |= FLAGS_ADAPT_EXP; + if ((*format == 'E') || (*format == 'G')) + flags |= FLAGS_UPPERCASE; +- idx = _etoa(out, buffer, idx, bufsize, va_arg(va, double), precision, ++ idx = safec_etoa(out, buffer, idx, bufsize, va_arg(va, double), precision, + width, flags); + format++; + break; +@@ -852,19 +860,19 @@ int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + if (!(flags & FLAGS_LEFT)) { + while (l++ < width) { + out(' ', buffer, idx++, bufsize); +- if (out == _out_buffer && idx > bufsize) ++ if (out == safec_out_buffer && idx > bufsize) + return -(ESNOSPC); + } + } + // char output + out((char)va_arg(va, int), buffer, idx++, bufsize); +- if (out == _out_buffer && idx > bufsize) ++ if (out == safec_out_buffer && idx > bufsize) + return -(ESNOSPC); + // post padding + if (flags & FLAGS_LEFT) { + while (l++ < width) { + out(' ', buffer, idx++, bufsize); +- if (out == _out_buffer && idx > bufsize) ++ if (out == safec_out_buffer && idx > bufsize) + return -(ESNOSPC); + } + } +@@ -880,7 +888,7 @@ int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + NULL, ESNULLP); + return -(ESNULLP); + } +- l = _strnlen_s(p, precision ? precision : (size_t)-1); ++ l = safec_strnlen_s(p, precision ? precision : (size_t)-1); + if (l + idx > bufsize) { + invoke_safe_str_constraint_handler("vsnprintf_s: %s arg exceeds dmax", + NULL, ESNOSPC); +@@ -893,21 +901,21 @@ int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + if (!(flags & FLAGS_LEFT)) { + while (l++ < width) { + out(' ', buffer, idx++, bufsize); +- if (out == _out_buffer && idx > bufsize) ++ if (out == safec_out_buffer && idx > bufsize) + return -(ESNOSPC); + } + } + // string output + while ((*p != 0) && (!(flags & FLAGS_PRECISION) || precision--)) { + out(*(p++), buffer, idx++, bufsize); +- if (out == _out_buffer && idx > bufsize) ++ if (out == safec_out_buffer && idx > bufsize) + return -(ESNOSPC); + } + // post padding + if (flags & FLAGS_LEFT) { + while (l++ < width) { + out(' ', buffer, idx++, bufsize); +- if (out == _out_buffer && idx > bufsize) ++ if (out == safec_out_buffer && idx > bufsize) + return -(ESNOSPC); + } + } +@@ -921,12 +929,12 @@ int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + flags |= FLAGS_ZEROPAD | FLAGS_UPPERCASE; + #if defined(PRINTF_SUPPORT_LONG_LONG) + if (sizeof(uintptr_t) == sizeof(long long)) { +- idx = _ntoa_long_long(out, buffer, idx, bufsize, ++ idx = safec_ntoa_long_long(out, buffer, idx, bufsize, + arg, false, 16U, + precision, width, flags); + } else { + #endif +- idx = _ntoa_long(out, buffer, idx, bufsize, ++ idx = safec_ntoa_long(out, buffer, idx, bufsize, + (unsigned long)arg, + false, 16U, precision, width, flags); + #if defined(PRINTF_SUPPORT_LONG_LONG) +@@ -938,7 +946,7 @@ int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + + case '%': + out('%', buffer, idx++, bufsize); +- if (out == _out_buffer && idx > bufsize) ++ if (out == safec_out_buffer && idx > bufsize) + return -(ESNOSPC); + format++; + break; +@@ -950,7 +958,7 @@ int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + + default: + out(*format, buffer, idx++, bufsize); +- if (out == _out_buffer && idx > bufsize) ++ if (out == safec_out_buffer && idx > bufsize) + return -(ESNOSPC); + format++; + break; +@@ -959,7 +967,7 @@ int __vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + + // termination + out((char)0, buffer, idx < bufsize ? idx : bufsize - 1U, bufsize); +- if (out == _out_buffer && idx > bufsize) ++ if (out == safec_out_buffer && idx > bufsize) + return -(ESNOSPC); + + // return written chars without terminating \0 +@@ -1062,7 +1070,7 @@ EXPORT int _vsnprintf_s_chk(char *restrict dest, rsize_t dmax, + } + + errno = 0; +- ret = __vsnprintf_s(_out_buffer, dest, dmax, fmt, ap); ++ ret = safec_vsnprintf_s(safec_out_buffer, dest, dmax, fmt, ap); + + //if (unlikely(ret < 0)) { + // char errstr[128] = "vsnprintf_s: "; diff --git a/meta-oe/recipes-core/safec/safec/0050-printf-add-name-of-failing-function.patch b/meta-oe/recipes-core/safec/safec/0050-printf-add-name-of-failing-function.patch new file mode 100644 index 000000000..5ca5a3a86 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0050-printf-add-name-of-failing-function.patch @@ -0,0 +1,499 @@ +From 4f9f1060509408b8c725c249b1649d24a81468e7 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Wed, 10 Nov 2021 07:23:51 +0100 +Subject: [PATCH] printf: add name of failing function + +--- + src/io/fprintf_s.c | 2 +- + src/io/printf_s.c | 2 +- + src/io/vfprintf_s.c | 2 +- + src/safeclib_private.h | 9 +- + src/str/vsnprintf_s.c | 201 ++++++++++++++++++++++++++++++----------- + 5 files changed, 155 insertions(+), 61 deletions(-) + +diff --git a/src/io/fprintf_s.c b/src/io/fprintf_s.c +index 446471d5..954718a8 100644 +--- a/src/io/fprintf_s.c ++++ b/src/io/fprintf_s.c +@@ -95,7 +95,7 @@ EXPORT int fprintf_s(FILE *restrict stream, const char *restrict fmt, ...) { + errno = 0; + wrap.arg = stream; + va_start(ap, fmt); +- ret = safec_vsnprintf_s(safec_out_fchar, (char*)&wrap, (rsize_t)-1, fmt, ap); ++ ret = safec_vsnprintf_s(safec_out_fchar, "fprintf_s", (char*)&wrap, (rsize_t)-1, fmt, ap); + va_end(ap); + + if (unlikely(ret < 0 && errno != 0)) { +diff --git a/src/io/printf_s.c b/src/io/printf_s.c +index babc1c9a..20ca299c 100644 +--- a/src/io/printf_s.c ++++ b/src/io/printf_s.c +@@ -88,7 +88,7 @@ EXPORT int printf_s(const char *restrict fmt, ...) { + } + + va_start(va, fmt); +- ret = safec_vsnprintf_s(safec_out_char, buffer, (rsize_t)-1, fmt, va); ++ ret = safec_vsnprintf_s(safec_out_char, "printf_s", buffer, (rsize_t)-1, fmt, va); + va_end(va); + + if (unlikely(ret < 0 && errno != 0)) { +diff --git a/src/io/vfprintf_s.c b/src/io/vfprintf_s.c +index e37897e5..ce6dbdb5 100644 +--- a/src/io/vfprintf_s.c ++++ b/src/io/vfprintf_s.c +@@ -104,7 +104,7 @@ EXPORT int vfprintf_s(FILE *restrict stream, const char *restrict fmt, + } + #else + wrap.arg = stream; +- ret = safec_vsnprintf_s(safec_out_fchar, (char*)&wrap, (rsize_t)-1, fmt, ap); ++ ret = safec_vsnprintf_s(safec_out_fchar, "vfprintf_s", (char*)&wrap, (rsize_t)-1, fmt, ap); + + if (unlikely(ret < 0 && errno != 0)) { + char errstr[128] = "vfprintf_s: "; +diff --git a/src/safeclib_private.h b/src/safeclib_private.h +index 8dc59d12..9f36368f 100644 +--- a/src/safeclib_private.h ++++ b/src/safeclib_private.h +@@ -598,6 +598,9 @@ typedef unsigned long uintptr_t; + #define vswprintf(dest, dmax, fmt, ap) vswprintf(dest, fmt, ap) + #endif + ++#define wcstombs_s(retvalp, dest, dmax, src, len) \ ++ _wcstombs_s_chk(retvalp, dest, dmax, src, len, BOS(dest)) ++ + /* mingw64 3.0.1 + has strtok_s, wcstok_s, and vsnprintf_s, which we patch in the tests. */ + #undef _ENC_W16 +@@ -703,8 +706,8 @@ static inline void safec_out_fct(char character, void *wrap, size_t idx, + ((out_fct_wrap_type *)wrap)->fct(character, ((out_fct_wrap_type *)wrap)->arg); + } + } +-// mingw has a _vsnprintf_s +-int safec_vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, +- const char *format, va_list va); ++// mingw has a _vsnprintf_s. we use our own. ++int safec_vsnprintf_s(out_fct_type out, const char *funcname, char *buffer, ++ const size_t bufsize, const char *format, va_list va); + + #endif /* __SAFECLIB_PRIVATE_H__ */ +diff --git a/src/str/vsnprintf_s.c b/src/str/vsnprintf_s.c +index 06a579e4..e1716f25 100644 +--- a/src/str/vsnprintf_s.c ++++ b/src/str/vsnprintf_s.c +@@ -65,14 +65,18 @@ + // THE SOFTWARE. + // + // \brief Tiny printf, sprintf and (v)snprintf implementation, optimized for +-// speed on +-// embedded systems with a very limited resources. These routines are +-// thread safe and reentrant! Use this instead of the bloated +-// standard/newlib printf cause these use malloc for printf (and may not +-// be thread safe). ++// speed on embedded systems with a very limited ++// resources. These routines are thread safe and reentrant! Use ++// this instead of the bloated standard/newlib printf cause ++// these use malloc for printf (and may not be thread safe). + // + /////////////////////////////////////////////////////////////////////////////// + ++/* safelib extensions: ++ * added support for _s ++ * %lc, %ls widechar conversions ++ */ ++ + #include + #include + +@@ -222,7 +226,8 @@ static size_t safec_out_rev(out_fct_type out, char *buffer, size_t idx, + } + + // internal itoa format +-static size_t safec_ntoa_format(out_fct_type out, char *buffer, size_t idx, ++static size_t safec_ntoa_format(out_fct_type out, const char *funcname, ++ char *buffer, size_t idx, + size_t maxlen, char *buf, size_t len, bool negative, + unsigned int base, unsigned int prec, + unsigned int width, unsigned int flags) +@@ -275,8 +280,9 @@ static size_t safec_ntoa_format(out_fct_type out, char *buffer, size_t idx, + } + } + if (width > 2147483614) { +- invoke_safe_str_constraint_handler("vsnprintf_s: width exceeds max", +- NULL, ESLEMAX); ++ char msg[80]; ++ snprintf(msg, sizeof msg, "%s: width exceeds max", funcname); ++ invoke_safe_str_constraint_handler(msg, buf, ESLEMAX); + return -ESLEMAX; + } + +@@ -284,7 +290,8 @@ static size_t safec_ntoa_format(out_fct_type out, char *buffer, size_t idx, + } + + // internal itoa for 'long' type +-static size_t safec_ntoa_long(out_fct_type out, char *buffer, size_t idx, ++static size_t safec_ntoa_long(out_fct_type out, const char *funcname, ++ char *buffer, size_t idx, + size_t maxlen, unsigned long value, bool negative, + unsigned long base, unsigned int prec, + unsigned int width, unsigned int flags) +@@ -308,13 +315,14 @@ static size_t safec_ntoa_long(out_fct_type out, char *buffer, size_t idx, + } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + +- return safec_ntoa_format(out, buffer, idx, maxlen, buf, len, negative, ++ return safec_ntoa_format(out, funcname, buffer, idx, maxlen, buf, len, negative, + (unsigned int)base, prec, width, flags); + } + + // internal itoa for 'long long' type + #if defined(PRINTF_SUPPORT_LONG_LONG) +-static size_t safec_ntoa_long_long(out_fct_type out, char *buffer, size_t idx, ++static size_t safec_ntoa_long_long(out_fct_type out, const char *funcname, ++ char *buffer, size_t idx, + size_t maxlen, unsigned long long value, + bool negative, unsigned long long base, + unsigned int prec, unsigned int width, +@@ -339,7 +347,7 @@ static size_t safec_ntoa_long_long(out_fct_type out, char *buffer, size_t idx, + } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + +- return safec_ntoa_format(out, buffer, idx, maxlen, buf, len, negative, ++ return safec_ntoa_format(out, funcname, buffer, idx, maxlen, buf, len, negative, + (unsigned int)base, prec, width, flags); + } + #endif // PRINTF_SUPPORT_LONG_LONG +@@ -349,13 +357,15 @@ static size_t safec_ntoa_long_long(out_fct_type out, char *buffer, size_t idx, + #if defined(PRINTF_SUPPORT_EXPONENTIAL) + // forward declaration so that safec_ftoa can switch to exp notation for values > + // PRINTF_MAX_FLOAT +-static size_t safec_etoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, ++static size_t safec_etoa(out_fct_type out, const char *funcname, ++ char *buffer, size_t idx, size_t maxlen, + double value, unsigned int prec, unsigned int width, + unsigned int flags); + #endif + + // internal ftoa for fixed decimal floating point +-static size_t safec_ftoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, ++static size_t safec_ftoa(out_fct_type out, const char *funcname, ++ char *buffer, size_t idx, size_t maxlen, + double value, unsigned int prec, unsigned int width, + unsigned int flags) + { +@@ -387,7 +397,7 @@ static size_t safec_ftoa(out_fct_type out, char *buffer, size_t idx, size_t maxl + // could be 100s of characters overflowing your buffers == bad + if ((value > PRINTF_MAX_FLOAT) || (value < -PRINTF_MAX_FLOAT)) { + #if defined(PRINTF_SUPPORT_EXPONENTIAL) +- return safec_etoa(out, buffer, idx, maxlen, value, prec, width, flags); ++ return safec_etoa(out, funcname, buffer, idx, maxlen, value, prec, width, flags); + #else + return 0U; + #endif +@@ -489,7 +499,8 @@ static size_t safec_ftoa(out_fct_type out, char *buffer, size_t idx, size_t maxl + #if defined(PRINTF_SUPPORT_EXPONENTIAL) + // internal ftoa variant for exponential floating-point type, contributed by + // Martijn Jasperse +-static size_t safec_etoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, ++static size_t safec_etoa(out_fct_type out, const char *funcname, ++ char *buffer, size_t idx, size_t maxlen, + double value, unsigned int prec, unsigned int width, + unsigned int flags) + { +@@ -503,7 +514,7 @@ static size_t safec_etoa(out_fct_type out, char *buffer, size_t idx, size_t maxl + + // check for NaN and special values + if ((value != value) || (value > DBL_MAX) || (value < -DBL_MAX)) { +- return safec_ftoa(out, buffer, idx, maxlen, value, prec, width, flags); ++ return safec_ftoa(out, funcname, buffer, idx, maxlen, value, prec, width, flags); + } + + // determine the sign +@@ -592,15 +603,16 @@ static size_t safec_etoa(out_fct_type out, char *buffer, size_t idx, size_t maxl + // output the floating part + { + const size_t start_idx = idx; +- idx = safec_ftoa(out, buffer, idx, maxlen, negative ? -value : value, prec, +- fwidth, flags & ~FLAGS_ADAPT_EXP); ++ idx = safec_ftoa(out, funcname, buffer, idx, maxlen, ++ negative ? -value : value, prec, fwidth, ++ flags & ~FLAGS_ADAPT_EXP); + + // output the exponent part + if (minwidth) { + // output the exponential symbol + out((flags & FLAGS_UPPERCASE) ? 'E' : 'e', buffer, idx++, maxlen); + // output the exponent value +- idx = safec_ntoa_long(out, buffer, idx, maxlen, ++ idx = safec_ntoa_long(out, funcname, buffer, idx, maxlen, + (expval < 0) ? -expval : expval, expval < 0, 10, 0, + minwidth - 1, FLAGS_ZEROPAD | FLAGS_PLUS); + // might need to right-pad spaces +@@ -618,8 +630,8 @@ static size_t safec_etoa(out_fct_type out, char *buffer, size_t idx, size_t maxl + // internal vsnprintf, extended for _s. + // already checked in the caller + // mingw has a _vsnprintf_s(char *_DstBuf,size_t _DstSize,size_t _MaxCount,const char *_Format,va_list _ArgList); +-int safec_vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, +- const char *format, va_list va) ++int safec_vsnprintf_s(out_fct_type out, const char* funcname, ++ char *buffer, const size_t bufsize, const char *format, va_list va) + { + unsigned int flags, width, precision, n; + size_t idx = 0U; +@@ -784,14 +796,14 @@ int safec_vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + #if defined(PRINTF_SUPPORT_LONG_LONG) + const long long value = va_arg(va, long long); + idx = safec_ntoa_long_long( +- out, buffer, idx, bufsize, ++ out, funcname, buffer, idx, bufsize, + (unsigned long long)(value > 0 ? value : 0 - value), + value < 0, base, precision, width, flags); + #endif + } else if (flags & FLAGS_LONG) { + const long value = va_arg(va, long); + idx = safec_ntoa_long( +- out, buffer, idx, bufsize, ++ out, funcname, buffer, idx, bufsize, + (unsigned long)(value > 0 ? value : 0 - value), + value < 0, base, precision, width, flags); + } else { +@@ -800,7 +812,7 @@ int safec_vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + : (flags & FLAGS_SHORT) ? (short int)va_arg(va, int) + : va_arg(va, int); + idx = safec_ntoa_long( +- out, buffer, idx, bufsize, ++ out, funcname, buffer, idx, bufsize, + (unsigned int)(value > 0 ? value : 0 - value), + value < 0, base, precision, width, flags); + } +@@ -808,14 +820,15 @@ int safec_vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + // unsigned + if (flags & FLAGS_LONG_LONG) { + #if defined(PRINTF_SUPPORT_LONG_LONG) +- idx = safec_ntoa_long_long(out, buffer, idx, bufsize, +- va_arg(va, unsigned long long), false, +- base, precision, width, flags); ++ idx = safec_ntoa_long_long( ++ out, funcname, buffer, idx, bufsize, ++ va_arg(va, unsigned long long), false, base, precision, ++ width, flags); + #endif + } else if (flags & FLAGS_LONG) { +- idx = safec_ntoa_long(out, buffer, idx, bufsize, +- va_arg(va, unsigned long), false, base, +- precision, width, flags); ++ idx = safec_ntoa_long(out, funcname, buffer, idx, bufsize, ++ va_arg(va, unsigned long), false, ++ base, precision, width, flags); + } else { + const unsigned int value = + (flags & FLAGS_CHAR) +@@ -823,8 +836,9 @@ int safec_vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + : (flags & FLAGS_SHORT) + ? (unsigned short int)va_arg(va, unsigned int) + : va_arg(va, unsigned int); +- idx = safec_ntoa_long(out, buffer, idx, bufsize, value, false, +- base, precision, width, flags); ++ idx = safec_ntoa_long(out, funcname, buffer, idx, bufsize, ++ value, false, base, precision, width, ++ flags); + } + } + format++; +@@ -835,8 +849,8 @@ int safec_vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + case 'F': + if (*format == 'F') + flags |= FLAGS_UPPERCASE; +- idx = safec_ftoa(out, buffer, idx, bufsize, va_arg(va, double), precision, +- width, flags); ++ idx = safec_ftoa(out, funcname, buffer, idx, bufsize, ++ va_arg(va, double), precision, width, flags); + format++; + break; + #if defined(PRINTF_SUPPORT_EXPONENTIAL) +@@ -848,14 +862,31 @@ int safec_vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + flags |= FLAGS_ADAPT_EXP; + if ((*format == 'E') || (*format == 'G')) + flags |= FLAGS_UPPERCASE; +- idx = safec_etoa(out, buffer, idx, bufsize, va_arg(va, double), precision, +- width, flags); ++ idx = safec_etoa(out, funcname, buffer, idx, bufsize, ++ va_arg(va, double), precision, width, flags); + format++; + break; + #endif // PRINTF_SUPPORT_EXPONENTIAL + #endif // PRINTF_SUPPORT_FLOAT + case 'c': { + unsigned int l = 1U; ++ char wstr[4]; ++ if (flags & FLAGS_LONG) { ++#ifndef SAFECLIB_DISABLE_WCHAR ++ int len = wctomb(wstr, va_arg(va, int)); ++ if (len <= 0) { ++ char msg[80]; ++ snprintf(msg, sizeof msg, "%s: wctomb for %%lc arg failed", funcname); ++ invoke_safe_str_constraint_handler(msg, buffer, RCNEGATE(-len)); ++ return len; ++ } ++#else ++ char msg[80]; ++ snprintf(msg, sizeof msg, "%s: unsupported %%lc arg", funcname); ++ invoke_safe_str_constraint_handler(msg, buffer, RCNEGATE(1)); ++ return -1; ++#endif ++ } + // pre padding + if (!(flags & FLAGS_LEFT)) { + while (l++ < width) { +@@ -865,7 +896,16 @@ int safec_vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + } + } + // char output +- out((char)va_arg(va, int), buffer, idx++, bufsize); ++ if (flags & FLAGS_LONG) { ++ char *p = &wstr[0]; ++ while (*p != 0) { ++ out(*(p++), buffer, idx++, bufsize); ++ if (out == safec_out_buffer && idx > bufsize) ++ return -(ESNOSPC); ++ } ++ } else { ++ out((char)va_arg(va, int), buffer, idx++, bufsize); ++ } + if (out == safec_out_buffer && idx > bufsize) + return -(ESNOSPC); + // post padding +@@ -881,17 +921,58 @@ int safec_vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + } + + case 's': { ++ char *p; + unsigned int l; +- const char *p = va_arg(va, char *); +- if (!p) { +- invoke_safe_str_constraint_handler("vsnprintf_s: %s arg is null", +- NULL, ESNULLP); +- return -(ESNULLP); ++ if (flags & FLAGS_LONG) { ++#ifndef SAFECLIB_DISABLE_WCHAR ++ size_t len; ++ errno_t err; ++ const wchar_t *lp = va_arg(va, wchar_t *); ++ if (!lp) { ++ char msg[80]; ++ snprintf(msg, sizeof msg, "%s: %%ls arg is null", funcname); ++ invoke_safe_str_constraint_handler(msg, buffer, ESNULLP); ++ return -(ESNULLP); ++ } ++ l = wcsnlen_s(lp, precision ? precision : (size_t)-1); ++ p = malloc(l + 1); ++ if (!p) { ++ char msg[80]; ++ snprintf(msg, sizeof msg, "%s: malloc %%ls arg failed", funcname); ++ invoke_safe_str_constraint_handler(msg, buffer, 1); ++ return -1; ++ } ++ err = wcstombs_s(&len, p, l, lp, l); ++ if (err != EOK) { ++ char msg[80]; ++ snprintf(msg, sizeof msg, "%s: wcstombs_s for %%ls arg failed", funcname); ++ invoke_safe_str_constraint_handler(msg, buffer, RCNEGATE(err)); ++ return err; ++ } ++#else ++ { ++ char msg[80]; ++ snprintf(msg, sizeof msg, "%s: unsupported %%ls arg", funcname); ++ invoke_safe_str_constraint_handler(msg, buffer, RCNEGATE(1)); ++ } ++ return -1; ++#endif ++ } else { ++ p = va_arg(va, char *); ++ if (!p) { ++ char msg[80]; ++ snprintf(msg, sizeof msg, "%s: %%s arg is null", funcname); ++ invoke_safe_str_constraint_handler(msg, buffer, ESNULLP); ++ return -(ESNULLP); ++ } ++ l = safec_strnlen_s(p, precision ? precision : (size_t)-1); + } +- l = safec_strnlen_s(p, precision ? precision : (size_t)-1); + if (l + idx > bufsize) { +- invoke_safe_str_constraint_handler("vsnprintf_s: %s arg exceeds dmax", +- NULL, ESNOSPC); ++ char msg[80]; ++ snprintf(msg, sizeof msg, "%s: %%s arg exceeds dmax", funcname); ++ invoke_safe_str_constraint_handler(msg, buffer, ESNOSPC); ++ if (flags & FLAGS_LONG) ++ free(p); + return -(ESNOSPC); + } + // pre padding +@@ -901,16 +982,24 @@ int safec_vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + if (!(flags & FLAGS_LEFT)) { + while (l++ < width) { + out(' ', buffer, idx++, bufsize); +- if (out == safec_out_buffer && idx > bufsize) ++ if (out == safec_out_buffer && idx > bufsize) { ++ if (flags & FLAGS_LONG) ++ free(p); + return -(ESNOSPC); ++ } + } + } + // string output + while ((*p != 0) && (!(flags & FLAGS_PRECISION) || precision--)) { + out(*(p++), buffer, idx++, bufsize); +- if (out == safec_out_buffer && idx > bufsize) ++ if (out == safec_out_buffer && idx > bufsize) { ++ if (flags & FLAGS_LONG) ++ free(p); + return -(ESNOSPC); ++ } + } ++ if (flags & FLAGS_LONG) ++ free(p); + // post padding + if (flags & FLAGS_LEFT) { + while (l++ < width) { +@@ -929,12 +1018,12 @@ int safec_vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + flags |= FLAGS_ZEROPAD | FLAGS_UPPERCASE; + #if defined(PRINTF_SUPPORT_LONG_LONG) + if (sizeof(uintptr_t) == sizeof(long long)) { +- idx = safec_ntoa_long_long(out, buffer, idx, bufsize, ++ idx = safec_ntoa_long_long(out, funcname, buffer, idx, bufsize, + arg, false, 16U, + precision, width, flags); + } else { + #endif +- idx = safec_ntoa_long(out, buffer, idx, bufsize, ++ idx = safec_ntoa_long(out, funcname, buffer, idx, bufsize, + (unsigned long)arg, + false, 16U, precision, width, flags); + #if defined(PRINTF_SUPPORT_LONG_LONG) +@@ -952,10 +1041,12 @@ int safec_vsnprintf_s(out_fct_type out, char *buffer, const size_t bufsize, + break; + + case 'n': +- invoke_safe_str_constraint_handler("vsprintf_s: illegal %n", NULL, +- EINVAL); +- return -1; +- ++ { ++ char msg[80]; ++ snprintf(msg, sizeof msg, "%s: illegal %%n", funcname); ++ invoke_safe_str_constraint_handler(msg, NULL, EINVAL); ++ return -1; ++ } + default: + out(*format, buffer, idx++, bufsize); + if (out == safec_out_buffer && idx > bufsize) +@@ -1070,7 +1161,7 @@ EXPORT int _vsnprintf_s_chk(char *restrict dest, rsize_t dmax, + } + + errno = 0; +- ret = safec_vsnprintf_s(safec_out_buffer, dest, dmax, fmt, ap); ++ ret = safec_vsnprintf_s(safec_out_buffer, "vsnprintf_s", dest, dmax, fmt, ap); + + //if (unlikely(ret < 0)) { + // char errstr[128] = "vsnprintf_s: "; diff --git a/meta-oe/recipes-core/safec/safec/0051-printf-correctly-reject-illegal-format-specifiers.patch b/meta-oe/recipes-core/safec/safec/0051-printf-correctly-reject-illegal-format-specifiers.patch new file mode 100644 index 000000000..6b37b35aa --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0051-printf-correctly-reject-illegal-format-specifiers.patch @@ -0,0 +1,64 @@ +From 99f15561b08cc3f33531f6c8eb5cab326ff946ee Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sat, 13 Nov 2021 16:55:04 +0100 +Subject: [PATCH] printf: correctly reject illegal format specifiers + +as formerly only with musl or msvcrt, but now for all libc's. +With the optional ENABLE_ILLEGAL_FORMATSPECIFIER you get back +the old glibc and bsd libc behaviour. +(when people forget about %% to print a single %) +--- + src/str/vsnprintf_s.c | 10 ++++++++++ + tests/test_vsprintf_s.c | 11 ++--------- + 2 files changed, 12 insertions(+), 9 deletions(-) + +diff --git a/src/str/vsnprintf_s.c b/src/str/vsnprintf_s.c +index e1716f25..f9d5c209 100644 +--- a/src/str/vsnprintf_s.c ++++ b/src/str/vsnprintf_s.c +@@ -1048,10 +1048,20 @@ int safec_vsnprintf_s(out_fct_type out, const char* funcname, + return -1; + } + default: ++ // illegal % format-specifier ++#ifndef ENABLE_ILLEGAL_FORMATSPECIFIER ++ { ++ char msg[80]; ++ snprintf(msg, sizeof msg, "%s: illegal %%%c format-specifier", funcname, *format); ++ invoke_safe_str_constraint_handler(msg, NULL, EINVAL); ++ } ++ return -1; ++#else + out(*format, buffer, idx++, bufsize); + if (out == safec_out_buffer && idx > bufsize) + return -(ESNOSPC); + format++; ++#endif + break; + } + } +diff --git a/tests/test_vsprintf_s.c b/tests/test_vsprintf_s.c +index 30fbfd8a..63f7548d 100644 +--- a/tests/test_vsprintf_s.c ++++ b/tests/test_vsprintf_s.c +@@ -263,18 +263,11 @@ int test_vsprintf_s(void) { + + /*--------------------------------------------------*/ + +- /* everybody incorrectly accepts illegal % specifiers, only musl not. */ ++ /* Only musl and msvcrt sec_api incorrectly accepts illegal % specifiers. */ + rc = vtprintf_s(str1, LEN, "%y"); +- /* TODO: dietlibc, uClibc, minilibc */ +-#if defined(__GLIBC__) || defined(BSD_ALL_LIKE) /* and older mingw versions */ +- /* they print unknown formats verbatim */ +- NOERR(); +-#else +- /* only musl and msvcrt sec_api correctly rejects illegal format specifiers +- */ ++ /* We implemented it now by our own, as we cannot trust most libc's */ + ERR(-1); + EXPNULL(str1) +-#endif + + /*--------------------------------------------------*/ + diff --git a/meta-oe/recipes-core/safec/safec/0052-printf-catch-print-to-closed-stream-external-errno.patch b/meta-oe/recipes-core/safec/safec/0052-printf-catch-print-to-closed-stream-external-errno.patch new file mode 100644 index 000000000..4434ed2f5 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0052-printf-catch-print-to-closed-stream-external-errno.patch @@ -0,0 +1,365 @@ +From f3a16787dd8d538146a1f5e301fe8398a5a9dafa Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sun, 14 Nov 2021 11:39:22 +0100 +Subject: [PATCH] printf: catch print to closed stream, external errno + +return the result of the systemcall. esp. for print to stdout or FILE. +Fixes the unportability of the latest test_vfprintf_s across libc's. +--- + src/io/vfprintf_s.c | 7 ++- + src/safeclib_private.h | 32 ++++++++------ + src/str/vsnprintf_s.c | 96 +++++++++++++++++++++++------------------ + tests/test_vfprintf_s.c | 20 ++------- + 4 files changed, 80 insertions(+), 75 deletions(-) + +diff --git a/src/io/vfprintf_s.c b/src/io/vfprintf_s.c +index ce6dbdb5..00c9e522 100644 +--- a/src/io/vfprintf_s.c ++++ b/src/io/vfprintf_s.c +@@ -2,6 +2,7 @@ + * vfprintf_s.c + * + * September 2017, Reini Urban ++ * November 2021, Reini Urban + * + * Copyright (c) 2017 by Reini Urban + * All rights reserved. +@@ -78,7 +79,11 @@ EXPORT int vfprintf_s(FILE *restrict stream, const char *restrict fmt, + ESNULLP); + return -(ESNULLP); + } +- ++ if (unlikely(fileno(stream) < 0)) { ++ invoke_safe_str_constraint_handler("vfprintf_s: stream is invalid", NULL, ++ EBADF); ++ return -(EBADF); ++ } + if (unlikely(fmt == NULL)) { + invoke_safe_str_constraint_handler("vfprintf_s: fmt is null", NULL, + ESNULLP); +diff --git a/src/safeclib_private.h b/src/safeclib_private.h +index 9f36368f..20a4f7e7 100644 +--- a/src/safeclib_private.h ++++ b/src/safeclib_private.h +@@ -649,28 +649,30 @@ EXTERN int _decomp_s(wchar_t *restrict dest, rsize_t dmax, const uint32_t cp, + // internal helpers for the *printf_s functions: + + // output function type +-typedef void (*out_fct_type)(char character, void *buffer, size_t idx, +- size_t maxlen); ++typedef int (*out_fct_type)(char character, void *buffer, size_t idx, ++ size_t maxlen); + // wrapper (used as buffer) for output function type + typedef struct { +- void (*fct)(char character, void *arg); ++ int (*fct)(char character, void *arg); + void *arg; + } out_fct_wrap_type; + + // internal buffer output +-static inline void safec_out_buffer(char character, void *buffer, size_t idx, ++static inline int safec_out_buffer(char character, void *buffer, size_t idx, + size_t maxlen) + { + if (idx < maxlen) { + ((char *)buffer)[idx] = character; ++ return 1; + } else { + invoke_safe_str_constraint_handler("vsnprintf_s: exceeds dmax", + (char*)buffer, ESNOSPC); ++ return -(ESNOSPC); + } + } + + // internal putchar wrapper +-static inline void safec_out_char(char character, void *buffer, size_t idx, ++static inline int safec_out_char(char character, void *buffer, size_t idx, + size_t maxlen) + { + (void)buffer; +@@ -678,33 +680,35 @@ static inline void safec_out_char(char character, void *buffer, size_t idx, + (void)maxlen; + if (character) { + #ifndef __KERNEL__ +- putchar(character); ++ return putchar(character); + #else +- slprintf("%c", character); ++ int rc = 0; ++ rc = slprintf("%c", character); ++ return rc; + #endif + } ++ else ++ return 0; + } + + #ifndef __KERNEL__ + // special-case of safec_out_fct for fprintf_s +-static inline void safec_out_fchar(char character, void *wrap, size_t idx, ++static inline int safec_out_fchar(char character, void *wrap, size_t idx, + size_t maxlen) { + (void)idx; + (void)maxlen; + //((out_fct_wrap_type *)wrap)->fct(character, ((out_fct_wrap_type *)wrap)->arg); +- fprintf((FILE*)((out_fct_wrap_type *)wrap)->arg, "%c", character); ++ return fprintf((FILE*)((out_fct_wrap_type *)wrap)->arg, "%c", character); + } + #endif + + // internal output function wrapper +-static inline void safec_out_fct(char character, void *wrap, size_t idx, ++static inline int safec_out_fct(char character, void *wrap, size_t idx, + size_t maxlen) { + (void)idx; + (void)maxlen; +- if (character) { +- // buffer is the output fct pointer +- ((out_fct_wrap_type *)wrap)->fct(character, ((out_fct_wrap_type *)wrap)->arg); +- } ++ // wrap is the output fct pointer ++ return ((out_fct_wrap_type *)wrap)->fct(character, ((out_fct_wrap_type *)wrap)->arg); + } + // mingw has a _vsnprintf_s. we use our own. + int safec_vsnprintf_s(out_fct_type out, const char *funcname, char *buffer, +diff --git a/src/str/vsnprintf_s.c b/src/str/vsnprintf_s.c +index f9d5c209..f20707d1 100644 +--- a/src/str/vsnprintf_s.c ++++ b/src/str/vsnprintf_s.c +@@ -200,25 +200,25 @@ static size_t safec_out_rev(out_fct_type out, char *buffer, size_t idx, + // pad spaces up to given width + if (!(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) { + for (size_t i = len; i < width; i++) { +- out(' ', buffer, idx++, maxlen); +- if (out == safec_out_buffer && idx > maxlen) +- return -(ESNOSPC); ++ int rc = out(' ', buffer, idx++, maxlen); ++ if (unlikely(rc < 0)) ++ return rc; + } + } + + // reverse string + while (len) { +- out(buf[--len], buffer, idx++, maxlen); +- if (out == safec_out_buffer && idx > maxlen) +- return -(ESNOSPC); ++ int rc = out(buf[--len], buffer, idx++, maxlen); ++ if (unlikely(rc < 0)) ++ return rc; + } + + // append pad spaces up to given width + if (flags & FLAGS_LEFT) { + while (idx - start_idx < width) { +- out(' ', buffer, idx++, maxlen); +- if (out == safec_out_buffer && idx > maxlen) +- return -(ESNOSPC); ++ int rc = out(' ', buffer, idx++, maxlen); ++ if (unlikely(rc < 0)) ++ return rc; + } + } + +@@ -610,15 +610,20 @@ static size_t safec_etoa(out_fct_type out, const char *funcname, + // output the exponent part + if (minwidth) { + // output the exponential symbol +- out((flags & FLAGS_UPPERCASE) ? 'E' : 'e', buffer, idx++, maxlen); ++ int rc = out((flags & FLAGS_UPPERCASE) ? 'E' : 'e', buffer, idx++, maxlen); ++ if (unlikely(rc < 0)) ++ return rc; + // output the exponent value + idx = safec_ntoa_long(out, funcname, buffer, idx, maxlen, + (expval < 0) ? -expval : expval, expval < 0, 10, 0, + minwidth - 1, FLAGS_ZEROPAD | FLAGS_PLUS); + // might need to right-pad spaces + if (flags & FLAGS_LEFT) { +- while (idx - start_idx < width) ++ while (idx - start_idx < width) { + out(' ', buffer, idx++, maxlen); ++ if (unlikely(rc < 0)) ++ return rc; ++ } + } + } + } +@@ -633,8 +638,9 @@ static size_t safec_etoa(out_fct_type out, const char *funcname, + int safec_vsnprintf_s(out_fct_type out, const char* funcname, + char *buffer, const size_t bufsize, const char *format, va_list va) + { +- unsigned int flags, width, precision, n; + size_t idx = 0U; ++ unsigned int flags, width, precision, n; ++ int rc = 0; + + while (*format) { + if ((long)idx < 0) +@@ -642,7 +648,9 @@ int safec_vsnprintf_s(out_fct_type out, const char* funcname, + // format specifier? %[flags][width][.precision][length] + if (*format != '%') { + // no +- out(*format, buffer, idx++, bufsize); ++ rc = out(*format, buffer, idx++, bufsize); ++ if (unlikely(rc < 0)) ++ return rc; + format++; + continue; + } else { +@@ -890,30 +898,30 @@ int safec_vsnprintf_s(out_fct_type out, const char* funcname, + // pre padding + if (!(flags & FLAGS_LEFT)) { + while (l++ < width) { +- out(' ', buffer, idx++, bufsize); +- if (out == safec_out_buffer && idx > bufsize) +- return -(ESNOSPC); ++ rc = out(' ', buffer, idx++, bufsize); ++ if (unlikely(rc < 0)) ++ return rc; + } + } + // char output + if (flags & FLAGS_LONG) { + char *p = &wstr[0]; + while (*p != 0) { +- out(*(p++), buffer, idx++, bufsize); +- if (out == safec_out_buffer && idx > bufsize) +- return -(ESNOSPC); ++ rc = out(*(p++), buffer, idx++, bufsize); ++ if (unlikely(rc < 0)) ++ return rc; + } + } else { +- out((char)va_arg(va, int), buffer, idx++, bufsize); ++ rc = out((char)va_arg(va, int), buffer, idx++, bufsize); ++ if (unlikely(rc < 0)) ++ return rc; + } +- if (out == safec_out_buffer && idx > bufsize) +- return -(ESNOSPC); + // post padding + if (flags & FLAGS_LEFT) { + while (l++ < width) { +- out(' ', buffer, idx++, bufsize); +- if (out == safec_out_buffer && idx > bufsize) +- return -(ESNOSPC); ++ rc = out(' ', buffer, idx++, bufsize); ++ if (unlikely(rc < 0)) ++ return rc; + } + } + format++; +@@ -981,21 +989,21 @@ int safec_vsnprintf_s(out_fct_type out, const char* funcname, + } + if (!(flags & FLAGS_LEFT)) { + while (l++ < width) { +- out(' ', buffer, idx++, bufsize); +- if (out == safec_out_buffer && idx > bufsize) { ++ rc = out(' ', buffer, idx++, bufsize); ++ if (unlikely(rc < 0)) { + if (flags & FLAGS_LONG) + free(p); +- return -(ESNOSPC); ++ return rc; + } + } + } + // string output + while ((*p != 0) && (!(flags & FLAGS_PRECISION) || precision--)) { +- out(*(p++), buffer, idx++, bufsize); +- if (out == safec_out_buffer && idx > bufsize) { ++ rc = out(*(p++), buffer, idx++, bufsize); ++ if (unlikely(rc < 0)) { //eg. EBADF write to closed file + if (flags & FLAGS_LONG) + free(p); +- return -(ESNOSPC); ++ return rc; + } + } + if (flags & FLAGS_LONG) +@@ -1003,9 +1011,9 @@ int safec_vsnprintf_s(out_fct_type out, const char* funcname, + // post padding + if (flags & FLAGS_LEFT) { + while (l++ < width) { +- out(' ', buffer, idx++, bufsize); +- if (out == safec_out_buffer && idx > bufsize) +- return -(ESNOSPC); ++ rc = out(' ', buffer, idx++, bufsize); ++ if (unlikely(rc < 0)) ++ return rc; + } + } + format++; +@@ -1034,9 +1042,9 @@ int safec_vsnprintf_s(out_fct_type out, const char* funcname, + } + + case '%': +- out('%', buffer, idx++, bufsize); +- if (out == safec_out_buffer && idx > bufsize) +- return -(ESNOSPC); ++ rc = out('%', buffer, idx++, bufsize); ++ if (unlikely(rc < 0)) ++ return rc; + format++; + break; + +@@ -1057,9 +1065,11 @@ int safec_vsnprintf_s(out_fct_type out, const char* funcname, + } + return -1; + #else +- out(*format, buffer, idx++, bufsize); +- if (out == safec_out_buffer && idx > bufsize) +- return -(ESNOSPC); ++ { ++ rc = out(*format, buffer, idx++, bufsize); ++ if (unlikely(rc < 0)) ++ return rc; ++ } + format++; + #endif + break; +@@ -1067,9 +1077,9 @@ int safec_vsnprintf_s(out_fct_type out, const char* funcname, + } + + // termination +- out((char)0, buffer, idx < bufsize ? idx : bufsize - 1U, bufsize); +- if (out == safec_out_buffer && idx > bufsize) +- return -(ESNOSPC); ++ rc = out((char)0, buffer, idx < bufsize ? idx : bufsize - 1U, bufsize); ++ if (unlikely(rc < 0)) ++ return rc; + + // return written chars without terminating \0 + return (int)idx; +diff --git a/tests/test_vfprintf_s.c b/tests/test_vfprintf_s.c +index 340ad3d6..418470db 100644 +--- a/tests/test_vfprintf_s.c ++++ b/tests/test_vfprintf_s.c +@@ -110,24 +110,10 @@ int test_vfprintf_s(void) { + + fclose(out); + +- /* print to closed stream: unportable, and not valgrind-safe */ +-#ifndef __GLIBC__ ++ /* print to closed stream: across libc's unportable, and not valgrind-safe */ + rc = vtfprintf_s(out, "%s", str1); +-#if defined(__GLIBC__) +- if (rc < 0) { +- ERR(-1); +- ERRNO(EBADF); +- } else { +- /* older glibc upstream bug */ +- NOERR(); +- ERRNO(0); +- } +-#elif defined BSD_ALL_LIKE +- ERR(-1); +-#else +- /* musl throws no error */ +-#endif +-#endif ++ ERR(-EBADF); ++ ERRNO(EBADF); + + unlink(TMP); + diff --git a/meta-oe/recipes-core/safec/safec/0053-Add-Changelog-for-upcoming-3.7.0.patch b/meta-oe/recipes-core/safec/safec/0053-Add-Changelog-for-upcoming-3.7.0.patch new file mode 100644 index 000000000..29096170b --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0053-Add-Changelog-for-upcoming-3.7.0.patch @@ -0,0 +1,31 @@ +From d257832e4cd3e2c2a560de074ca2b171056ed4f2 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Wed, 17 Nov 2021 11:38:17 +0100 +Subject: [PATCH] Add Changelog for upcoming 3.7.0 + +--- + ChangeLog | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/ChangeLog b/ChangeLog +index 147b5feb..8eb6d432 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,6 +1,17 @@ + + ChangeLog file for safeclib + ++Changes in 3.7.0 ++ - Switched to proper semantic versioning for upstream packagers. ++ - Added stpcpy_s and stpncpy_s as in the Intel safestringlib fork. ++ - Added our own portable implementation of the family of printf_s ++ functions. This make the results and errno sideeffects more predictable. ++ scanf_s not yet. Fixes GH #97. ++ - Some minor bugfixes, like unknown size_t GH #89, ECONSTANTS as enums ++ on hurd (GH #101), sprintf_s with "" arg (GH #97). ++ - Minor test improvements overall. ++ - Don't build/install wchar manpages with --disable-wchar (GH #95) ++ + Changes in v02092020 3.6.0 + - Improved generated man pages. Describe not the private _chk functions, + but the public _s functions. Merge duplicate return values. diff --git a/meta-oe/recipes-core/safec/safec/0054-WIP-test_vfprintf_s-test-more-fprintf-errors.patch b/meta-oe/recipes-core/safec/safec/0054-WIP-test_vfprintf_s-test-more-fprintf-errors.patch new file mode 100644 index 000000000..8a83980a6 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0054-WIP-test_vfprintf_s-test-more-fprintf-errors.patch @@ -0,0 +1,223 @@ +From 1ce37f6b82986063fad74d208f0d355fdd8e0e28 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sun, 14 Nov 2021 12:35:54 +0100 +Subject: [PATCH] WIP test_vfprintf_s: test more fprintf errors + +not just EBADF on closed files. also permission errors. +use fputc instead of fprintf internally. +test: also check the written filecontent. +--- + src/io/vfprintf_s.c | 3 +- + src/safeclib_private.h | 3 +- + tests/test_vfprintf_s.c | 88 +++++++++++++++++++++++++++++++++++++++-- + 3 files changed, 88 insertions(+), 6 deletions(-) + +diff --git a/src/io/vfprintf_s.c b/src/io/vfprintf_s.c +index 00c9e522..3ade54c0 100644 +--- a/src/io/vfprintf_s.c ++++ b/src/io/vfprintf_s.c +@@ -89,8 +89,7 @@ EXPORT int vfprintf_s(FILE *restrict stream, const char *restrict fmt, + ESNULLP); + return -(ESNULLP); + } +- +- if (unlikely((p = strnstr(fmt, "%n", RSIZE_MAX_STR)))) { ++ if (unlikely((p = strstr(fmt, "%n")))) { + /* at the beginning or if inside, not %%n */ + if ((p - fmt == 0) || *(p - 1) != '%') { + invoke_safe_str_constraint_handler("vfprintf_s: illegal %n", NULL, +diff --git a/src/safeclib_private.h b/src/safeclib_private.h +index 20a4f7e7..a502f41b 100644 +--- a/src/safeclib_private.h ++++ b/src/safeclib_private.h +@@ -698,7 +698,7 @@ static inline int safec_out_fchar(char character, void *wrap, size_t idx, + (void)idx; + (void)maxlen; + //((out_fct_wrap_type *)wrap)->fct(character, ((out_fct_wrap_type *)wrap)->arg); +- return fprintf((FILE*)((out_fct_wrap_type *)wrap)->arg, "%c", character); ++ return fputc(character, (FILE*)((out_fct_wrap_type *)wrap)->arg); + } + #endif + +@@ -710,6 +710,7 @@ static inline int safec_out_fct(char character, void *wrap, size_t idx, + // wrap is the output fct pointer + return ((out_fct_wrap_type *)wrap)->fct(character, ((out_fct_wrap_type *)wrap)->arg); + } ++ + // mingw has a _vsnprintf_s. we use our own. + int safec_vsnprintf_s(out_fct_type out, const char *funcname, char *buffer, + const size_t bufsize, const char *format, va_list va); +diff --git a/tests/test_vfprintf_s.c b/tests/test_vfprintf_s.c +index 418470db..ab47f361 100644 +--- a/tests/test_vfprintf_s.c ++++ b/tests/test_vfprintf_s.c +@@ -6,9 +6,13 @@ + *------------------------------------------------------------------ + */ + ++//#define _POSIX_C_SOURCE 199309 + #include "test_private.h" + #include "safe_str_lib.h" + #include ++#ifdef HAVE_SYS_STAT_H ++#include ++#endif + + //#ifdef HAVE_VFPRINTF_S + //#define HAVE_NATIVE 1 +@@ -21,6 +25,7 @@ + #define LEN (128) + + static FILE *out; ++static char buf[LEN]; + static char str1[LEN]; + static char str2[LEN]; + int vtfprintf_s(FILE *restrict stream, const char *restrict fmt, ...); +@@ -35,46 +40,77 @@ int vtfprintf_s(FILE *restrict stream, const char *restrict fmt, ...) { + return rc; + } + ++#define CMP_AND_RESET(out, s) \ ++ pos = ftell(out); \ ++ fflush(out); \ ++ rewind(out); \ ++ *buf = '\0'; \ ++ ind = fread(buf, pos, 1, out); \ ++ EXPSTR(buf, s) \ ++ rewind(out); \ ++ ind = ftruncate(fileno(out), 0L); ++ + int test_vfprintf_s(void) { + errno_t rc; + int32_t ind; ++ long pos; + int errs = 0; + +- out = fopen(TMP, "w"); +- ++ out = fopen(TMP, "w+"); ++ if (errno) { ++ perror("fopen"); ++ return 1; ++ } ++#ifdef HAVE_SYS_STAT_H ++ { ++ int fd = fileno(out); ++ if (fd < 0) { ++ perror("invalid " TMP); ++ return 1; ++ } ++ } ++#endif + /*--------------------------------------------------*/ + + print_msvcrt(use_msvcrt); + rc = vtfprintf_s(out, NULL); + init_msvcrt(rc == -ESNULLP, &use_msvcrt); + NEGERR_MSVC(ESNULLP, EOF); ++ CMP_AND_RESET(out, "") + + rc = vtfprintf_s(NULL, ""); + NEGERR_MSVC(ESNULLP, EOF); ++ CMP_AND_RESET(out, "") + + rc = vtfprintf_s(out, "", NULL); + NEGERR(EOK) ++ CMP_AND_RESET(out, "") + + rc = vtfprintf_s(NULL, "%s", NULL); + NEGERR(ESNULLP); ++ CMP_AND_RESET(out, "") + + /*--------------------------------------------------*/ + + str1[0] = '\0'; + rc = vtfprintf_s(out, "%s%n\n", str1, &ind); + NEGERR_MSVC(EINVAL, EOF); ++ CMP_AND_RESET(out, "") + + /*--------------------------------------------------*/ + + rc = vtfprintf_s(out, "%s%%n\n", str1); + if (rc < 0) { +- printf("Failed to open stdout for write: %s\n", strerror(errno)); ++ perror("vtfprintf_s"); + return errs; + } + ERR(3) ++ //rewind(out); ++ CMP_AND_RESET(out, "%n\n") //FIXME + + rc = vtfprintf_s(out, "%%n\n"); + ERR(3); ++ CMP_AND_RESET(out, "%n\n") + + /*--------------------------------------------------*/ + +@@ -88,6 +124,7 @@ int test_vfprintf_s(void) { + + rc = vtfprintf_s(out, "%s%s", str1, str2); + ERR(4); ++ CMP_AND_RESET(out, "1234") + + /*--------------------------------------------------*/ + +@@ -95,6 +132,7 @@ int test_vfprintf_s(void) { + /* 0x7fffffff + 1 >INT_MAX */ + rc = printf_s("\n%2147483648d\n", INT_MAX); + NEGERR(ESLEMAX); ++ CMP_AND_RESET(out, "") + //#if defined(__GLIBC__) + //ERRNO(EOVERFLOW); + //#endif +@@ -106,6 +144,50 @@ int test_vfprintf_s(void) { + ANYERR(); + #endif + ++#if defined HAVE_SYS_STAT_H && 0 ++ { ++ int fd = fileno(out); ++ if (fd >= 0) { ++ struct stat st; ++ fstat(fd, &st); ++ if (!S_ISREG(st.st_mode)) ++ return 1; ++ /* print to not-writable stream */ ++#ifndef _WIN32 ++ if (fchmod(fd, st.st_mode & ~(S_IWUSR|S_IWGRP|S_IWOTH)) == 0) ++#else ++ if (chmod(TMP, st.st_mode & ~(S_IWUSR|S_IWGRP|S_IWOTH)) == 0) ++#endif ++ { ++ struct stat st1; ++ fstat(fd, &st1); ++ if (st1.st_mode < st.st_mode) { ++ rc = vtfprintf_s(out, "%s", str1); ++ ANYERR(); // Linux produces EINVAL, other EBADF ++ if (errno >= 0) { ++ debug_printf("%s %u Error errno=%d \n", __FUNCTION__, ++ __LINE__, (int)errno); ++ errs++; ++ } ++ CMP_AND_RESET(out, "") ++ if (pos) { ++ debug_printf("%s %u pos=%ld \n", __FUNCTION__, __LINE__, pos); ++ errs++; ++ } ++ } else { ++ debug_printf("fchmod failed to remove write perms\n"); ++ } ++ } ++#ifndef _WIN32 ++ fchmod(fd, st.st_mode); // restore wr perms ++#else ++ chmod(TMP, st.st_mode); ++#endif ++ rewind(out); ++ } ++ } ++#endif ++ + /*--------------------------------------------------*/ + + fclose(out); diff --git a/meta-oe/recipes-core/safec/safec/0055-fix-compilation-with-c-std-c-11.patch b/meta-oe/recipes-core/safec/safec/0055-fix-compilation-with-c-std-c-11.patch new file mode 100644 index 000000000..77dfa8480 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0055-fix-compilation-with-c-std-c-11.patch @@ -0,0 +1,22 @@ +From e06ed1609e8e0e6c2108c6f3bbd88d8a40b26f26 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Mon, 15 Nov 2021 14:06:37 +0100 +Subject: [PATCH] fix compilation with c++ -std=c++11 + +--- + src/str/vsnprintf_s.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/str/vsnprintf_s.c b/src/str/vsnprintf_s.c +index f20707d1..59dbda94 100644 +--- a/src/str/vsnprintf_s.c ++++ b/src/str/vsnprintf_s.c +@@ -943,7 +943,7 @@ int safec_vsnprintf_s(out_fct_type out, const char* funcname, + return -(ESNULLP); + } + l = wcsnlen_s(lp, precision ? precision : (size_t)-1); +- p = malloc(l + 1); ++ p = (char*)malloc(l + 1); + if (!p) { + char msg[80]; + snprintf(msg, sizeof msg, "%s: malloc %%ls arg failed", funcname); diff --git a/meta-oe/recipes-core/safec/safec/0056-fix-t_vfprintf_s.patch b/meta-oe/recipes-core/safec/safec/0056-fix-t_vfprintf_s.patch new file mode 100644 index 000000000..246298ff3 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0056-fix-t_vfprintf_s.patch @@ -0,0 +1,287 @@ +From 4e525314a826cf00eee2bba0adb22dd78dc2e4a2 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Mon, 15 Nov 2021 17:21:21 +0100 +Subject: [PATCH] fix t_vfprintf_s + +The kernel caches the stat mode, fchmod fails. +So close the file, and re-open with wrong perms. + +some windows variants return EINVAL with fopen w+ (not wine, but +on Github actions Windows Server 2019), so workaround that quirks +--- + tests/test_vfprintf_s.c | 163 +++++++++++++++++++++++----------------- + 1 file changed, 92 insertions(+), 71 deletions(-) + +diff --git a/tests/test_vfprintf_s.c b/tests/test_vfprintf_s.c +index ab47f361..6d345a3f 100644 +--- a/tests/test_vfprintf_s.c ++++ b/tests/test_vfprintf_s.c +@@ -6,7 +6,6 @@ + *------------------------------------------------------------------ + */ + +-//#define _POSIX_C_SOURCE 199309 + #include "test_private.h" + #include "safe_str_lib.h" + #include +@@ -14,11 +13,6 @@ + #include + #endif + +-//#ifdef HAVE_VFPRINTF_S +-//#define HAVE_NATIVE 1 +-//#else +-//#define HAVE_NATIVE 0 +-//#endif + #include "test_msvcrt.h" + + #define TMP "tmpvfp" +@@ -28,6 +22,7 @@ static FILE *out; + static char buf[LEN]; + static char str1[LEN]; + static char str2[LEN]; ++ + int vtfprintf_s(FILE *restrict stream, const char *restrict fmt, ...); + int test_vfprintf_s(void); + +@@ -40,32 +35,73 @@ int vtfprintf_s(FILE *restrict stream, const char *restrict fmt, ...) { + return rc; + } + +-#define CMP_AND_RESET(out, s) \ +- pos = ftell(out); \ +- fflush(out); \ +- rewind(out); \ +- *buf = '\0'; \ +- ind = fread(buf, pos, 1, out); \ +- EXPSTR(buf, s) \ +- rewind(out); \ +- ind = ftruncate(fileno(out), 0L); ++int errs = 0; ++int win_wplus = 0; // if EINVAL with fopen w+ ++ ++// a variant for debugging ++static size_t cmp_and_reset(FILE *out, const char *s) { ++ size_t pos = ftell(out); ++ fflush(out); ++ *buf = '\0'; ++ if (win_wplus) { ++ fclose(out); ++ out = fopen(TMP, "r"); ++ size_t nread = fread(buf, pos, 1, out); ++ fclose(out); ++ out = fopen(TMP, "w"); ++ } else { ++ rewind(out); ++ size_t nread = fread(buf, pos, 1, out); ++ } ++ EXPSTR(buf, s) ++ if (!win_wplus) { ++ rewind(out); ++ size_t nread = ftruncate(fileno(out), 0L); ++ } ++ return pos; ++} + + int test_vfprintf_s(void) { + errno_t rc; + int32_t ind; + long pos; +- int errs = 0; + ++ // mingw (with some versions) disallows w+ (EINVAL) + out = fopen(TMP, "w+"); + if (errno) { +- perror("fopen"); +- return 1; ++ perror("fopen w+"); ++ fclose(out); ++ out = fopen(TMP, "w"); ++ win_wplus = 1; ++ } ++ ++#define CMP_AND_RESET(out, s) \ ++ pos = ftell(out); \ ++ fflush(out); \ ++ *buf = '\0'; \ ++ if (win_wplus) { \ ++ fclose(out); \ ++ out = fopen(TMP, "r"); \ ++ ind = fread(buf, pos, 1, out); \ ++ fclose(out); \ ++ out = fopen(TMP, "w"); \ ++ } else { \ ++ rewind(out); \ ++ ind = fread(buf, pos, 1, out); \ ++ } \ ++ EXPSTR(buf, s) \ ++ if (!win_wplus) { \ ++ rewind(out); \ ++ ind = ftruncate(fileno(out), 0L); \ + } ++ + #ifdef HAVE_SYS_STAT_H + { + int fd = fileno(out); + if (fd < 0) { + perror("invalid " TMP); ++ fclose(out); ++ unlink(TMP); + return 1; + } + } +@@ -76,41 +112,43 @@ int test_vfprintf_s(void) { + rc = vtfprintf_s(out, NULL); + init_msvcrt(rc == -ESNULLP, &use_msvcrt); + NEGERR_MSVC(ESNULLP, EOF); +- CMP_AND_RESET(out, "") ++ CMP_AND_RESET(out, ""); + + rc = vtfprintf_s(NULL, ""); + NEGERR_MSVC(ESNULLP, EOF); +- CMP_AND_RESET(out, "") ++ CMP_AND_RESET(out, ""); + + rc = vtfprintf_s(out, "", NULL); + NEGERR(EOK) +- CMP_AND_RESET(out, "") ++ CMP_AND_RESET(out, ""); + + rc = vtfprintf_s(NULL, "%s", NULL); + NEGERR(ESNULLP); +- CMP_AND_RESET(out, "") ++ CMP_AND_RESET(out, ""); + + /*--------------------------------------------------*/ + + str1[0] = '\0'; + rc = vtfprintf_s(out, "%s%n\n", str1, &ind); + NEGERR_MSVC(EINVAL, EOF); +- CMP_AND_RESET(out, "") ++ CMP_AND_RESET(out, ""); + + /*--------------------------------------------------*/ + + rc = vtfprintf_s(out, "%s%%n\n", str1); + if (rc < 0) { + perror("vtfprintf_s"); ++ fclose(out); ++ unlink(TMP); + return errs; + } + ERR(3) + //rewind(out); +- CMP_AND_RESET(out, "%n\n") //FIXME ++ CMP_AND_RESET(out, "%n\n"); //FIXME + + rc = vtfprintf_s(out, "%%n\n"); + ERR(3); +- CMP_AND_RESET(out, "%n\n") ++ CMP_AND_RESET(out, "%n\n"); + + /*--------------------------------------------------*/ + +@@ -124,7 +162,7 @@ int test_vfprintf_s(void) { + + rc = vtfprintf_s(out, "%s%s", str1, str2); + ERR(4); +- CMP_AND_RESET(out, "1234") ++ CMP_AND_RESET(out, "1234"); + + /*--------------------------------------------------*/ + +@@ -132,7 +170,7 @@ int test_vfprintf_s(void) { + /* 0x7fffffff + 1 >INT_MAX */ + rc = printf_s("\n%2147483648d\n", INT_MAX); + NEGERR(ESLEMAX); +- CMP_AND_RESET(out, "") ++ CMP_AND_RESET(out, ""); + //#if defined(__GLIBC__) + //ERRNO(EOVERFLOW); + //#endif +@@ -144,49 +182,27 @@ int test_vfprintf_s(void) { + ANYERR(); + #endif + +-#if defined HAVE_SYS_STAT_H && 0 +- { +- int fd = fileno(out); +- if (fd >= 0) { +- struct stat st; +- fstat(fd, &st); +- if (!S_ISREG(st.st_mode)) +- return 1; +- /* print to not-writable stream */ +-#ifndef _WIN32 +- if (fchmod(fd, st.st_mode & ~(S_IWUSR|S_IWGRP|S_IWOTH)) == 0) +-#else +- if (chmod(TMP, st.st_mode & ~(S_IWUSR|S_IWGRP|S_IWOTH)) == 0) +-#endif +- { +- struct stat st1; +- fstat(fd, &st1); +- if (st1.st_mode < st.st_mode) { +- rc = vtfprintf_s(out, "%s", str1); +- ANYERR(); // Linux produces EINVAL, other EBADF +- if (errno >= 0) { +- debug_printf("%s %u Error errno=%d \n", __FUNCTION__, +- __LINE__, (int)errno); +- errs++; +- } +- CMP_AND_RESET(out, "") +- if (pos) { +- debug_printf("%s %u pos=%ld \n", __FUNCTION__, __LINE__, pos); +- errs++; +- } +- } else { +- debug_printf("fchmod failed to remove write perms\n"); +- } +- } +-#ifndef _WIN32 +- fchmod(fd, st.st_mode); // restore wr perms +-#else +- chmod(TMP, st.st_mode); +-#endif +- rewind(out); +- } ++ fclose(out); ++ out = fopen(TMP, "r"); ++ if (errno) { ++ perror("fopen r"); ++ unlink(TMP); ++ return errs + 1; ++ } ++ /* print to not-writable stream */ ++ errno = 0; ++ rc = vtfprintf_s(out, "%s", str1); ++ ANYERR(); // Linux may produce EINVAL, most others EBADF ++ if (errno == 0) { ++ debug_printf("%s %u Error errno=%d \n", __FUNCTION__, ++ __LINE__, (int)errno); ++ errs++; ++ } ++ CMP_AND_RESET(out, ""); ++ if (pos) { ++ debug_printf("%s %u pos=%ld \n", __FUNCTION__, __LINE__, pos); ++ errs++; + } +-#endif + + /*--------------------------------------------------*/ + +@@ -194,8 +210,13 @@ int test_vfprintf_s(void) { + + /* print to closed stream: across libc's unportable, and not valgrind-safe */ + rc = vtfprintf_s(out, "%s", str1); +- ERR(-EBADF); +- ERRNO(EBADF); ++ ANYERR(); // Windows may produce EOF, most others EBADF ++ // EBADF (linux, mingw) or EINVAL (bsd) ++ if (errno == 0) { ++ debug_printf("%s %u Error errno=%d \n", __FUNCTION__, ++ __LINE__, (int)errno); ++ errs++; ++ } + + unlink(TMP); + diff --git a/meta-oe/recipes-core/safec/safec/0057-update-coverages-smoke.sh.patch b/meta-oe/recipes-core/safec/safec/0057-update-coverages-smoke.sh.patch new file mode 100644 index 000000000..54def386b --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0057-update-coverages-smoke.sh.patch @@ -0,0 +1,134 @@ +From bc5ca6a2c5b14bee21030b12f0c7e45feecabee9 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Wed, 17 Nov 2021 14:34:49 +0100 +Subject: [PATCH] update coverages (smoke.sh) + +--- + tests/test_fprintf_s.c | 2 +- + tests/test_printf_s.c | 2 +- + tests/test_qsort_s.c | 2 +- + tests/test_snprintf_s.c | 2 +- + tests/test_sprintf_s.c | 2 +- + tests/test_stpncpy_s.c | 2 ++ + tests/test_vfprintf_s.c | 2 +- + tests/test_vsnprintf_s.c | 2 +- + tests/test_vsprintf_s.c | 2 +- + 9 files changed, 10 insertions(+), 8 deletions(-) + +diff --git a/tests/test_fprintf_s.c b/tests/test_fprintf_s.c +index 2706f33c..0ba6e376 100644 +--- a/tests/test_fprintf_s.c ++++ b/tests/test_fprintf_s.c +@@ -1,7 +1,7 @@ + /*------------------------------------------------------------------ + * test_fprintf_s + * File 'io/fprintf_s.c' +- * Lines executed:85.00% of 20 ++ * Lines executed:85.71% of 21 + * + *------------------------------------------------------------------ + */ +diff --git a/tests/test_printf_s.c b/tests/test_printf_s.c +index 03404ca0..7843ca63 100644 +--- a/tests/test_printf_s.c ++++ b/tests/test_printf_s.c +@@ -1,7 +1,7 @@ + /*------------------------------------------------------------------ + * test_printf_s + * File 'printf_s.c' +- * Lines executed:82.35% of 17 ++ * Lines executed:81.25% of 16 + * + *------------------------------------------------------------------ + */ +diff --git a/tests/test_qsort_s.c b/tests/test_qsort_s.c +index 31fc393f..2c73c2be 100644 +--- a/tests/test_qsort_s.c ++++ b/tests/test_qsort_s.c +@@ -1,7 +1,7 @@ + /*------------------------------------------------------------------ + * test_qsort_s + * File 'misc/qsort_s.c' +- * Lines executed:90.40% of 125 ++ * Lines executed:89.23% of 130 + * + *------------------------------------------------------------------ + */ +diff --git a/tests/test_snprintf_s.c b/tests/test_snprintf_s.c +index caf0b3a7..d68a8c5e 100644 +--- a/tests/test_snprintf_s.c ++++ b/tests/test_snprintf_s.c +@@ -1,7 +1,7 @@ + /*------------------------------------------------------------------ + * test_snprintf_s + * File 'snprintf_s.c' +- * Lines executed:87.10% of 31 ++ * Lines executed:100.00% of 5 + * + *------------------------------------------------------------------ + */ +diff --git a/tests/test_sprintf_s.c b/tests/test_sprintf_s.c +index a2df855f..ad7e2116 100644 +--- a/tests/test_sprintf_s.c ++++ b/tests/test_sprintf_s.c +@@ -1,7 +1,7 @@ + /*------------------------------------------------------------------ + * test_sprintf_s + * File 'str/sprintf_s.c' +- * Lines executed:96.88% of 32 ++ * Lines executed:100.00% of 5 + * + *------------------------------------------------------------------ + */ +diff --git a/tests/test_stpncpy_s.c b/tests/test_stpncpy_s.c +index ef2a1636..30fec845 100644 +--- a/tests/test_stpncpy_s.c ++++ b/tests/test_stpncpy_s.c +@@ -1,6 +1,8 @@ + /*------------------------------------------------------------------ + * test_strncpy_s + * File 'stpncpy_s.c' ++ * File 'stpncpy_s.c' ++ * Lines executed:75.25% of 101 + * Lines executed:75.25% of 101 + *------------------------------------------------------------------ + */ +diff --git a/tests/test_vfprintf_s.c b/tests/test_vfprintf_s.c +index 6d345a3f..b19c36dd 100644 +--- a/tests/test_vfprintf_s.c ++++ b/tests/test_vfprintf_s.c +@@ -1,7 +1,7 @@ + /*------------------------------------------------------------------ + * test_vfprintf_s + * File 'vfprintf_s.c' +- * Lines executed:83.33% of 18 ++ * Lines executed:100.00% of 22 + * + *------------------------------------------------------------------ + */ +diff --git a/tests/test_vsnprintf_s.c b/tests/test_vsnprintf_s.c +index adc4f7dc..6d33e75e 100644 +--- a/tests/test_vsnprintf_s.c ++++ b/tests/test_vsnprintf_s.c +@@ -1,7 +1,7 @@ + /*------------------------------------------------------------------ + * test_vsnprintf_s + * File 'wchar/vsnprintf_s.c' +- * Lines executed:75.86% of 29 ++ * Lines executed:40.37% of 488 + * + *------------------------------------------------------------------ + */ +diff --git a/tests/test_vsprintf_s.c b/tests/test_vsprintf_s.c +index 63f7548d..da244766 100644 +--- a/tests/test_vsprintf_s.c ++++ b/tests/test_vsprintf_s.c +@@ -1,7 +1,7 @@ + /*------------------------------------------------------------------ + * test_vsprintf_s + * File 'str/vsprintf_s.c' +- * Lines executed:83.33% of 30 ++ * Lines executed:66.67% of 6 + * + *------------------------------------------------------------------ + */ diff --git a/meta-oe/recipes-core/safec/safec/0058-configure-more-required-safec-CFLAGS.patch b/meta-oe/recipes-core/safec/safec/0058-configure-more-required-safec-CFLAGS.patch new file mode 100644 index 000000000..355a443b4 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0058-configure-more-required-safec-CFLAGS.patch @@ -0,0 +1,36 @@ +From 97e5923e56109b963a1fb6a6babf1875752fe197 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Mon, 13 Dec 2021 09:37:06 +0100 +Subject: [PATCH] configure: more required safec CFLAGS + +-fno-strict-aliasing -fno-strict-overflow -fno-delete-null-pointer-checks +-fno-lifetime-dse +to restrict wrong UB optimizations. +See https://gcc.gnu.org/wiki/boringcc +--- + configure.ac | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +diff --git a/configure.ac b/configure.ac +index 8f568d77..55756b06 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -543,10 +543,14 @@ case $host_os in + [],[$ax_ccf_err]) + ;; + esac +-AX_APPEND_COMPILE_FLAGS([-fstack-protector-strong -fstack-clash-protection -fcf-protection], +- [WARN_CFLAGS],[$ax_ccf_err]) +-AX_APPEND_LINK_FLAGS([-fstack-protector-strong -fstack-clash-protection -fcf-protection], +- [WARN_LDFLAGS],[$ax_ccf_err]) ++AX_APPEND_COMPILE_FLAGS( ++ [-fstack-protector-strong -fstack-clash-protection -fcf-protection \ ++ -fno-strict-aliasing -fno-strict-overflow -fno-delete-null-pointer-checks \ ++ -fno-lifetime-dse], ++ [WARN_CFLAGS],[$ax_ccf_err]) ++AX_APPEND_LINK_FLAGS( ++ [-fstack-protector-strong -fstack-clash-protection -fcf-protection], ++ [WARN_LDFLAGS],[$ax_ccf_err]) + + if test x$ax_cv_check_cflags__Wrestrict = xyes; then + AC_DEFINE([HAVE_WARNING_RESTRICT], 1, [Have -Wrestrict]) diff --git a/meta-oe/recipes-core/safec/safec/0059-configure.ac-add-disable-hardening-option.patch b/meta-oe/recipes-core/safec/safec/0059-configure.ac-add-disable-hardening-option.patch new file mode 100644 index 000000000..4d9ee88f4 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0059-configure.ac-add-disable-hardening-option.patch @@ -0,0 +1,67 @@ +From 8ba8901aec3257d2b98edf0a70e0bccc7447e243 Mon Sep 17 00:00:00 2001 +From: Fabrice Fontaine +Date: Sat, 8 Jan 2022 21:49:22 +0100 +Subject: [PATCH] configure.ac: add --disable-hardening option + +Allow the user to disable hardening which is enabled by default since +version 02092020 and +https://github.com/rurban/safeclib/commit/caa4408eb4a5c767f0474258af3b6ccf444e10aa +to avoid the following build failure when the toolchain doesn't support +stack-protector: + +/home/buildroot/autobuild/instance-3/output-1/host/opt/ext-toolchain/m68k-buildroot-uclinux-uclibc/bin/ld.real: ../src/.libs/libsafec-3.6.0.a(safe_mem_constraint.o): in function `handle_mem_bos_chk_warn': +safe_mem_constraint.c:(.text+0x40): undefined reference to `__stack_chk_guard' + +Fixes: + - http://autobuild.buildroot.org/results/a481ee2d26a094358b0298617cce691be3077f22 + +Signed-off-by: Fabrice Fontaine +--- + configure.ac | 27 +++++++++++++++++++-------- + 1 file changed, 19 insertions(+), 8 deletions(-) + +diff --git a/configure.ac b/configure.ac +index 55756b06..bb82cedc 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -383,6 +383,14 @@ AC_ARG_ENABLE(debug-build, + esac], [enable_debug_build=false ]) + AM_CONDITIONAL(ENABLE_DEBUG_BUILD, test "x$enable_debug_build" = "xtrue") + ++AC_ARG_ENABLE(hardening, ++ AS_HELP_STRING([--disable-hardening], ++ [disable hardening @<:@default=no@:>@]), ++ [case "${enableval}" in ++ yes) enable_hardening=true ;; ++ no) enable_hardening=false ;; ++ *) AC_MSG_ERROR([bad value ${enableval} for --enable-hardening]) ;; ++ esac], [enable_hardening=true]) + + AC_MSG_NOTICE([Check programs]) + # =============================================== +@@ -543,14 +551,17 @@ case $host_os in + [],[$ax_ccf_err]) + ;; + esac +-AX_APPEND_COMPILE_FLAGS( +- [-fstack-protector-strong -fstack-clash-protection -fcf-protection \ +- -fno-strict-aliasing -fno-strict-overflow -fno-delete-null-pointer-checks \ +- -fno-lifetime-dse], +- [WARN_CFLAGS],[$ax_ccf_err]) +-AX_APPEND_LINK_FLAGS( +- [-fstack-protector-strong -fstack-clash-protection -fcf-protection], +- [WARN_LDFLAGS],[$ax_ccf_err]) ++ ++if test "x$enable_hardening" = "xtrue" ; then ++ AX_APPEND_COMPILE_FLAGS( ++ [-fstack-protector-strong -fstack-clash-protection -fcf-protection \ ++ -fno-strict-aliasing -fno-strict-overflow -fno-delete-null-pointer-checks \ ++ -fno-lifetime-dse], ++ [WARN_CFLAGS],[$ax_ccf_err]) ++ AX_APPEND_LINK_FLAGS( ++ [-fstack-protector-strong -fstack-clash-protection -fcf-protection], ++ [WARN_LDFLAGS],[$ax_ccf_err]) ++fi + + if test x$ax_cv_check_cflags__Wrestrict = xyes; then + AC_DEFINE([HAVE_WARNING_RESTRICT], 1, [Have -Wrestrict]) diff --git a/meta-oe/recipes-core/safec/safec/0060-ChangeLog-for-PR-107.patch b/meta-oe/recipes-core/safec/safec/0060-ChangeLog-for-PR-107.patch new file mode 100644 index 000000000..a2639ee80 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0060-ChangeLog-for-PR-107.patch @@ -0,0 +1,23 @@ +From defc4c7c2b8a5ff4b0ef6dd60d6a8422c21fe2bf Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Fri, 14 Jan 2022 14:33:05 +0100 +Subject: [PATCH] ChangeLog for PR #107 + +--- + ChangeLog | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/ChangeLog b/ChangeLog +index 8eb6d432..9e0e9d47 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -7,6 +7,9 @@ Changes in 3.7.0 + - Added our own portable implementation of the family of printf_s + functions. This make the results and errno sideeffects more predictable. + scanf_s not yet. Fixes GH #97. ++ - Added a --disable-hardening option, which bypasses obviously failing ++ AX_APPEND_COMPILE_FLAGS probes (PR #107, ffontaine). ++ E.g. needed on some exotic uclibc buildroot targets. + - Some minor bugfixes, like unknown size_t GH #89, ECONSTANTS as enums + on hurd (GH #101), sprintf_s with "" arg (GH #97). + - Minor test improvements overall. diff --git a/meta-oe/recipes-core/safec/safec/0061-fixup-mingw-GH-action.patch b/meta-oe/recipes-core/safec/safec/0061-fixup-mingw-GH-action.patch new file mode 100644 index 000000000..f0b33e945 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0061-fixup-mingw-GH-action.patch @@ -0,0 +1,57 @@ +From 929e8002805b37c2ce1495e8bd8d0fd44e143ed8 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sun, 9 Jan 2022 19:10:35 +0100 +Subject: [PATCH] fixup mingw GH action + +no update, which is broken +--- + .github/workflows/main.yml | 19 ++++++++++++------- + 1 file changed, 12 insertions(+), 7 deletions(-) + +diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml +index 6f50ad69..a0d7c8a3 100644 +--- a/.github/workflows/main.yml ++++ b/.github/workflows/main.yml +@@ -54,7 +54,7 @@ jobs: + uses: actions/checkout@v2 + - run: sh build-aux/autogen.sh + - run: ./configure +- - run: make ++ - run: make V=1 + - run: make check-log + #- run: make distcheck + mingw: +@@ -81,12 +81,23 @@ jobs: + mingw-w64-x86_64-toolchain + mingw-w64-x86_64-libtool + mingw-w64-x86_64-perl ++ libtool ++ autoconf-wrapper ++ automake-wrapper + - run: reg add "HKLM\Software\Microsoft\Windows\Windows Error Reporting" /f /v DontShowUI /d 1 + - run: git config --global core.autocrlf input + - name: checkout + uses: actions/checkout@v2 + - shell: msys2 {0} + run: sh build-aux/autogen.sh ++ #run: libtoolize -f && autoheader && aclocal -I m4 && autoconf && automake --add-missing; autoreconf -fi ++ continue-on-error: true ++ - shell: msys2 {0} ++ run: ./configure ++ - shell: msys2 {0} ++ run: make V=1 ++ - shell: msys2 {0} ++ run: make check-log + #- name: Create zipped asset + # run: gzip -c configure >configure.gz + #- name: Create Release +@@ -109,9 +120,3 @@ jobs: + # asset_path: ./configure.gz + # asset_name: configure.gz + # asset_content_type: application/gzip +- - shell: msys2 {0} +- run: ./configure +- - shell: msys2 {0} +- run: make V=1 +- - shell: msys2 {0} +- run: make check-log diff --git a/meta-oe/recipes-core/safec/safec/0062-no-stack-clash-protection-on-macOS-clang-yet.patch b/meta-oe/recipes-core/safec/safec/0062-no-stack-clash-protection-on-macOS-clang-yet.patch new file mode 100644 index 000000000..5aea0b083 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0062-no-stack-clash-protection-on-macOS-clang-yet.patch @@ -0,0 +1,30 @@ +From c611d5cccbffd3223830fb51ee525b73a046ffd2 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Fri, 28 Jan 2022 14:57:57 +0100 +Subject: [PATCH] no stack-clash-protection on macOS clang yet + +--- + .github/workflows/main.yml | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml +index a0d7c8a3..69470a7e 100644 +--- a/.github/workflows/main.yml ++++ b/.github/workflows/main.yml +@@ -53,7 +53,7 @@ jobs: + - name: checkout + uses: actions/checkout@v2 + - run: sh build-aux/autogen.sh +- - run: ./configure ++ - run: ./configure --disable-hardening + - run: make V=1 + - run: make check-log + #- run: make distcheck +@@ -90,7 +90,6 @@ jobs: + uses: actions/checkout@v2 + - shell: msys2 {0} + run: sh build-aux/autogen.sh +- #run: libtoolize -f && autoheader && aclocal -I m4 && autoconf && automake --add-missing; autoreconf -fi + continue-on-error: true + - shell: msys2 {0} + run: ./configure diff --git a/meta-oe/recipes-core/safec/safec/0063-minor-docs-m4.patch b/meta-oe/recipes-core/safec/safec/0063-minor-docs-m4.patch new file mode 100644 index 000000000..6ddd407d5 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0063-minor-docs-m4.patch @@ -0,0 +1,46 @@ +From 089a145c41cb4331de9ec7d9520aafd933c8fefe Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Fri, 28 Jan 2022 15:12:31 +0100 +Subject: [PATCH] minor: docs, m4 + +--- + m4/ax_gcc_func_attribute.m4 | 2 +- + src/io/gets_s.c | 12 ++++++------ + 2 files changed, 7 insertions(+), 7 deletions(-) + +diff --git a/m4/ax_gcc_func_attribute.m4 b/m4/ax_gcc_func_attribute.m4 +index 2e93b004..3bebb975 100644 +--- a/m4/ax_gcc_func_attribute.m4 ++++ b/m4/ax_gcc_func_attribute.m4 +@@ -81,7 +81,7 @@ + # and this notice are preserved. This file is offered as-is, without any + # warranty. + +-#serial 12 ++#serial 13 + + AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [ + AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1]) +diff --git a/src/io/gets_s.c b/src/io/gets_s.c +index 35f33039..02cb7032 100644 +--- a/src/io/gets_s.c ++++ b/src/io/gets_s.c +@@ -90,12 +90,12 @@ + * @retval int >0 when on successful operation, all the characters from src + * were appended to dest and the result in dest is null + * terminated. +- * @retval 0,errno=ESNULLP when dest is a NULL pointer +- * @retval 0,errno=ESZEROL when dmax = 0 +- * @retval 0,errno=ESLEMAX when dmax > RSIZE_MAX_STR +- * @retval 0,errno=EOVERFLOW when dmax > size of dest +- * @retval 0,errno=ESUNTERM endline or eof not encountered after storing +- * dmax-1 characters to dest. ++ * @retval errno=ESNULLP when dest is a NULL pointer ++ * @retval errno=ESZEROL when dmax = 0 ++ * @retval errno=ESLEMAX when dmax > RSIZE_MAX_STR ++ * @retval errno=EOVERFLOW when dmax > size of dest ++ * @retval errno=ESUNTERM endline or eof not encountered after storing ++ * dmax-1 characters to dest. + * + * @see + * scanf_s() diff --git a/meta-oe/recipes-core/safec/safec/0064-getenv_s-allow-dest-NULL-and-dmax-0.patch b/meta-oe/recipes-core/safec/safec/0064-getenv_s-allow-dest-NULL-and-dmax-0.patch new file mode 100644 index 000000000..67a1d3e29 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0064-getenv_s-allow-dest-NULL-and-dmax-0.patch @@ -0,0 +1,158 @@ +From b1441a77b3f50c8470e6e2a3f4c7632f8593528b Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Fri, 28 Jan 2022 15:43:49 +0100 +Subject: [PATCH] getenv_s: allow dest=NULL and dmax=0 + +Thanks to @ulatekh, GH #109 +--- + include/safe_lib.h | 2 +- + src/os/getenv_s.c | 27 +++++++++++++-------------- + tests/test_getenv_s.c | 21 +++++++++++++-------- + 3 files changed, 27 insertions(+), 23 deletions(-) + +diff --git a/include/safe_lib.h b/include/safe_lib.h +index 30e022e3..265a207d 100644 +--- a/include/safe_lib.h ++++ b/include/safe_lib.h +@@ -168,7 +168,7 @@ EXTERN struct tm *localtime_s(const time_t *restrict timer, + + EXTERN errno_t _getenv_s_chk(size_t *restrict len, char *restrict dest, + rsize_t dmax, const char *restrict name, +- const size_t destbos) BOS_CHK(dest) ++ const size_t destbos) BOS_CHK_BUTZERO(dest, dmax) + BOS_ATTR(_BOS_NULL(name), "empty name"); + #define getenv_s(len, dest, dmax, name) \ + _getenv_s_chk(len, dest, dmax, name, BOS(dest)) +diff --git a/src/os/getenv_s.c b/src/os/getenv_s.c +index 2d2158cb..abae4303 100644 +--- a/src/os/getenv_s.c ++++ b/src/os/getenv_s.c +@@ -2,8 +2,9 @@ + * getenv_s.c + * + * September 2017, Reini Urban ++ * January 2022, Reini Urban + * +- * Copyright (c) 2017 by Reini Urban ++ * Copyright (c) 2017,2022 by Reini Urban + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person +@@ -62,24 +63,22 @@ + * @param[out] len pointer to a size_t where getenv_s will store the length + * of the found environment variable. Might be NULL. + * @param[out] dest pointer to a string where getenv_s will store the +- * contents of the found environment variable. ++ * contents of the found environment variable. Might be NULL. + * @param[in] dmax maximum number of characters that getenv_s is allowed +- * to write to dest (size of the buffer). ++ * to write to dest (size of the buffer). Might be 0. + * @param[in] name null-terminated character string identifying the name of + * the environmental variable to look for. + * +- * @pre name and dest shall not be a null pointer. ++ * @pre name shall not be a null pointer. + * @pre dmax shall not be greater than RSIZE_MAX_STR and size of dest. +- * @pre dmax shall not equal zero. +- * @pre dmax shall be greater than the strlen of the returned env value. ++ * @pre dmax shall be 0 if dest is NULL or greater than the strlen of the returned env value. + * + * @return zero if the environment variable was found, non-zero if it was not + * found of if a runtime constrant violation occurred. On any error, +- * writes zero to *len (unless len is a null pointer). ++ * writes zero to *len, unless len is a null pointer. + * + * @retval EOK on success +- * @retval ESNULLP when dest or name are a NULL pointer +- * @retval ESZEROL when dmax = 0 ++ * @retval ESNULLP when name is a NULL pointer + * @retval ESLEMAX when dmax > RSIZE_MAX_STR + * @retval EOVERFLOW when dmax > size of dest (optionally, when the compiler + * knows the object_size statically) +@@ -98,10 +97,8 @@ EXPORT errno_t _getenv_s_chk(size_t *restrict len, char *restrict dest, + #endif + { + const char *buf; +- int len1; ++ size_t len1; + +- CHK_DEST_NULL("getenv_s") +- CHK_DMAX_ZERO("getenv_s") + if (destbos == BOS_UNKNOWN) { + CHK_DMAX_MAX("getenv_s", RSIZE_MAX_STR) + BND_CHK_PTR_BOUNDS(dest, dmax); +@@ -109,6 +106,8 @@ EXPORT errno_t _getenv_s_chk(size_t *restrict len, char *restrict dest, + CHK_DEST_OVR("getenv_s", destbos) + } + if (unlikely(name == NULL)) { ++ if (len) ++ *len = 0; + handle_error(dest, dmax, "getenv_s: name is null", ESNULLP); + return ESNULLP; + } +@@ -130,12 +129,12 @@ EXPORT errno_t _getenv_s_chk(size_t *restrict len, char *restrict dest, + } + + len1 = strlen(buf); +- if (unlikely((rsize_t)len1 >= dmax)) { ++ if (unlikely(dmax != 0 && len1 >= dmax)) { + if (len) + *len = 0; + handle_error(dest, dmax, "getenv_s: dmax is too small", ESNOSPC); + return RCNEGATE(ESNOSPC); +- } else { ++ } else if (dest) { + if (len) + *len = len1; + strcpy_s(dest, dmax, buf); +diff --git a/tests/test_getenv_s.c b/tests/test_getenv_s.c +index 3c7be785..4e36fa9b 100644 +--- a/tests/test_getenv_s.c ++++ b/tests/test_getenv_s.c +@@ -33,26 +33,26 @@ int test_getenv_s(void) { + /*--------------------------------------------------*/ + + #ifndef HAVE_CT_BOS_OVR +- EXPECT_BOS("empty dest") +- rc = getenv_s(&len, NULL, LEN, name); ++ EXPECT_BOS("empty name") ++ rc = getenv_s(&len, dest, LEN, NULL); + if (use_msvcrt && rc == ESNULLP) { + printf("safec.dll overriding msvcrt.dll\n"); + use_msvcrt = false; + } +- ERR_MSVC(ESNULLP, EINVAL); +- +- EXPECT_BOS("empty name") +- rc = getenv_s(&len, dest, LEN, NULL); + ERR_MSVC(ESNULLP, 0); ++#endif ++ ++ rc = getenv_s(&len, NULL, 0, name); ++ ERR_MSVC(0, EINVAL); + + /*--------------------------------------------------*/ + +- EXPECT_BOS("empty dest or dmax") + rc = getenv_s(&len, dest, 0, name); +- ERR_MSVC(ESZEROL, EINVAL); ++ ERR_MSVC(0, EINVAL); + + /*--------------------------------------------------*/ + ++#ifndef HAVE_CT_BOS_OVR + EXPECT_BOS("dest overflow") + rc = getenv_s(&len, dest, RSIZE_MAX_STR + 1, name); + ERR_MSVC(ESLEMAX, 0); +@@ -62,6 +62,11 @@ int test_getenv_s(void) { + + rc = getenv_s(&len, dest, 1, name); + ERR_MSVC(ESNOSPC, 34); ++ if (len != 0) { ++ printf("%s %u Error len=%u rc=%d \n", __FUNCTION__, __LINE__, ++ (unsigned)len, rc); ++ errs++; ++ } + + /*--------------------------------------------------*/ + diff --git a/meta-oe/recipes-core/safec/safec/0065-fixup-header-includes.patch b/meta-oe/recipes-core/safec/safec/0065-fixup-header-includes.patch new file mode 100644 index 000000000..e0c24dba5 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0065-fixup-header-includes.patch @@ -0,0 +1,104 @@ +From 9be9658cf33ff07bcb500075fd6404f070893556 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Fri, 28 Jan 2022 17:56:03 +0100 +Subject: [PATCH] fixup header includes + +--- + .github/workflows/main.yml | 3 ++- + Makefile.am | 6 +++--- + src/mem/mem_primitives_lib.h | 2 +- + src/mem/safe_mem_constraint.h | 2 +- + src/str/safe_str_constraint.h | 2 +- + tests/perf_memset_s.c | 2 +- + 6 files changed, 9 insertions(+), 8 deletions(-) + +diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml +index 69470a7e..559685cf 100644 +--- a/.github/workflows/main.yml ++++ b/.github/workflows/main.yml +@@ -13,6 +13,7 @@ jobs: + fail-fast: false + matrix: + CONF_ARGS: ++ - + - --disable-wchar + - --enable-unsafe --enable-norm-compat + - --enable-debug --enable-unsafe --enable-norm-compat --enable-gcov +@@ -42,7 +43,7 @@ jobs: + - if: matrix.CONF_ARGS == '' + name: Run make distcheck + run: | +- sudo apt-get -y install doxygen ++ sudo apt-get -y install doxygen wget perl + make distcheck + macOS: + name: macOS +diff --git a/Makefile.am b/Makefile.am +index 98b82982..bcf4de00 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -57,9 +57,9 @@ SAFEC_INFRA = \ + ${top_srcdir}/build-aux/msys2.bat \ + ${top_srcdir}/build-aux/smoke.sh \ + $(top_srcdir)/build-aux/version-gen.sh \ +- $(top_srcdir)/doc/libc-overview.md \ +- $(top_srcdir)/scripts \ +- $(top_srcdir)/.version \ ++ $(top_srcdir)/doc/libc-overview.md \ ++ $(top_srcdir)/scripts \ ++ $(top_srcdir)/.version \ + $(top_srcdir)/libsafec.pc.in + + SAFEC_GENHEADERS = \ +diff --git a/src/mem/mem_primitives_lib.h b/src/mem/mem_primitives_lib.h +index 347b3a2f..72365e4e 100644 +--- a/src/mem/mem_primitives_lib.h ++++ b/src/mem/mem_primitives_lib.h +@@ -35,7 +35,7 @@ + #define __MEM_PRIMITIVES_LIB_H__ + + #ifndef FOR_DOXYGEN +-#include "src/safeclib_private.h" ++#include "safeclib_private.h" + #endif + + #ifndef __KERNEL__ +diff --git a/src/mem/safe_mem_constraint.h b/src/mem/safe_mem_constraint.h +index 748af001..41346819 100644 +--- a/src/mem/safe_mem_constraint.h ++++ b/src/mem/safe_mem_constraint.h +@@ -35,7 +35,7 @@ + #ifdef FOR_DOXYGEN + #include "safe_mem_lib.h" + #else +-#include "src/safeclib_private.h" ++#include "safeclib_private.h" + #endif + + /* +diff --git a/src/str/safe_str_constraint.h b/src/str/safe_str_constraint.h +index 0a685185..19f1dd97 100644 +--- a/src/str/safe_str_constraint.h ++++ b/src/str/safe_str_constraint.h +@@ -35,7 +35,7 @@ + #ifdef FOR_DOXYGEN + #include "safe_str_lib.h" + #else +-#include "src/safeclib_private.h" ++#include "safeclib_private.h" + #endif + + /* +diff --git a/tests/perf_memset_s.c b/tests/perf_memset_s.c +index 303ad14e..ca89ceec 100644 +--- a/tests/perf_memset_s.c ++++ b/tests/perf_memset_s.c +@@ -28,7 +28,7 @@ + #include "safe_mem_lib.h" + #include "perf_private.h" + #undef debug_printf +-#include "src/mem/mem_primitives_lib.h" ++#include "mem/mem_primitives_lib.h" + + #if defined(TEST_MSVCRT) && defined(HAVE_MEMSET_S) + #undef memset_s diff --git a/meta-oe/recipes-core/safec/safec/0066-fixup-test_towfc_s-a-bit.patch b/meta-oe/recipes-core/safec/safec/0066-fixup-test_towfc_s-a-bit.patch new file mode 100644 index 000000000..f9bbd1045 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0066-fixup-test_towfc_s-a-bit.patch @@ -0,0 +1,34 @@ +From 9fbdac53fceb2241fb44d2f8829aec20a5d5718f Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Fri, 28 Jan 2022 18:06:53 +0100 +Subject: [PATCH] fixup test_towfc_s a bit + +--- + tests/test_towfc_s.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/tests/test_towfc_s.c b/tests/test_towfc_s.c +index 46795bd7..e378c91b 100644 +--- a/tests/test_towfc_s.c ++++ b/tests/test_towfc_s.c +@@ -111,7 +111,7 @@ int test_towfc_s(void) { + ERR(ESNOTFND); + if (n) { + printf("%s %u Error %d U+%04X n=%d 0x%x\n", +- __FUNCTION__, __LINE__, rc, wc, n, (int)cp); ++ __FUNCTION__, __LINE__, rc, wc, n, (unsigned)cp); + errs++; + } + } +@@ -212,9 +212,9 @@ int test_towfc_s(void) { + status, name); + } else if (cp != m0) { + errs++; +- printf("%s %u Error: towfc(U+%04X) => %X \"%s\" " ++ printf("%s %u Error: towfc(U+%04X) => %X != %X \"%s\" " + "status=%s %s\n", +- __FUNCTION__, __LINE__, wc, cp, mapping, status, ++ __FUNCTION__, __LINE__, wc, cp, m0, mapping, status, + name); + } + } diff --git a/meta-oe/recipes-core/safec/safec/0067-export-SAFECLIB_UNICODE_VERSION-13.patch b/meta-oe/recipes-core/safec/safec/0067-export-SAFECLIB_UNICODE_VERSION-13.patch new file mode 100644 index 000000000..20207c295 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0067-export-SAFECLIB_UNICODE_VERSION-13.patch @@ -0,0 +1,152 @@ +From 815a26260504f32c5f053ab53830b3a9dccea99a Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Fri, 28 Jan 2022 18:28:23 +0100 +Subject: [PATCH] export SAFECLIB_UNICODE_VERSION 13 + +and adjust tests. we are at 15 already (!), latest perl5.35 just at 14 +--- + ChangeLog | 3 +++ + include/safe_str_lib.h | 3 +++ + tests/test_towfc_s.c | 2 +- + tests/test_towlower.c | 2 +- + tests/test_towupper.c | 11 +++++------ + tests/test_wcsfc_s.c | 6 +++--- + tests/test_wcsnorm_s.c | 4 ++-- + 7 files changed, 18 insertions(+), 13 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index 9e0e9d47..d456cc76 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -3,6 +3,9 @@ + + Changes in 3.7.0 + - Switched to proper semantic versioning for upstream packagers. ++ - Fixed getenv_s to allow dest=NULL or dmax=0 as in the spec. (GH #109) ++ - Updated to Unicode 13 (tested against perl 5.34) ++ export define SAFECLIB_UNICODE_VERSION 13 + - Added stpcpy_s and stpncpy_s as in the Intel safestringlib fork. + - Added our own portable implementation of the family of printf_s + functions. This make the results and errno sideeffects more predictable. +diff --git a/include/safe_str_lib.h b/include/safe_str_lib.h +index 9f5a85ef..b5680fde 100644 +--- a/include/safe_str_lib.h ++++ b/include/safe_str_lib.h +@@ -66,6 +66,9 @@ extern "C" { + #define EXTERN extern + #endif + ++/* With this UCD version we generated our tables */ ++#define SAFECLIB_UNICODE_VERSION 13 ++ + /** + * The shortest string is a null string!! + */ +diff --git a/tests/test_towfc_s.c b/tests/test_towfc_s.c +index e378c91b..a7ac808f 100644 +--- a/tests/test_towfc_s.c ++++ b/tests/test_towfc_s.c +@@ -67,7 +67,7 @@ int test_towfc_s(void) { + if (!f) { + printf("downloading %s ...", CFOLD); + fflush(stdout); +- system("wget ftp://ftp.unicode.org/Public/UNIDATA/CaseFolding.txt") ++ system("wget https://www.unicode.org/Public/13.0.0/ucd/CaseFolding.txt") + ? printf(" done\n") + : printf(" failed\n"); + f = fopen(CFOLD, "r"); +diff --git a/tests/test_towlower.c b/tests/test_towlower.c +index 49b9a26c..e4a496d4 100644 +--- a/tests/test_towlower.c ++++ b/tests/test_towlower.c +@@ -38,7 +38,7 @@ int test_towlower(void) { + if (!f) { + printf("downloading %s ...", CFOLD); + fflush(stdout); +- system("wget ftp://ftp.unicode.org/Public/UNIDATA/CaseFolding.txt") ++ system("wget https://www.unicode.org/Public/13.0.0/ucd/CaseFolding.txt") + ? printf(" done\n") + : printf(" failed\n"); + printf(" done\n"); +diff --git a/tests/test_towupper.c b/tests/test_towupper.c +index 5d3531b6..b47be8e4 100644 +--- a/tests/test_towupper.c ++++ b/tests/test_towupper.c +@@ -29,11 +29,11 @@ int test_towupper(void); + #define CFOLD "CaseFolding.txt" + #ifndef PERL + /* Must have the same Unicode version 9.0, at least 5.26. +- Better 5.27.3 with Unicode 10, 5.30 with 12.1, 5.32 with 13.0 ++ Better 5.27.3 with Unicode 10, 5.30 with 12.1, 5.32 with 13.0, 5.34 with 14.0 + */ + /*# define PERL "perl" */ +-/*# define PERL "cperl5.27.2"*/ +-#define PERL "perl5.32" ++/*# define PERL "cperl5.30.0"*/ ++#define PERL "perl5.34.0" + #endif + #define TESTPL "test-upr.pl" + +@@ -154,8 +154,7 @@ int test_towupper(void) { + if (!f) { + printf("downloading %s ...", GENCAT); + fflush(stdout); +- if (system("wget " +- "ftp://ftp.unicode.org/Public/UNIDATA/extracted/" ++ if (system("wget https://www.unicode.org/Public/13.0.0/ucd/extracted/" + "DerivedGeneralCategory.txt")) + printf(" done\n"); + else +@@ -167,7 +166,7 @@ int test_towupper(void) { + if (!cf) { + printf("downloading %s ...", CFOLD); + fflush(stdout); +- if (system("wget ftp://ftp.unicode.org/Public/UNIDATA/CaseFolding.txt")) ++ if (system("wget https://www.unicode.org/Public/13.0.0/ucd/CaseFolding.txt")) + printf(" done\n"); + else + printf(" failed\n"); +diff --git a/tests/test_wcsfc_s.c b/tests/test_wcsfc_s.c +index f81c5113..49e429d0 100644 +--- a/tests/test_wcsfc_s.c ++++ b/tests/test_wcsfc_s.c +@@ -18,13 +18,13 @@ int test_wcsfc_s(void); + + #define PERL_TEST + /* Must have the same Unicode version 9.0, at least 5.26. +- Better 5.27.3 with Unicode 10, 5.30 with 12.1, 5.32 with 13.0 ++ Better 5.27.3 with Unicode 10, 5.30 with 12.1, 5.32, 5.36 with 14.0 + perl -MUnicode::UCD -e'print Unicode::UCD::UnicodeVersion()' + */ + #ifndef PERL + /*# define PERL "perl"*/ + /*# define PERL "cperl5.30.0"*/ +-#define PERL "perl5.32" ++#define PERL "perl5.34.0" + #endif + #define TESTPL "test-fc.pl" + +@@ -440,7 +440,7 @@ int test_wcsfc_s(void) { + /* see if we can lower-case and decompose all */ + #ifdef PERL_TEST + fprintf_s(pl, +- "use v5.27.2;\nno warnings;\nuse Unicode::Normalize;\nmy $err;" ++ "use v5.34;\nno warnings;\nuse Unicode::Normalize;\nmy $err;" + "sub wstr ($) {\n" + " join('',map{sprintf'\\x{%%X}',$_} unpack 'W*',shift);\n" + "}\n" +diff --git a/tests/test_wcsnorm_s.c b/tests/test_wcsnorm_s.c +index 44e71177..4219ae1c 100644 +--- a/tests/test_wcsnorm_s.c ++++ b/tests/test_wcsnorm_s.c +@@ -28,8 +28,8 @@ int test_wcsnorm_s(void); + */ + #ifndef PERL + /*# define PERL "perl" */ +-/*# define PERL "cperl5.29.2" */ +-#define PERL "perl5.32" ++/*# define PERL "cperl5.30.0" */ ++#define PERL "perl5.34.0" + #endif + #define TESTPL "test-norm.pl" + diff --git a/meta-oe/recipes-core/safec/safec/0068-update-to-Unicode-14.patch b/meta-oe/recipes-core/safec/safec/0068-update-to-Unicode-14.patch new file mode 100644 index 000000000..caba43c9b --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0068-update-to-Unicode-14.patch @@ -0,0 +1,10124 @@ +From 838c640ecc7d3e8ee69fa155a07cf2aa816737bb Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Fri, 28 Jan 2022 18:50:06 +0100 +Subject: [PATCH] update to Unicode 14 + +--- + .gitignore | 4 + + ChangeLog | 4 +- + include/safe_str_lib.h | 2 +- + src/extwchar/towctrans.c | 10 +- + src/extwchar/towfc_s.c | 121 +- + src/extwchar/unw16ifcan.h | 2 +- + src/extwchar/unw16ifcmb.h | 24 +- + src/extwchar/unw16ifcmp.h | 2 +- + src/extwchar/unw16ifcpt.h | 1540 +++++------ + src/extwchar/unw16ifexc.h | 2 +- + src/extwchar/unwifcan.h | 2 +- + src/extwchar/unwifcmb.h | 24 +- + src/extwchar/unwifcmp.h | 2 +- + src/extwchar/unwifcpt.h | 1323 +++++----- + src/extwchar/unwifexc.h | 2 +- + tests/CaseFolding.txt | 1584 ------------ + tests/DerivedGeneralCategory.txt | 4100 ------------------------------ + tests/Makefile.am | 2 +- + tests/test_towfc_s.c | 17 +- + tests/test_towlower.c | 2 +- + tests/test_towupper.c | 6 +- + tests/test_wcsfc_s.c | 2 +- + tests/test_wcsnorm_s.c | 2 +- + 23 files changed, 1579 insertions(+), 7200 deletions(-) + delete mode 100644 tests/CaseFolding.txt + delete mode 100644 tests/DerivedGeneralCategory.txt + +diff --git a/.gitignore b/.gitignore +index 893dd74d..32975b6a 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -75,6 +75,8 @@ tests/test-suite*.log + tests/test-fc.pl + tests/test-norm.pl + tests/test-upr.pl ++tests/CaseFolding.txt ++tests/DerivedGeneralCategory.txt + Doxyfile + doc/footer + doc/html +@@ -82,6 +84,8 @@ doc/man + src/gcov.log + tests/gcov.log + src/Scripts.txt ++# generated for u8 ++src/extwchar/un8if*.h + + # + # Debian directory (make deb-pkg) +diff --git a/ChangeLog b/ChangeLog +index d456cc76..8c537aa1 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -4,8 +4,8 @@ + Changes in 3.7.0 + - Switched to proper semantic versioning for upstream packagers. + - Fixed getenv_s to allow dest=NULL or dmax=0 as in the spec. (GH #109) +- - Updated to Unicode 13 (tested against perl 5.34) +- export define SAFECLIB_UNICODE_VERSION 13 ++ - Updated to Unicode 14 (tested against perl 5.35.7) ++ export define SAFECLIB_UNICODE_VERSION 14 + - Added stpcpy_s and stpncpy_s as in the Intel safestringlib fork. + - Added our own portable implementation of the family of printf_s + functions. This make the results and errno sideeffects more predictable. +diff --git a/include/safe_str_lib.h b/include/safe_str_lib.h +index b5680fde..5486ceb5 100644 +--- a/include/safe_str_lib.h ++++ b/include/safe_str_lib.h +@@ -67,7 +67,7 @@ extern "C" { + #endif + + /* With this UCD version we generated our tables */ +-#define SAFECLIB_UNICODE_VERSION 13 ++#define SAFECLIB_UNICODE_VERSION 14 + + /** + * The shortest string is a null string!! +diff --git a/src/extwchar/towctrans.c b/src/extwchar/towctrans.c +index dfa36aeb..cd9fdc8d 100644 +--- a/src/extwchar/towctrans.c ++++ b/src/extwchar/towctrans.c +@@ -39,7 +39,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + { (u1), (l) - (u1), (u2) - (u1) + 1 } + #define CASELACE(u1, u2) CASEMAP((u1), (u2), (u1) + 1) + +-/* Unicode 13.0 */ ++/* Unicode 14.0 */ + + /* must be sorted */ + static const struct { +@@ -113,7 +113,8 @@ static const struct { + + CASEMAP(0x2160, 0x216f, 0x2170), + CASEMAP(0x24b6, 0x24cf, 0x24d0), +- CASEMAP(0x2c00, 0x2c2e, 0x2c30), ++ CASEMAP(0x2c00, 0x2c2f, 0x2c30), ++ + CASELACE(0x2c67, 0x2c6b), + CASELACE(0x2c80, 0x2ce2), + CASELACE(0x2ceb, 0x2ced), +@@ -131,9 +132,13 @@ static const struct { + CASELACE(0xa796, 0xa79e), + CASELACE(0xa7a0, 0xa7a8), + CASELACE(0xa7b4, 0xa7be), /* Unicode 8,12 */ ++ CASELACE(0xa7c0, 0xa7c1), /* Unicode 14 */ + CASELACE(0xa7c2, 0xa7c3), /* Unicode 12 */ + CASELACE(0xa7c7, 0xa7c8), /* Unicode 13 */ + CASELACE(0xa7c9, 0xa7ca), /* Unicode 13 */ ++ CASELACE(0xa7d0, 0xa7d1), /* Unicode 14 */ ++ CASELACE(0xa7d6, 0xa7d7), /* Unicode 14 */ ++ CASELACE(0xa7d8, 0xa7d9), /* Unicode 14 */ + CASELACE(0xa7f5, 0xa7f6), /* Unicode 13 */ + + CASEMAP(0xff21, 0xff3a, 0xff41), +@@ -150,6 +155,7 @@ static const struct { + CASEMAP(0xab70, 0xabbf, 0x13a0), /* CHEROKEE */ + CASEMAP(0x10400, 0x10427, 0x10428), + CASEMAP(0x104b0, 0x104d3, 0x104d8), /* Unicode 9 */ ++ CASEMAP(0x10570, 0x10595, 0x10597), /* Unicode 14 */ + CASEMAP(0x10c80, 0x10cb2, 0x10cc0), /* Unicode 8 */ + CASEMAP(0x118a0, 0x118bf, 0x118c0), /* Unicode 7 */ + CASEMAP(0x16e40, 0x16e5f, 0x16e60), /* MEDEFAIDRIN reverse (Unicode 11) */ +diff --git a/src/extwchar/towfc_s.c b/src/extwchar/towfc_s.c +index baabde42..2e31c430 100644 +--- a/src/extwchar/towfc_s.c ++++ b/src/extwchar/towfc_s.c +@@ -2,8 +2,9 @@ + * towfc_s.c + * + * September 2017, Reini Urban ++ * January 2022, Reini Urban + * +- * Copyright (c) 2017 by Reini Urban ++ * Copyright (c) 2017,2022 by Reini Urban + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person +@@ -42,14 +43,14 @@ + * \b iswfc() checks the uppercase character for a mapping to foldcase, + * returning the number of new wide character codepoints needed. + * The usual \c iswupper(wc) case returns 1, and the special 104 full +- * folding cases as specified in Unicode 10.0 \c CaseFolding.txt return either +- * 2 or 3. ++ * folding cases as specified in Unicode 10.0 \c CaseFolding.txt return either ++ * 2 or 3. This implements Unicode 14.0 + * + * @param[in] wc unicode character codepoint + * + * @retval 0 when there is no corresponding lowercase mapping. + * @retval 1 when there is a corresponding common or simple foldcase +- * mapping. ++ * mapping. + * @retval 2 a full case-folding expands to 2 characters + * @retval 3 a full case-folding expands to 3 characters + * +@@ -68,6 +69,7 @@ static const struct { + unsigned short lower1; + unsigned short lower2; + } tbl2[] = { ++ // clang-format off + {0x00DF, 0x0073, 0x0073}, /* LATIN SMALL LETTER SHARP S => ss */ + {0x0130, 0x0069, 0x0307}, /* LATIN CAPITAL LETTER I WITH DOT ABOVE */ + {0x0149, 0x02BC, 0x006E}, /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */ +@@ -81,10 +83,8 @@ static const struct { + {0x1E9E, 0x0073, 0x0073}, /* LATIN CAPITAL LETTER SHARP S => ss */ + {0x1F50, 0x03C5, 0x0313}, /* GREEK SMALL LETTER UPSILON WITH PSILI */ + /* the following folding mappings need to be normalized to NFD */ +- {0x1F80, 0x1F00, +- 0x03B9}, /* GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI */ +- {0x1F81, 0x1F01, +- 0x03B9}, /* GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI */ ++ {0x1F80, 0x1F00, 0x03B9}, /* GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI */ ++ {0x1F81, 0x1F01, 0x03B9}, /* GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI */ + {0x1F82, 0x1F02, 0x03B9}, /* GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA + AND YPOGEGRAMMENI */ + {0x1F83, 0x1F03, 0x03B9}, /* GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA +@@ -97,10 +97,8 @@ static const struct { + PERISPOMENI AND YPOGEGRAMMENI */ + {0x1F87, 0x1F07, 0x03B9}, /* GREEK SMALL LETTER ALPHA WITH DASIA AND + PERISPOMENI AND YPOGEGRAMMENI */ +- {0x1F88, 0x1F00, +- 0x03B9}, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI */ +- {0x1F89, 0x1F01, +- 0x03B9}, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI */ ++ {0x1F88, 0x1F00, 0x03B9}, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI */ ++ {0x1F89, 0x1F01, 0x03B9}, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI */ + {0x1F8A, 0x1F02, 0x03B9}, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND + VARIA AND PROSGEGRAMMENI */ + {0x1F8B, 0x1F03, 0x03B9}, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND +@@ -113,10 +111,8 @@ static const struct { + PERISPOMENI AND PROSGEGRAMMENI */ + {0x1F8F, 0x1F07, 0x03B9}, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND + PERISPOMENI AND PROSGEGRAMMENI */ +- {0x1F90, 0x1F20, +- 0x03B9}, /* GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI */ +- {0x1F91, 0x1F21, +- 0x03B9}, /* GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI */ ++ {0x1F90, 0x1F20, 0x03B9}, /* GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI */ ++ {0x1F91, 0x1F21, 0x03B9}, /* GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI */ + {0x1F92, 0x1F22, 0x03B9}, /* GREEK SMALL LETTER ETA WITH PSILI AND VARIA + AND YPOGEGRAMMENI */ + {0x1F93, 0x1F23, 0x03B9}, /* GREEK SMALL LETTER ETA WITH DASIA AND VARIA +@@ -129,10 +125,8 @@ static const struct { + PERISPOMENI AND YPOGEGRAMMENI */ + {0x1F97, 0x1F27, 0x03B9}, /* GREEK SMALL LETTER ETA WITH DASIA AND + PERISPOMENI AND YPOGEGRAMMENI */ +- {0x1F98, 0x1F20, +- 0x03B9}, /* GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI */ +- {0x1F99, 0x1F21, +- 0x03B9}, /* GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI */ ++ {0x1F98, 0x1F20, 0x03B9}, /* GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI */ ++ {0x1F99, 0x1F21, 0x03B9}, /* GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI */ + {0x1F9A, 0x1F22, 0x03B9}, /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA + AND PROSGEGRAMMENI */ + {0x1F9B, 0x1F23, 0x03B9}, /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA +@@ -145,10 +139,8 @@ static const struct { + PERISPOMENI AND PROSGEGRAMMENI */ + {0x1F9F, 0x1F27, 0x03B9}, /* GREEK CAPITAL LETTER ETA WITH DASIA AND + PERISPOMENI AND PROSGEGRAMMENI */ +- {0x1FA0, 0x1F60, +- 0x03B9}, /* GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI */ +- {0x1FA1, 0x1F61, +- 0x03B9}, /* GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI */ ++ {0x1FA0, 0x1F60, 0x03B9}, /* GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI */ ++ {0x1FA1, 0x1F61, 0x03B9}, /* GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI */ + {0x1FA2, 0x1F62, 0x03B9}, /* GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA + AND YPOGEGRAMMENI */ + {0x1FA3, 0x1F63, 0x03B9}, /* GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA +@@ -161,10 +153,8 @@ static const struct { + PERISPOMENI AND YPOGEGRAMMENI */ + {0x1FA7, 0x1F67, 0x03B9}, /* GREEK SMALL LETTER OMEGA WITH DASIA AND + PERISPOMENI AND YPOGEGRAMMENI */ +- {0x1FA8, 0x1F60, +- 0x03B9}, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI */ +- {0x1FA9, 0x1F61, +- 0x03B9}, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI */ ++ {0x1FA8, 0x1F60, 0x03B9}, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI */ ++ {0x1FA9, 0x1F61, 0x03B9}, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI */ + {0x1FAA, 0x1F62, 0x03B9}, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND + VARIA AND PROSGEGRAMMENI */ + {0x1FAB, 0x1F63, 0x03B9}, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND +@@ -177,33 +167,25 @@ static const struct { + PERISPOMENI AND PROSGEGRAMMENI */ + {0x1FAF, 0x1F67, 0x03B9}, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND + PERISPOMENI AND PROSGEGRAMMENI */ +- {0x1FB2, 0x1F70, +- 0x03B9}, /* GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI */ ++ {0x1FB2, 0x1F70, 0x03B9}, /* GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI */ + {0x1FB3, 0x03B1, 0x03B9}, /* GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI */ +- {0x1FB4, 0x03AC, +- 0x03B9}, /* GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI */ ++ {0x1FB4, 0x03AC, 0x03B9}, /* GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI */ + {0x1FB6, 0x03B1, 0x0342}, /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI */ +- {0x1FBC, 0x03B1, +- 0x03B9}, /* GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI */ +- {0x1FC2, 0x1F74, +- 0x03B9}, /* GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI */ ++ {0x1FBC, 0x03B1, 0x03B9}, /* GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI */ ++ {0x1FC2, 0x1F74, 0x03B9}, /* GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI */ + {0x1FC3, 0x03B7, 0x03B9}, /* GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI */ +- {0x1FC4, 0x03AE, +- 0x03B9}, /* GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI */ ++ {0x1FC4, 0x03AE, 0x03B9}, /* GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI */ + {0x1FC6, 0x03B7, 0x0342}, /* GREEK SMALL LETTER ETA WITH PERISPOMENI */ + {0x1FCC, 0x03B7, 0x03B9}, /* GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI */ + {0x1FD6, 0x03B9, 0x0342}, /* GREEK SMALL LETTER IOTA WITH PERISPOMENI */ + {0x1FE4, 0x03C1, 0x0313}, /* GREEK SMALL LETTER RHO WITH PSILI */ + {0x1FE6, 0x03C5, 0x0342}, /* GREEK SMALL LETTER UPSILON WITH PERISPOMENI */ +- {0x1FF2, 0x1F7C, +- 0x03B9}, /* GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI */ ++ {0x1FF2, 0x1F7C, 0x03B9}, /* GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI */ + {0x1FF3, 0x03C9, 0x03B9}, /* GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI */ +- {0x1FF4, 0x03CE, +- 0x03B9}, /* GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI */ ++ {0x1FF4, 0x03CE, 0x03B9}, /* GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI */ + /* eof nfd */ + {0x1FF6, 0x03C9, 0x0342}, /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI */ +- {0x1FFC, 0x03C9, +- 0x03B9}, /* GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI */ ++ {0x1FFC, 0x03C9, 0x03B9}, /* GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI */ + {0xFB00, 0x0066, 0x0066}, /* LATIN SMALL LIGATURE FF */ + {0xFB01, 0x0066, 0x0069}, /* LATIN SMALL LIGATURE FI */ + {0xFB02, 0x0066, 0x006C}, /* LATIN SMALL LIGATURE FL */ +@@ -214,7 +196,9 @@ static const struct { + {0xFB15, 0x0574, 0x056B}, /* ARMENIAN SMALL LIGATURE MEN INI */ + {0xFB16, 0x057E, 0x0576}, /* ARMENIAN SMALL LIGATURE VEW NOW */ + {0xFB17, 0x0574, 0x056D}, /* ARMENIAN SMALL LIGATURE MEN XEH */ +- {0, 0, 0}}; ++ {0, 0, 0} ++ // clang-format on ++}; + + static const struct { + unsigned short upper; +@@ -222,37 +206,26 @@ static const struct { + unsigned short lower2; + unsigned short lower3; + } tbl3[] = { +- {0x0390, 0x03B9, 0x0308, +- 0x0301}, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ +- {0x03B0, 0x03C5, 0x0308, +- 0x0301}, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ +- {0x1F52, 0x03C5, 0x0313, +- 0x0300}, /* GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA */ +- {0x1F54, 0x03C5, 0x0313, +- 0x0301}, /* GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA */ +- {0x1F56, 0x03C5, 0x0313, +- 0x0342}, /* GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI */ +- {0x1FB7, 0x03B1, 0x0342, +- 0x03B9}, /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI */ +- {0x1FC7, 0x03B7, 0x0342, +- 0x03B9}, /* GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI */ +- {0x1FD2, 0x03B9, 0x0308, +- 0x0300}, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA */ +- {0x1FD3, 0x03B9, 0x0308, +- 0x0301}, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */ +- {0x1FD7, 0x03B9, 0x0308, +- 0x0342}, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI */ +- {0x1FE2, 0x03C5, 0x0308, +- 0x0300}, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA */ +- {0x1FE3, 0x03C5, 0x0308, +- 0x0301}, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */ +- {0x1FE7, 0x03C5, 0x0308, +- 0x0342}, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI */ +- {0x1FF7, 0x03C9, 0x0342, +- 0x03B9}, /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI */ ++ // clang-format off ++ {0x0390, 0x03B9, 0x0308, 0x0301}, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ ++ {0x03B0, 0x03C5, 0x0308, 0x0301}, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ ++ {0x1F52, 0x03C5, 0x0313, 0x0300}, /* GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA */ ++ {0x1F54, 0x03C5, 0x0313, 0x0301}, /* GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA */ ++ {0x1F56, 0x03C5, 0x0313, 0x0342}, /* GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI */ ++ {0x1FB7, 0x03B1, 0x0342, 0x03B9}, /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI */ ++ {0x1FC7, 0x03B7, 0x0342, 0x03B9}, /* GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI */ ++ {0x1FD2, 0x03B9, 0x0308, 0x0300}, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA */ ++ {0x1FD3, 0x03B9, 0x0308, 0x0301}, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */ ++ {0x1FD7, 0x03B9, 0x0308, 0x0342}, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI */ ++ {0x1FE2, 0x03C5, 0x0308, 0x0300}, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA */ ++ {0x1FE3, 0x03C5, 0x0308, 0x0301}, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */ ++ {0x1FE7, 0x03C5, 0x0308, 0x0342}, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI */ ++ {0x1FF7, 0x03C9, 0x0342, 0x03B9}, /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI */ + {0xFB03, 0x0066, 0x0066, 0x0069}, /* LATIN SMALL LIGATURE FFI */ + {0xFB04, 0x0066, 0x0066, 0x006C}, /* LATIN SMALL LIGATURE FFL */ +- {0, 0, 0, 0}}; ++ {0, 0, 0, 0} ++ // clang-format on ++}; + + /* Return the number of wide lower-case characters needed to full fold-case + the given uppercase character. Returns 0, 1, 2 or 3. +diff --git a/src/extwchar/unw16ifcan.h b/src/extwchar/unw16ifcan.h +index 77f8c1ea..5b7029d5 100644 +--- a/src/extwchar/unw16ifcan.h ++++ b/src/extwchar/unw16ifcan.h +@@ -2,7 +2,7 @@ + * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! + * This file is auto-generated by Unicode-Normalize 1.27 + * mkheader -uni -ind -std +- * for Unicode 13.0.0 UTF-16 ++ * for Unicode 14.0.0 UTF-16 + * Any changes here will be lost! + */ + /* Canonical Decomposition */ +diff --git a/src/extwchar/unw16ifcmb.h b/src/extwchar/unw16ifcmb.h +index 629d730a..68fef127 100644 +--- a/src/extwchar/unw16ifcmb.h ++++ b/src/extwchar/unw16ifcmb.h +@@ -2,7 +2,7 @@ + * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! + * This file is auto-generated by Unicode-Normalize 1.27 + * mkheader -uni -ind -std +- * for Unicode 13.0.0 UTF-16 ++ * for Unicode 14.0.0 UTF-16 + * Any changes here will be lost! + */ + /* CombiningClass */ +@@ -202,14 +202,14 @@ static const uint8_t UNWIF_combin_00_08 [256] = { + /* 0880 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0888 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0890 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 0898 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 0898 */ 230, 220, 220, 220, 230, 230, 230, 230, + /* 08a0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 08a8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 08b0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 08b8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 08c0 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 08c8 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 08d0 */ 0, 0, 0, 220, 230, 230, 230, 230, ++/* 08c8 */ 0, 0, 230, 230, 230, 230, 230, 220, ++/* 08d0 */ 220, 220, 220, 220, 230, 230, 230, 230, + /* 08d8 */ 230, 230, 230, 230, 230, 230, 230, 230, + /* 08e0 */ 230, 230, 0, 220, 230, 230, 220, 230, + /* 08e8 */ 230, 220, 230, 230, 230, 220, 220, 220, +@@ -330,7 +330,7 @@ static const uint8_t UNWIF_combin_00_0c [256] = { + /* 0c20 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0c28 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0c30 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 0c38 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 0c38 */ 0, 0, 0, 0, 7, 0, 0, 0, + /* 0c40 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0c48 */ 0, 0, 0, 0, 0, 9, 0, 0, + /* 0c50 */ 0, 0, 0, 0, 0, 84, 91, 0, +@@ -535,7 +535,7 @@ static const uint8_t UNWIF_combin_00_13 [256] = { + static const uint8_t UNWIF_combin_00_17 [256] = { + /* 1700 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1708 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 1710 */ 0, 0, 0, 0, 9, 0, 0, 0, ++/* 1710 */ 0, 0, 0, 0, 9, 9, 0, 0, + /* 1718 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1720 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1728 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -662,8 +662,8 @@ static const uint8_t UNWIF_combin_00_1a [256] = { + /* 1aa8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1ab0 */ 230, 230, 230, 230, 230, 220, 220, 220, + /* 1ab8 */ 220, 220, 220, 230, 230, 220, 0, 220, +-/* 1ac0 */ 220, 0, 0, 0, 0, 0, 0, 0, +-/* 1ac8 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 1ac0 */ 220, 230, 230, 220, 220, 230, 230, 230, ++/* 1ac8 */ 230, 230, 220, 230, 230, 230, 230, 0, + /* 1ad0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1ad8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1ae0 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -774,7 +774,7 @@ static const uint8_t UNWIF_combin_00_1d [256] = { + /* 1de0 */ 230, 230, 230, 230, 230, 230, 230, 230, + /* 1de8 */ 230, 230, 230, 230, 230, 230, 230, 230, + /* 1df0 */ 230, 230, 230, 230, 230, 230, 232, 228, +-/* 1df8 */ 228, 220, 0, 230, 233, 220, 230, 220 ++/* 1df8 */ 228, 220, 218, 230, 233, 220, 230, 220 + }; + + static const uint8_t UNWIF_combin_00_20 [256] = { +@@ -1389,7 +1389,7 @@ static const uint8_t UNWIF_combin_01_0f [256] = { + /* 010f68 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 010f70 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 010f78 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 010f80 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010f80 */ 0, 0, 230, 220, 230, 220, 0, 0, + /* 010f88 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 010f90 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 010f98 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1422,7 +1422,7 @@ static const uint8_t UNWIF_combin_01_10 [256] = { + /* 011058 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 011060 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 011068 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 011070 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 011070 */ 9, 0, 0, 0, 0, 0, 0, 0, + /* 011078 */ 0, 0, 0, 0, 0, 0, 0, 9, + /* 011080 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 011088 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -2164,7 +2164,7 @@ static const uint8_t UNWIF_combin_01_e2 [256] = { + /* 01e290 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 01e298 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 01e2a0 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 01e2a8 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 01e2a8 */ 0, 0, 0, 0, 0, 0, 230, 0, + /* 01e2b0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 01e2b8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 01e2c0 */ 0, 0, 0, 0, 0, 0, 0, 0, +diff --git a/src/extwchar/unw16ifcmp.h b/src/extwchar/unw16ifcmp.h +index ed7acca1..768c9439 100644 +--- a/src/extwchar/unw16ifcmp.h ++++ b/src/extwchar/unw16ifcmp.h +@@ -2,7 +2,7 @@ + * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! + * This file is auto-generated by Unicode-Normalize 1.27 + * mkheader -uni -ind -std +- * for Unicode 13.0.0 UTF-16 ++ * for Unicode 14.0.0 UTF-16 + * Any changes here will be lost! + */ + /* Composition */ +diff --git a/src/extwchar/unw16ifcpt.h b/src/extwchar/unw16ifcpt.h +index 1a7ce186..751fb4c4 100644 +--- a/src/extwchar/unw16ifcpt.h ++++ b/src/extwchar/unw16ifcpt.h +@@ -2,7 +2,7 @@ + * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! + * This file is auto-generated by Unicode-Normalize 1.27 + * mkheader -uni -ind -std +- * for Unicode 13.0.0 UTF-16 ++ * for Unicode 14.0.0 UTF-16 + * Any changes here will be lost! + */ + /* Compat. Decomposition */ +@@ -12,9 +12,9 @@ + + #undef NORMALIZE_IND_TBL + #define NORMALIZE_IND_TBL +-/* tbl sizes: (1556,1286,629,126,16,23,1,1,,,,,,,,,,1) */ ++/* tbl sizes: (1604,1292,629,126,16,23,1,1,,,,,,,,,,1) */ + /* l: 1-18 */ +-/* max size: 1556 0x614 */ ++/* max size: 1604 0x644 */ + #define UNWIF_compat_MAXLEN 5 + #define TBL(i) ((i-1) << 11) + /* value = (const wchar_t*)&UNWIF_compat_tbl[LEN-1][IDX] */ +@@ -23,7 +23,7 @@ + #define UNWIF_compat_PLANE_T uint16_t + + /* the values */ +-static const wchar_t UNWIF_compat_tbl_1 [1556][1] = { ++static const wchar_t UNWIF_compat_tbl_1 [1604][1] = { + /* 0 */ {L'('}, {L')'}, {L'*'}, {L'+'}, {L','}, {L'-'}, {L'.'}, {L'/'}, + /* 8 */ {L'0'}, {L'1'}, {L'2'}, {L'3'}, {L'4'}, {L'5'}, {L'6'}, {L'7'}, + /* 16 */ {L'8'}, {L'9'}, {L':'}, {L';'}, {L'<'}, {L'='}, {L'>'}, {L'?'}, +@@ -32,195 +32,201 @@ static const wchar_t UNWIF_compat_tbl_1 [1556][1] = { + /* 40 */ {L'P'}, {L'Q'}, {L'R'}, {L'S'}, {L'T'}, {L'U'}, {L'V'}, {L'W'}, + /* 48 */ {L'X'}, {L'Y'}, {L'Z'}, {L'['}, {L'\x0020'}, {L'\x0021'}, {L'\x0022'}, {L'\x0023'}, + /* 56 */ {L'\x0024'}, {L'\x0025'}, {L'\x0026'}, {L'\x0027'}, {L'\x005c'}, {L'\x00a2'}, {L'\x00a3'}, {L'\x00a5'}, +- /* 64 */ {L'\x00a6'}, {L'\x00ac'}, {L'\x00b7'}, {L'\x00c6'}, {L'\x00f0'}, {L'\x0126'}, {L'\x0127'}, {L'\x0131'}, +- /* 72 */ {L'\x014b'}, {L'\x0153'}, {L'\x018e'}, {L'\x0190'}, {L'\x01ab'}, {L'\x0222'}, {L'\x0237'}, {L'\x0250'}, +- /* 80 */ {L'\x0251'}, {L'\x0252'}, {L'\x0254'}, {L'\x0255'}, {L'\x0259'}, {L'\x025b'}, {L'\x025c'}, {L'\x025f'}, +- /* 88 */ {L'\x0261'}, {L'\x0263'}, {L'\x0265'}, {L'\x0266'}, {L'\x0268'}, {L'\x0269'}, {L'\x026a'}, {L'\x026b'}, +- /* 96 */ {L'\x026d'}, {L'\x026f'}, {L'\x0270'}, {L'\x0271'}, {L'\x0272'}, {L'\x0273'}, {L'\x0274'}, {L'\x0275'}, +- /* 104 */ {L'\x0278'}, {L'\x0279'}, {L'\x027b'}, {L'\x0281'}, {L'\x0282'}, {L'\x0283'}, {L'\x0289'}, {L'\x028a'}, +- /* 112 */ {L'\x028b'}, {L'\x028c'}, {L'\x028d'}, {L'\x0290'}, {L'\x0291'}, {L'\x0292'}, {L'\x0295'}, {L'\x029d'}, +- /* 120 */ {L'\x029f'}, {L'\x02b9'}, {L'\x0300'}, {L'\x0301'}, {L'\x0313'}, {L'\x0391'}, {L'\x0392'}, {L'\x0393'}, +- /* 128 */ {L'\x0394'}, {L'\x0395'}, {L'\x0396'}, {L'\x0397'}, {L'\x0398'}, {L'\x0399'}, {L'\x039a'}, {L'\x039b'}, +- /* 136 */ {L'\x039c'}, {L'\x039d'}, {L'\x039e'}, {L'\x039f'}, {L'\x03a0'}, {L'\x03a1'}, {L'\x03a3'}, {L'\x03a4'}, +- /* 144 */ {L'\x03a5'}, {L'\x03a6'}, {L'\x03a7'}, {L'\x03a8'}, {L'\x03a9'}, {L'\x03b1'}, {L'\x03b2'}, {L'\x03b3'}, +- /* 152 */ {L'\x03b4'}, {L'\x03b5'}, {L'\x03b6'}, {L'\x03b7'}, {L'\x03b8'}, {L'\x03b9'}, {L'\x03ba'}, {L'\x03bb'}, +- /* 160 */ {L'\x03bc'}, {L'\x03bd'}, {L'\x03be'}, {L'\x03bf'}, {L'\x03c0'}, {L'\x03c1'}, {L'\x03c2'}, {L'\x03c3'}, +- /* 168 */ {L'\x03c4'}, {L'\x03c5'}, {L'\x03c6'}, {L'\x03c7'}, {L'\x03c8'}, {L'\x03c9'}, {L'\x03dc'}, {L'\x03dd'}, +- /* 176 */ {L'\x043d'}, {L'\x044a'}, {L'\x044c'}, {L'\x05d0'}, {L'\x05d1'}, {L'\x05d2'}, {L'\x05d3'}, {L'\x05d4'}, +- /* 184 */ {L'\x05db'}, {L'\x05dc'}, {L'\x05dd'}, {L'\x05e2'}, {L'\x05e8'}, {L'\x05ea'}, {L'\x0621'}, {L'\x0627'}, +- /* 192 */ {L'\x0628'}, {L'\x0629'}, {L'\x062a'}, {L'\x062b'}, {L'\x062c'}, {L'\x062d'}, {L'\x062e'}, {L'\x062f'}, +- /* 200 */ {L'\x0630'}, {L'\x0631'}, {L'\x0632'}, {L'\x0633'}, {L'\x0634'}, {L'\x0635'}, {L'\x0636'}, {L'\x0637'}, +- /* 208 */ {L'\x0638'}, {L'\x0639'}, {L'\x063a'}, {L'\x0641'}, {L'\x0642'}, {L'\x0643'}, {L'\x0644'}, {L'\x0645'}, +- /* 216 */ {L'\x0646'}, {L'\x0647'}, {L'\x0648'}, {L'\x0649'}, {L'\x064a'}, {L'\x066e'}, {L'\x066f'}, {L'\x0671'}, +- /* 224 */ {L'\x0679'}, {L'\x067a'}, {L'\x067b'}, {L'\x067e'}, {L'\x067f'}, {L'\x0680'}, {L'\x0683'}, {L'\x0684'}, +- /* 232 */ {L'\x0686'}, {L'\x0687'}, {L'\x0688'}, {L'\x068c'}, {L'\x068d'}, {L'\x068e'}, {L'\x0691'}, {L'\x0698'}, +- /* 240 */ {L'\x06a1'}, {L'\x06a4'}, {L'\x06a6'}, {L'\x06a9'}, {L'\x06ad'}, {L'\x06af'}, {L'\x06b1'}, {L'\x06b3'}, +- /* 248 */ {L'\x06ba'}, {L'\x06bb'}, {L'\x06be'}, {L'\x06c1'}, {L'\x06c5'}, {L'\x06c6'}, {L'\x06c7'}, {L'\x06c8'}, +- /* 256 */ {L'\x06c9'}, {L'\x06cb'}, {L'\x06cc'}, {L'\x06d0'}, {L'\x06d2'}, {L'\x0f0b'}, {L'\x10dc'}, {L'\x1100'}, +- /* 264 */ {L'\x1101'}, {L'\x1102'}, {L'\x1103'}, {L'\x1104'}, {L'\x1105'}, {L'\x1106'}, {L'\x1107'}, {L'\x1108'}, +- /* 272 */ {L'\x1109'}, {L'\x110a'}, {L'\x110b'}, {L'\x110c'}, {L'\x110d'}, {L'\x110e'}, {L'\x110f'}, {L'\x1110'}, +- /* 280 */ {L'\x1111'}, {L'\x1112'}, {L'\x1114'}, {L'\x1115'}, {L'\x111a'}, {L'\x111c'}, {L'\x111d'}, {L'\x111e'}, +- /* 288 */ {L'\x1120'}, {L'\x1121'}, {L'\x1122'}, {L'\x1123'}, {L'\x1127'}, {L'\x1129'}, {L'\x112b'}, {L'\x112c'}, +- /* 296 */ {L'\x112d'}, {L'\x112e'}, {L'\x112f'}, {L'\x1132'}, {L'\x1136'}, {L'\x1140'}, {L'\x1147'}, {L'\x114c'}, +- /* 304 */ {L'\x1157'}, {L'\x1158'}, {L'\x1159'}, {L'\x1160'}, {L'\x1161'}, {L'\x1162'}, {L'\x1163'}, {L'\x1164'}, +- /* 312 */ {L'\x1165'}, {L'\x1166'}, {L'\x1167'}, {L'\x1168'}, {L'\x1169'}, {L'\x116a'}, {L'\x116b'}, {L'\x116c'}, +- /* 320 */ {L'\x116d'}, {L'\x116e'}, {L'\x116f'}, {L'\x1170'}, {L'\x1171'}, {L'\x1172'}, {L'\x1173'}, {L'\x1174'}, +- /* 328 */ {L'\x1175'}, {L'\x1184'}, {L'\x1185'}, {L'\x1188'}, {L'\x1191'}, {L'\x1192'}, {L'\x1194'}, {L'\x119e'}, +- /* 336 */ {L'\x11a1'}, {L'\x11aa'}, {L'\x11ac'}, {L'\x11ad'}, {L'\x11b0'}, {L'\x11b1'}, {L'\x11b2'}, {L'\x11b3'}, +- /* 344 */ {L'\x11b4'}, {L'\x11b5'}, {L'\x11c7'}, {L'\x11c8'}, {L'\x11cc'}, {L'\x11ce'}, {L'\x11d3'}, {L'\x11d7'}, +- /* 352 */ {L'\x11d9'}, {L'\x11dd'}, {L'\x11df'}, {L'\x11f1'}, {L'\x11f2'}, {L'\x1d02'}, {L'\x1d16'}, {L'\x1d17'}, +- /* 360 */ {L'\x1d1c'}, {L'\x1d1d'}, {L'\x1d25'}, {L'\x1d7b'}, {L'\x1d85'}, {L'\x2010'}, {L'\x2013'}, {L'\x2014'}, +- /* 368 */ {L'\x20a9'}, {L'\x2190'}, {L'\x2191'}, {L'\x2192'}, {L'\x2193'}, {L'\x2202'}, {L'\x2207'}, {L'\x2211'}, +- /* 376 */ {L'\x2212'}, {L'\x2502'}, {L'\x25a0'}, {L'\x25cb'}, {L'\x2985'}, {L'\x2986'}, {L'\x2d61'}, {L'\x3001'}, +- /* 384 */ {L'\x3002'}, {L'\x3008'}, {L'\x3009'}, {L'\x300a'}, {L'\x300b'}, {L'\x300c'}, {L'\x300d'}, {L'\x300e'}, +- /* 392 */ {L'\x300f'}, {L'\x3010'}, {L'\x3011'}, {L'\x3012'}, {L'\x3014'}, {L'\x3015'}, {L'\x3016'}, {L'\x3017'}, +- /* 400 */ {L'\x3099'}, {L'\x309a'}, {L'\x30a1'}, {L'\x30a2'}, {L'\x30a3'}, {L'\x30a4'}, {L'\x30a5'}, {L'\x30a6'}, +- /* 408 */ {L'\x30a7'}, {L'\x30a8'}, {L'\x30a9'}, {L'\x30aa'}, {L'\x30ab'}, {L'\x30ad'}, {L'\x30af'}, {L'\x30b1'}, +- /* 416 */ {L'\x30b3'}, {L'\x30b5'}, {L'\x30b7'}, {L'\x30b9'}, {L'\x30bb'}, {L'\x30bd'}, {L'\x30bf'}, {L'\x30c1'}, +- /* 424 */ {L'\x30c3'}, {L'\x30c4'}, {L'\x30c6'}, {L'\x30c8'}, {L'\x30ca'}, {L'\x30cb'}, {L'\x30cc'}, {L'\x30cd'}, +- /* 432 */ {L'\x30ce'}, {L'\x30cf'}, {L'\x30d2'}, {L'\x30d5'}, {L'\x30d8'}, {L'\x30db'}, {L'\x30de'}, {L'\x30df'}, +- /* 440 */ {L'\x30e0'}, {L'\x30e1'}, {L'\x30e2'}, {L'\x30e3'}, {L'\x30e4'}, {L'\x30e5'}, {L'\x30e6'}, {L'\x30e7'}, +- /* 448 */ {L'\x30e8'}, {L'\x30e9'}, {L'\x30ea'}, {L'\x30eb'}, {L'\x30ec'}, {L'\x30ed'}, {L'\x30ef'}, {L'\x30f0'}, +- /* 456 */ {L'\x30f1'}, {L'\x30f2'}, {L'\x30f3'}, {L'\x30fb'}, {L'\x30fc'}, {L'\x349e'}, {L'\x34b9'}, {L'\x34bb'}, +- /* 464 */ {L'\x34df'}, {L'\x3515'}, {L'\x36ee'}, {L'\x36fc'}, {L'\x3781'}, {L'\x382f'}, {L'\x3862'}, {L'\x387c'}, +- /* 472 */ {L'\x38c7'}, {L'\x38e3'}, {L'\x391c'}, {L'\x393a'}, {L'\x3a2e'}, {L'\x3a6c'}, {L'\x3ae4'}, {L'\x3b08'}, +- /* 480 */ {L'\x3b19'}, {L'\x3b49'}, {L'\x3b9d'}, {L'\x3c18'}, {L'\x3c4e'}, {L'\x3d33'}, {L'\x3d96'}, {L'\x3eac'}, +- /* 488 */ {L'\x3eb8'}, {L'\x3f1b'}, {L'\x3ffc'}, {L'\x4008'}, {L'\x4018'}, {L'\x4039'}, {L'\x4046'}, {L'\x4096'}, +- /* 496 */ {L'\x40e3'}, {L'\x412f'}, {L'\x4202'}, {L'\x4227'}, {L'\x42a0'}, {L'\x4301'}, {L'\x4334'}, {L'\x4359'}, +- /* 504 */ {L'\x43d5'}, {L'\x43d9'}, {L'\x440b'}, {L'\x446b'}, {L'\x452b'}, {L'\x455d'}, {L'\x4561'}, {L'\x456b'}, +- /* 512 */ {L'\x45d7'}, {L'\x45f9'}, {L'\x4635'}, {L'\x46be'}, {L'\x46c7'}, {L'\x4995'}, {L'\x49e6'}, {L'\x4a6e'}, +- /* 520 */ {L'\x4a76'}, {L'\x4ab2'}, {L'\x4b33'}, {L'\x4bce'}, {L'\x4cce'}, {L'\x4ced'}, {L'\x4cf8'}, {L'\x4d56'}, +- /* 528 */ {L'\x4e00'}, {L'\x4e01'}, {L'\x4e03'}, {L'\x4e09'}, {L'\x4e0a'}, {L'\x4e0b'}, {L'\x4e0d'}, {L'\x4e19'}, +- /* 536 */ {L'\x4e26'}, {L'\x4e28'}, {L'\x4e2d'}, {L'\x4e32'}, {L'\x4e36'}, {L'\x4e38'}, {L'\x4e39'}, {L'\x4e3d'}, +- /* 544 */ {L'\x4e3f'}, {L'\x4e41'}, {L'\x4e59'}, {L'\x4e5d'}, {L'\x4e82'}, {L'\x4e85'}, {L'\x4e86'}, {L'\x4e8c'}, +- /* 552 */ {L'\x4e94'}, {L'\x4ea0'}, {L'\x4ea4'}, {L'\x4eae'}, {L'\x4eba'}, {L'\x4ec0'}, {L'\x4ecc'}, {L'\x4ee4'}, +- /* 560 */ {L'\x4f01'}, {L'\x4f11'}, {L'\x4f60'}, {L'\x4f80'}, {L'\x4f86'}, {L'\x4f8b'}, {L'\x4fae'}, {L'\x4fbb'}, +- /* 568 */ {L'\x4fbf'}, {L'\x5002'}, {L'\x502b'}, {L'\x507a'}, {L'\x5099'}, {L'\x50cf'}, {L'\x50da'}, {L'\x50e7'}, +- /* 576 */ {L'\x512a'}, {L'\x513f'}, {L'\x5140'}, {L'\x5145'}, {L'\x514d'}, {L'\x5154'}, {L'\x5164'}, {L'\x5165'}, +- /* 584 */ {L'\x5167'}, {L'\x5168'}, {L'\x5169'}, {L'\x516b'}, {L'\x516d'}, {L'\x5177'}, {L'\x5180'}, {L'\x5182'}, +- /* 592 */ {L'\x518d'}, {L'\x5192'}, {L'\x5195'}, {L'\x5196'}, {L'\x5197'}, {L'\x5199'}, {L'\x51a4'}, {L'\x51ab'}, +- /* 600 */ {L'\x51ac'}, {L'\x51b5'}, {L'\x51b7'}, {L'\x51c9'}, {L'\x51cc'}, {L'\x51dc'}, {L'\x51de'}, {L'\x51e0'}, +- /* 608 */ {L'\x51f5'}, {L'\x5200'}, {L'\x5203'}, {L'\x5207'}, {L'\x5217'}, {L'\x521d'}, {L'\x5229'}, {L'\x523a'}, +- /* 616 */ {L'\x523b'}, {L'\x5246'}, {L'\x524d'}, {L'\x5272'}, {L'\x5277'}, {L'\x5289'}, {L'\x529b'}, {L'\x52a3'}, +- /* 624 */ {L'\x52b3'}, {L'\x52b4'}, {L'\x52c7'}, {L'\x52c9'}, {L'\x52d2'}, {L'\x52de'}, {L'\x52e4'}, {L'\x52f5'}, +- /* 632 */ {L'\x52f9'}, {L'\x52fa'}, {L'\x5305'}, {L'\x5306'}, {L'\x5315'}, {L'\x5317'}, {L'\x531a'}, {L'\x5338'}, +- /* 640 */ {L'\x533b'}, {L'\x533f'}, {L'\x5341'}, {L'\x5344'}, {L'\x5345'}, {L'\x5349'}, {L'\x5351'}, {L'\x5354'}, +- /* 648 */ {L'\x535a'}, {L'\x535c'}, {L'\x5369'}, {L'\x5370'}, {L'\x5373'}, {L'\x5375'}, {L'\x537d'}, {L'\x537f'}, +- /* 656 */ {L'\x5382'}, {L'\x53b6'}, {L'\x53c3'}, {L'\x53c8'}, {L'\x53ca'}, {L'\x53cc'}, {L'\x53df'}, {L'\x53e3'}, +- /* 664 */ {L'\x53e5'}, {L'\x53eb'}, {L'\x53ef'}, {L'\x53f1'}, {L'\x53f3'}, {L'\x5406'}, {L'\x5408'}, {L'\x540d'}, +- /* 672 */ {L'\x540f'}, {L'\x541d'}, {L'\x5438'}, {L'\x5439'}, {L'\x5442'}, {L'\x5448'}, {L'\x5468'}, {L'\x549e'}, +- /* 680 */ {L'\x54a2'}, {L'\x54bd'}, {L'\x54f6'}, {L'\x5510'}, {L'\x554f'}, {L'\x5553'}, {L'\x5555'}, {L'\x5563'}, +- /* 688 */ {L'\x5584'}, {L'\x5587'}, {L'\x5599'}, {L'\x559d'}, {L'\x55ab'}, {L'\x55b3'}, {L'\x55b6'}, {L'\x55c0'}, +- /* 696 */ {L'\x55c2'}, {L'\x55e2'}, {L'\x5606'}, {L'\x5651'}, {L'\x5668'}, {L'\x5674'}, {L'\x56d7'}, {L'\x56db'}, +- /* 704 */ {L'\x56f9'}, {L'\x5716'}, {L'\x5717'}, {L'\x571f'}, {L'\x5730'}, {L'\x578b'}, {L'\x57ce'}, {L'\x57f4'}, +- /* 712 */ {L'\x580d'}, {L'\x5831'}, {L'\x5832'}, {L'\x5840'}, {L'\x585a'}, {L'\x585e'}, {L'\x58a8'}, {L'\x58ac'}, +- /* 720 */ {L'\x58b3'}, {L'\x58d8'}, {L'\x58df'}, {L'\x58eb'}, {L'\x58ee'}, {L'\x58f0'}, {L'\x58f2'}, {L'\x58f7'}, +- /* 728 */ {L'\x5902'}, {L'\x5906'}, {L'\x590a'}, {L'\x5915'}, {L'\x591a'}, {L'\x591c'}, {L'\x5922'}, {L'\x5927'}, +- /* 736 */ {L'\x5929'}, {L'\x5944'}, {L'\x5948'}, {L'\x5951'}, {L'\x5954'}, {L'\x5962'}, {L'\x5973'}, {L'\x59d8'}, +- /* 744 */ {L'\x59ec'}, {L'\x5a1b'}, {L'\x5a27'}, {L'\x5a62'}, {L'\x5a66'}, {L'\x5ab5'}, {L'\x5b08'}, {L'\x5b28'}, +- /* 752 */ {L'\x5b3e'}, {L'\x5b50'}, {L'\x5b57'}, {L'\x5b66'}, {L'\x5b80'}, {L'\x5b85'}, {L'\x5b97'}, {L'\x5bc3'}, +- /* 760 */ {L'\x5bd8'}, {L'\x5be7'}, {L'\x5bee'}, {L'\x5bf3'}, {L'\x5bf8'}, {L'\x5bff'}, {L'\x5c06'}, {L'\x5c0f'}, +- /* 768 */ {L'\x5c22'}, {L'\x5c38'}, {L'\x5c3f'}, {L'\x5c60'}, {L'\x5c62'}, {L'\x5c64'}, {L'\x5c65'}, {L'\x5c6e'}, +- /* 776 */ {L'\x5c71'}, {L'\x5c8d'}, {L'\x5cc0'}, {L'\x5d19'}, {L'\x5d43'}, {L'\x5d50'}, {L'\x5d6b'}, {L'\x5d6e'}, +- /* 784 */ {L'\x5d7c'}, {L'\x5db2'}, {L'\x5dba'}, {L'\x5ddb'}, {L'\x5de1'}, {L'\x5de2'}, {L'\x5de5'}, {L'\x5de6'}, +- /* 792 */ {L'\x5df1'}, {L'\x5dfd'}, {L'\x5dfe'}, {L'\x5e28'}, {L'\x5e3d'}, {L'\x5e69'}, {L'\x5e72'}, {L'\x5e74'}, +- /* 800 */ {L'\x5e7a'}, {L'\x5e7c'}, {L'\x5e7f'}, {L'\x5ea6'}, {L'\x5eb0'}, {L'\x5eb3'}, {L'\x5eb6'}, {L'\x5ec9'}, +- /* 808 */ {L'\x5eca'}, {L'\x5ed2'}, {L'\x5ed3'}, {L'\x5ed9'}, {L'\x5eec'}, {L'\x5ef4'}, {L'\x5efe'}, {L'\x5f04'}, +- /* 816 */ {L'\x5f0b'}, {L'\x5f13'}, {L'\x5f22'}, {L'\x5f50'}, {L'\x5f53'}, {L'\x5f61'}, {L'\x5f62'}, {L'\x5f69'}, +- /* 824 */ {L'\x5f6b'}, {L'\x5f73'}, {L'\x5f8b'}, {L'\x5f8c'}, {L'\x5f97'}, {L'\x5f9a'}, {L'\x5fa9'}, {L'\x5fad'}, +- /* 832 */ {L'\x5fc3'}, {L'\x5fcd'}, {L'\x5fd7'}, {L'\x5ff5'}, {L'\x5ff9'}, {L'\x6012'}, {L'\x601c'}, {L'\x6075'}, +- /* 840 */ {L'\x6081'}, {L'\x6094'}, {L'\x60c7'}, {L'\x60d8'}, {L'\x60e1'}, {L'\x6108'}, {L'\x6144'}, {L'\x6148'}, +- /* 848 */ {L'\x614c'}, {L'\x614e'}, {L'\x6160'}, {L'\x6168'}, {L'\x617a'}, {L'\x618e'}, {L'\x6190'}, {L'\x61a4'}, +- /* 856 */ {L'\x61af'}, {L'\x61b2'}, {L'\x61de'}, {L'\x61f2'}, {L'\x61f6'}, {L'\x6200'}, {L'\x6208'}, {L'\x6210'}, +- /* 864 */ {L'\x621b'}, {L'\x622e'}, {L'\x6234'}, {L'\x6236'}, {L'\x624b'}, {L'\x6253'}, {L'\x625d'}, {L'\x6295'}, +- /* 872 */ {L'\x62b1'}, {L'\x62c9'}, {L'\x62cf'}, {L'\x62d3'}, {L'\x62d4'}, {L'\x62fc'}, {L'\x62fe'}, {L'\x6307'}, +- /* 880 */ {L'\x633d'}, {L'\x6350'}, {L'\x6355'}, {L'\x6368'}, {L'\x637b'}, {L'\x6383'}, {L'\x63a0'}, {L'\x63a9'}, +- /* 888 */ {L'\x63c4'}, {L'\x63c5'}, {L'\x63e4'}, {L'\x641c'}, {L'\x6422'}, {L'\x6452'}, {L'\x6469'}, {L'\x6477'}, +- /* 896 */ {L'\x647e'}, {L'\x649a'}, {L'\x649d'}, {L'\x64c4'}, {L'\x652f'}, {L'\x6534'}, {L'\x654f'}, {L'\x6556'}, +- /* 904 */ {L'\x656c'}, {L'\x6578'}, {L'\x6587'}, {L'\x6597'}, {L'\x6599'}, {L'\x65a4'}, {L'\x65b0'}, {L'\x65b9'}, +- /* 912 */ {L'\x65c5'}, {L'\x65e0'}, {L'\x65e2'}, {L'\x65e3'}, {L'\x65e5'}, {L'\x6613'}, {L'\x6620'}, {L'\x6649'}, +- /* 920 */ {L'\x6674'}, {L'\x6688'}, {L'\x6691'}, {L'\x669c'}, {L'\x66b4'}, {L'\x66c6'}, {L'\x66f0'}, {L'\x66f4'}, +- /* 928 */ {L'\x66f8'}, {L'\x6700'}, {L'\x6708'}, {L'\x6709'}, {L'\x6717'}, {L'\x671b'}, {L'\x6721'}, {L'\x6728'}, +- /* 936 */ {L'\x674e'}, {L'\x6753'}, {L'\x6756'}, {L'\x675e'}, {L'\x677b'}, {L'\x6785'}, {L'\x6797'}, {L'\x67f3'}, +- /* 944 */ {L'\x67fa'}, {L'\x6817'}, {L'\x681f'}, {L'\x682a'}, {L'\x6852'}, {L'\x6881'}, {L'\x6885'}, {L'\x688e'}, +- /* 952 */ {L'\x68a8'}, {L'\x6914'}, {L'\x6942'}, {L'\x69a3'}, {L'\x69ea'}, {L'\x6a02'}, {L'\x6a13'}, {L'\x6aa8'}, +- /* 960 */ {L'\x6ad3'}, {L'\x6adb'}, {L'\x6b04'}, {L'\x6b20'}, {L'\x6b21'}, {L'\x6b54'}, {L'\x6b62'}, {L'\x6b63'}, +- /* 968 */ {L'\x6b72'}, {L'\x6b77'}, {L'\x6b79'}, {L'\x6b9f'}, {L'\x6bae'}, {L'\x6bb3'}, {L'\x6bba'}, {L'\x6bbb'}, +- /* 976 */ {L'\x6bcb'}, {L'\x6bcd'}, {L'\x6bd4'}, {L'\x6bdb'}, {L'\x6c0f'}, {L'\x6c14'}, {L'\x6c34'}, {L'\x6c4e'}, +- /* 984 */ {L'\x6c67'}, {L'\x6c88'}, {L'\x6cbf'}, {L'\x6ccc'}, {L'\x6ccd'}, {L'\x6ce5'}, {L'\x6ce8'}, {L'\x6d16'}, +- /* 992 */ {L'\x6d1b'}, {L'\x6d1e'}, {L'\x6d34'}, {L'\x6d3e'}, {L'\x6d41'}, {L'\x6d69'}, {L'\x6d6a'}, {L'\x6d77'}, +- /* 1000 */ {L'\x6d78'}, {L'\x6d85'}, {L'\x6dcb'}, {L'\x6dda'}, {L'\x6dea'}, {L'\x6df9'}, {L'\x6e1a'}, {L'\x6e2f'}, +- /* 1008 */ {L'\x6e6e'}, {L'\x6e80'}, {L'\x6e9c'}, {L'\x6eba'}, {L'\x6ec7'}, {L'\x6ecb'}, {L'\x6ed1'}, {L'\x6edb'}, +- /* 1016 */ {L'\x6f0f'}, {L'\x6f14'}, {L'\x6f22'}, {L'\x6f23'}, {L'\x6f6e'}, {L'\x6fc6'}, {L'\x6feb'}, {L'\x6ffe'}, +- /* 1024 */ {L'\x701b'}, {L'\x701e'}, {L'\x7039'}, {L'\x704a'}, {L'\x706b'}, {L'\x7070'}, {L'\x7077'}, {L'\x707d'}, +- /* 1032 */ {L'\x7099'}, {L'\x70ad'}, {L'\x70c8'}, {L'\x70d9'}, {L'\x7121'}, {L'\x7145'}, {L'\x7149'}, {L'\x716e'}, +- /* 1040 */ {L'\x719c'}, {L'\x71ce'}, {L'\x71d0'}, {L'\x7210'}, {L'\x721b'}, {L'\x7228'}, {L'\x722a'}, {L'\x722b'}, +- /* 1048 */ {L'\x7235'}, {L'\x7236'}, {L'\x723b'}, {L'\x723f'}, {L'\x7247'}, {L'\x7250'}, {L'\x7259'}, {L'\x725b'}, +- /* 1056 */ {L'\x7262'}, {L'\x7279'}, {L'\x7280'}, {L'\x7295'}, {L'\x72ac'}, {L'\x72af'}, {L'\x72c0'}, {L'\x72fc'}, +- /* 1064 */ {L'\x732a'}, {L'\x7375'}, {L'\x737a'}, {L'\x7384'}, {L'\x7387'}, {L'\x7389'}, {L'\x738b'}, {L'\x73a5'}, +- /* 1072 */ {L'\x73b2'}, {L'\x73de'}, {L'\x7406'}, {L'\x7409'}, {L'\x7422'}, {L'\x7447'}, {L'\x745c'}, {L'\x7469'}, +- /* 1080 */ {L'\x7471'}, {L'\x7485'}, {L'\x7489'}, {L'\x7498'}, {L'\x74ca'}, {L'\x74dc'}, {L'\x74e6'}, {L'\x7506'}, +- /* 1088 */ {L'\x7518'}, {L'\x751f'}, {L'\x7524'}, {L'\x7528'}, {L'\x7530'}, {L'\x7532'}, {L'\x7533'}, {L'\x7537'}, +- /* 1096 */ {L'\x753b'}, {L'\x753e'}, {L'\x7559'}, {L'\x7565'}, {L'\x7570'}, {L'\x758b'}, {L'\x7592'}, {L'\x75e2'}, +- /* 1104 */ {L'\x7610'}, {L'\x761d'}, {L'\x761f'}, {L'\x7642'}, {L'\x7669'}, {L'\x7676'}, {L'\x767d'}, {L'\x76ae'}, +- /* 1112 */ {L'\x76bf'}, {L'\x76ca'}, {L'\x76db'}, {L'\x76e3'}, {L'\x76e7'}, {L'\x76ee'}, {L'\x76f4'}, {L'\x7701'}, +- /* 1120 */ {L'\x771e'}, {L'\x771f'}, {L'\x7740'}, {L'\x774a'}, {L'\x778b'}, {L'\x77a7'}, {L'\x77db'}, {L'\x77e2'}, +- /* 1128 */ {L'\x77f3'}, {L'\x784e'}, {L'\x786b'}, {L'\x788c'}, {L'\x7891'}, {L'\x78ca'}, {L'\x78cc'}, {L'\x78fb'}, +- /* 1136 */ {L'\x792a'}, {L'\x793a'}, {L'\x793c'}, {L'\x793e'}, {L'\x7948'}, {L'\x7949'}, {L'\x7950'}, {L'\x7956'}, +- /* 1144 */ {L'\x795d'}, {L'\x795e'}, {L'\x7965'}, {L'\x797f'}, {L'\x7981'}, {L'\x798d'}, {L'\x798e'}, {L'\x798f'}, +- /* 1152 */ {L'\x79ae'}, {L'\x79b8'}, {L'\x79be'}, {L'\x79ca'}, {L'\x79d8'}, {L'\x79eb'}, {L'\x7a1c'}, {L'\x7a40'}, +- /* 1160 */ {L'\x7a4a'}, {L'\x7a4f'}, {L'\x7a74'}, {L'\x7a7a'}, {L'\x7a81'}, {L'\x7ab1'}, {L'\x7acb'}, {L'\x7aee'}, +- /* 1168 */ {L'\x7af9'}, {L'\x7b20'}, {L'\x7b8f'}, {L'\x7bc0'}, {L'\x7bc6'}, {L'\x7bc9'}, {L'\x7c3e'}, {L'\x7c60'}, +- /* 1176 */ {L'\x7c73'}, {L'\x7c7b'}, {L'\x7c92'}, {L'\x7cbe'}, {L'\x7cd2'}, {L'\x7cd6'}, {L'\x7ce3'}, {L'\x7ce7'}, +- /* 1184 */ {L'\x7ce8'}, {L'\x7cf8'}, {L'\x7d00'}, {L'\x7d10'}, {L'\x7d22'}, {L'\x7d2f'}, {L'\x7d42'}, {L'\x7d5b'}, +- /* 1192 */ {L'\x7d63'}, {L'\x7da0'}, {L'\x7dbe'}, {L'\x7dc7'}, {L'\x7df4'}, {L'\x7e02'}, {L'\x7e09'}, {L'\x7e37'}, +- /* 1200 */ {L'\x7e41'}, {L'\x7e45'}, {L'\x7f36'}, {L'\x7f3e'}, {L'\x7f51'}, {L'\x7f72'}, {L'\x7f79'}, {L'\x7f7a'}, +- /* 1208 */ {L'\x7f85'}, {L'\x7f8a'}, {L'\x7f95'}, {L'\x7f9a'}, {L'\x7fbd'}, {L'\x7ffa'}, {L'\x8001'}, {L'\x8005'}, +- /* 1216 */ {L'\x800c'}, {L'\x8012'}, {L'\x8033'}, {L'\x8046'}, {L'\x8060'}, {L'\x806f'}, {L'\x8070'}, {L'\x807e'}, +- /* 1224 */ {L'\x807f'}, {L'\x8089'}, {L'\x808b'}, {L'\x80ad'}, {L'\x80b2'}, {L'\x8103'}, {L'\x813e'}, {L'\x81d8'}, +- /* 1232 */ {L'\x81e3'}, {L'\x81e8'}, {L'\x81ea'}, {L'\x81ed'}, {L'\x81f3'}, {L'\x81fc'}, {L'\x8201'}, {L'\x8204'}, +- /* 1240 */ {L'\x820c'}, {L'\x8218'}, {L'\x821b'}, {L'\x821f'}, {L'\x826e'}, {L'\x826f'}, {L'\x8272'}, {L'\x8278'}, +- /* 1248 */ {L'\x8279'}, {L'\x828b'}, {L'\x8291'}, {L'\x829d'}, {L'\x82b1'}, {L'\x82b3'}, {L'\x82bd'}, {L'\x82e5'}, +- /* 1256 */ {L'\x82e6'}, {L'\x831d'}, {L'\x8323'}, {L'\x8336'}, {L'\x8352'}, {L'\x8353'}, {L'\x8363'}, {L'\x83ad'}, +- /* 1264 */ {L'\x83bd'}, {L'\x83c9'}, {L'\x83ca'}, {L'\x83cc'}, {L'\x83dc'}, {L'\x83e7'}, {L'\x83ef'}, {L'\x83f1'}, +- /* 1272 */ {L'\x843d'}, {L'\x8449'}, {L'\x8457'}, {L'\x84ee'}, {L'\x84f1'}, {L'\x84f3'}, {L'\x84fc'}, {L'\x8516'}, +- /* 1280 */ {L'\x8564'}, {L'\x85cd'}, {L'\x85fa'}, {L'\x8606'}, {L'\x8612'}, {L'\x862d'}, {L'\x863f'}, {L'\x864d'}, +- /* 1288 */ {L'\x8650'}, {L'\x865c'}, {L'\x8667'}, {L'\x8669'}, {L'\x866b'}, {L'\x8688'}, {L'\x86a9'}, {L'\x86e2'}, +- /* 1296 */ {L'\x870e'}, {L'\x8728'}, {L'\x876b'}, {L'\x8779'}, {L'\x8786'}, {L'\x87ba'}, {L'\x87e1'}, {L'\x8801'}, +- /* 1304 */ {L'\x881f'}, {L'\x8840'}, {L'\x884c'}, {L'\x8860'}, {L'\x8863'}, {L'\x88c2'}, {L'\x88cf'}, {L'\x88d7'}, +- /* 1312 */ {L'\x88de'}, {L'\x88e1'}, {L'\x88f8'}, {L'\x88fa'}, {L'\x8910'}, {L'\x8941'}, {L'\x8964'}, {L'\x897e'}, +- /* 1320 */ {L'\x8986'}, {L'\x898b'}, {L'\x8996'}, {L'\x89d2'}, {L'\x89e3'}, {L'\x8a00'}, {L'\x8aa0'}, {L'\x8aaa'}, +- /* 1328 */ {L'\x8abf'}, {L'\x8acb'}, {L'\x8ad2'}, {L'\x8ad6'}, {L'\x8aed'}, {L'\x8af8'}, {L'\x8afe'}, {L'\x8b01'}, +- /* 1336 */ {L'\x8b39'}, {L'\x8b58'}, {L'\x8b80'}, {L'\x8b8a'}, {L'\x8c37'}, {L'\x8c46'}, {L'\x8c48'}, {L'\x8c55'}, +- /* 1344 */ {L'\x8c78'}, {L'\x8c9d'}, {L'\x8ca1'}, {L'\x8ca9'}, {L'\x8cab'}, {L'\x8cc1'}, {L'\x8cc2'}, {L'\x8cc7'}, +- /* 1352 */ {L'\x8cc8'}, {L'\x8cd3'}, {L'\x8d08'}, {L'\x8d1b'}, {L'\x8d64'}, {L'\x8d70'}, {L'\x8d77'}, {L'\x8db3'}, +- /* 1360 */ {L'\x8dbc'}, {L'\x8dcb'}, {L'\x8def'}, {L'\x8df0'}, {L'\x8eab'}, {L'\x8eca'}, {L'\x8ed4'}, {L'\x8f26'}, +- /* 1368 */ {L'\x8f2a'}, {L'\x8f38'}, {L'\x8f3b'}, {L'\x8f62'}, {L'\x8f9b'}, {L'\x8f9e'}, {L'\x8fb0'}, {L'\x8fb5'}, +- /* 1376 */ {L'\x8fb6'}, {L'\x9023'}, {L'\x9038'}, {L'\x904a'}, {L'\x9069'}, {L'\x9072'}, {L'\x907c'}, {L'\x908f'}, +- /* 1384 */ {L'\x9091'}, {L'\x9094'}, {L'\x90ce'}, {L'\x90de'}, {L'\x90f1'}, {L'\x90fd'}, {L'\x9111'}, {L'\x911b'}, +- /* 1392 */ {L'\x9149'}, {L'\x914d'}, {L'\x916a'}, {L'\x9199'}, {L'\x91b4'}, {L'\x91c6'}, {L'\x91cc'}, {L'\x91cf'}, +- /* 1400 */ {L'\x91d1'}, {L'\x9234'}, {L'\x9238'}, {L'\x9276'}, {L'\x927c'}, {L'\x92d7'}, {L'\x92d8'}, {L'\x9304'}, +- /* 1408 */ {L'\x934a'}, {L'\x93f9'}, {L'\x9415'}, {L'\x9577'}, {L'\x9580'}, {L'\x958b'}, {L'\x95ad'}, {L'\x95b7'}, +- /* 1416 */ {L'\x961c'}, {L'\x962e'}, {L'\x964b'}, {L'\x964d'}, {L'\x9675'}, {L'\x9678'}, {L'\x967c'}, {L'\x9686'}, +- /* 1424 */ {L'\x96a3'}, {L'\x96b6'}, {L'\x96b7'}, {L'\x96b8'}, {L'\x96b9'}, {L'\x96c3'}, {L'\x96e2'}, {L'\x96e3'}, +- /* 1432 */ {L'\x96e8'}, {L'\x96f6'}, {L'\x96f7'}, {L'\x9723'}, {L'\x9732'}, {L'\x9748'}, {L'\x9751'}, {L'\x9756'}, +- /* 1440 */ {L'\x975e'}, {L'\x9762'}, {L'\x9769'}, {L'\x97cb'}, {L'\x97db'}, {L'\x97e0'}, {L'\x97ed'}, {L'\x97f3'}, +- /* 1448 */ {L'\x97ff'}, {L'\x9801'}, {L'\x9805'}, {L'\x980b'}, {L'\x9818'}, {L'\x9829'}, {L'\x983b'}, {L'\x985e'}, +- /* 1456 */ {L'\x98a8'}, {L'\x98db'}, {L'\x98df'}, {L'\x98e2'}, {L'\x98ef'}, {L'\x98fc'}, {L'\x9928'}, {L'\x9929'}, +- /* 1464 */ {L'\x9996'}, {L'\x9999'}, {L'\x99a7'}, {L'\x99ac'}, {L'\x99c2'}, {L'\x99f1'}, {L'\x99fe'}, {L'\x9a6a'}, +- /* 1472 */ {L'\x9aa8'}, {L'\x9ad8'}, {L'\x9adf'}, {L'\x9b12'}, {L'\x9b25'}, {L'\x9b2f'}, {L'\x9b32'}, {L'\x9b3c'}, +- /* 1480 */ {L'\x9b5a'}, {L'\x9b6f'}, {L'\x9c40'}, {L'\x9c57'}, {L'\x9ce5'}, {L'\x9cfd'}, {L'\x9d67'}, {L'\x9db4'}, +- /* 1488 */ {L'\x9dfa'}, {L'\x9e1e'}, {L'\x9e75'}, {L'\x9e7f'}, {L'\x9e97'}, {L'\x9e9f'}, {L'\x9ea5'}, {L'\x9ebb'}, +- /* 1496 */ {L'\x9ec3'}, {L'\x9ecd'}, {L'\x9ece'}, {L'\x9ed1'}, {L'\x9ef9'}, {L'\x9efd'}, {L'\x9efe'}, {L'\x9f05'}, +- /* 1504 */ {L'\x9f0e'}, {L'\x9f0f'}, {L'\x9f13'}, {L'\x9f16'}, {L'\x9f20'}, {L'\x9f3b'}, {L'\x9f43'}, {L'\x9f4a'}, +- /* 1512 */ {L'\x9f52'}, {L'\x9f8d'}, {L'\x9f8e'}, {L'\x9f9c'}, {L'\x9f9f'}, {L'\x9fa0'}, {L'\xa727'}, {L'\xa76f'}, +- /* 1520 */ {L'\xab37'}, {L'\xab52'}, {L']'}, {L'^'}, {L'_'}, {L'`'}, {L'a'}, {L'b'}, +- /* 1528 */ {L'c'}, {L'd'}, {L'e'}, {L'f'}, {L'g'}, {L'h'}, {L'i'}, {L'j'}, +- /* 1536 */ {L'k'}, {L'l'}, {L'm'}, {L'n'}, {L'o'}, {L'p'}, {L'q'}, {L'r'}, +- /* 1544 */ {L's'}, {L't'}, {L'u'}, {L'v'}, {L'w'}, {L'x'}, {L'y'}, {L'z'}, +- /* 1552 */ {L'{'}, {L'|'}, {L'}'}, {L'~'}}; +- +-static const wchar_t UNWIF_compat_tbl_2 [1286][2] = { ++ /* 64 */ {L'\x00a6'}, {L'\x00ac'}, {L'\x00b7'}, {L'\x00c6'}, {L'\x00e6'}, {L'\x00f0'}, {L'\x00f8'}, {L'\x0126'}, ++ /* 72 */ {L'\x0127'}, {L'\x0131'}, {L'\x014b'}, {L'\x0153'}, {L'\x018e'}, {L'\x0190'}, {L'\x01ab'}, {L'\x01c0'}, ++ /* 80 */ {L'\x01c1'}, {L'\x01c2'}, {L'\x0222'}, {L'\x0237'}, {L'\x0250'}, {L'\x0251'}, {L'\x0252'}, {L'\x0253'}, ++ /* 88 */ {L'\x0254'}, {L'\x0255'}, {L'\x0256'}, {L'\x0257'}, {L'\x0258'}, {L'\x0259'}, {L'\x025b'}, {L'\x025c'}, ++ /* 96 */ {L'\x025e'}, {L'\x025f'}, {L'\x0260'}, {L'\x0261'}, {L'\x0262'}, {L'\x0263'}, {L'\x0264'}, {L'\x0265'}, ++ /* 104 */ {L'\x0266'}, {L'\x0267'}, {L'\x0268'}, {L'\x0269'}, {L'\x026a'}, {L'\x026b'}, {L'\x026c'}, {L'\x026d'}, ++ /* 112 */ {L'\x026e'}, {L'\x026f'}, {L'\x0270'}, {L'\x0271'}, {L'\x0272'}, {L'\x0273'}, {L'\x0274'}, {L'\x0275'}, ++ /* 120 */ {L'\x0276'}, {L'\x0277'}, {L'\x0278'}, {L'\x0279'}, {L'\x027a'}, {L'\x027b'}, {L'\x027d'}, {L'\x027e'}, ++ /* 128 */ {L'\x0280'}, {L'\x0281'}, {L'\x0282'}, {L'\x0283'}, {L'\x0284'}, {L'\x0288'}, {L'\x0289'}, {L'\x028a'}, ++ /* 136 */ {L'\x028b'}, {L'\x028c'}, {L'\x028d'}, {L'\x028e'}, {L'\x028f'}, {L'\x0290'}, {L'\x0291'}, {L'\x0292'}, ++ /* 144 */ {L'\x0295'}, {L'\x0298'}, {L'\x0299'}, {L'\x029b'}, {L'\x029c'}, {L'\x029d'}, {L'\x029f'}, {L'\x02a1'}, ++ /* 152 */ {L'\x02a2'}, {L'\x02a3'}, {L'\x02a4'}, {L'\x02a5'}, {L'\x02a6'}, {L'\x02a7'}, {L'\x02a8'}, {L'\x02a9'}, ++ /* 160 */ {L'\x02aa'}, {L'\x02ab'}, {L'\x02b9'}, {L'\x02d0'}, {L'\x02d1'}, {L'\x0300'}, {L'\x0301'}, {L'\x0313'}, ++ /* 168 */ {L'\x0391'}, {L'\x0392'}, {L'\x0393'}, {L'\x0394'}, {L'\x0395'}, {L'\x0396'}, {L'\x0397'}, {L'\x0398'}, ++ /* 176 */ {L'\x0399'}, {L'\x039a'}, {L'\x039b'}, {L'\x039c'}, {L'\x039d'}, {L'\x039e'}, {L'\x039f'}, {L'\x03a0'}, ++ /* 184 */ {L'\x03a1'}, {L'\x03a3'}, {L'\x03a4'}, {L'\x03a5'}, {L'\x03a6'}, {L'\x03a7'}, {L'\x03a8'}, {L'\x03a9'}, ++ /* 192 */ {L'\x03b1'}, {L'\x03b2'}, {L'\x03b3'}, {L'\x03b4'}, {L'\x03b5'}, {L'\x03b6'}, {L'\x03b7'}, {L'\x03b8'}, ++ /* 200 */ {L'\x03b9'}, {L'\x03ba'}, {L'\x03bb'}, {L'\x03bc'}, {L'\x03bd'}, {L'\x03be'}, {L'\x03bf'}, {L'\x03c0'}, ++ /* 208 */ {L'\x03c1'}, {L'\x03c2'}, {L'\x03c3'}, {L'\x03c4'}, {L'\x03c5'}, {L'\x03c6'}, {L'\x03c7'}, {L'\x03c8'}, ++ /* 216 */ {L'\x03c9'}, {L'\x03dc'}, {L'\x03dd'}, {L'\x043d'}, {L'\x044a'}, {L'\x044c'}, {L'\x05d0'}, {L'\x05d1'}, ++ /* 224 */ {L'\x05d2'}, {L'\x05d3'}, {L'\x05d4'}, {L'\x05db'}, {L'\x05dc'}, {L'\x05dd'}, {L'\x05e2'}, {L'\x05e8'}, ++ /* 232 */ {L'\x05ea'}, {L'\x0621'}, {L'\x0627'}, {L'\x0628'}, {L'\x0629'}, {L'\x062a'}, {L'\x062b'}, {L'\x062c'}, ++ /* 240 */ {L'\x062d'}, {L'\x062e'}, {L'\x062f'}, {L'\x0630'}, {L'\x0631'}, {L'\x0632'}, {L'\x0633'}, {L'\x0634'}, ++ /* 248 */ {L'\x0635'}, {L'\x0636'}, {L'\x0637'}, {L'\x0638'}, {L'\x0639'}, {L'\x063a'}, {L'\x0641'}, {L'\x0642'}, ++ /* 256 */ {L'\x0643'}, {L'\x0644'}, {L'\x0645'}, {L'\x0646'}, {L'\x0647'}, {L'\x0648'}, {L'\x0649'}, {L'\x064a'}, ++ /* 264 */ {L'\x066e'}, {L'\x066f'}, {L'\x0671'}, {L'\x0679'}, {L'\x067a'}, {L'\x067b'}, {L'\x067e'}, {L'\x067f'}, ++ /* 272 */ {L'\x0680'}, {L'\x0683'}, {L'\x0684'}, {L'\x0686'}, {L'\x0687'}, {L'\x0688'}, {L'\x068c'}, {L'\x068d'}, ++ /* 280 */ {L'\x068e'}, {L'\x0691'}, {L'\x0698'}, {L'\x06a1'}, {L'\x06a4'}, {L'\x06a6'}, {L'\x06a9'}, {L'\x06ad'}, ++ /* 288 */ {L'\x06af'}, {L'\x06b1'}, {L'\x06b3'}, {L'\x06ba'}, {L'\x06bb'}, {L'\x06be'}, {L'\x06c1'}, {L'\x06c5'}, ++ /* 296 */ {L'\x06c6'}, {L'\x06c7'}, {L'\x06c8'}, {L'\x06c9'}, {L'\x06cb'}, {L'\x06cc'}, {L'\x06d0'}, {L'\x06d2'}, ++ /* 304 */ {L'\x0f0b'}, {L'\x10dc'}, {L'\x1100'}, {L'\x1101'}, {L'\x1102'}, {L'\x1103'}, {L'\x1104'}, {L'\x1105'}, ++ /* 312 */ {L'\x1106'}, {L'\x1107'}, {L'\x1108'}, {L'\x1109'}, {L'\x110a'}, {L'\x110b'}, {L'\x110c'}, {L'\x110d'}, ++ /* 320 */ {L'\x110e'}, {L'\x110f'}, {L'\x1110'}, {L'\x1111'}, {L'\x1112'}, {L'\x1114'}, {L'\x1115'}, {L'\x111a'}, ++ /* 328 */ {L'\x111c'}, {L'\x111d'}, {L'\x111e'}, {L'\x1120'}, {L'\x1121'}, {L'\x1122'}, {L'\x1123'}, {L'\x1127'}, ++ /* 336 */ {L'\x1129'}, {L'\x112b'}, {L'\x112c'}, {L'\x112d'}, {L'\x112e'}, {L'\x112f'}, {L'\x1132'}, {L'\x1136'}, ++ /* 344 */ {L'\x1140'}, {L'\x1147'}, {L'\x114c'}, {L'\x1157'}, {L'\x1158'}, {L'\x1159'}, {L'\x1160'}, {L'\x1161'}, ++ /* 352 */ {L'\x1162'}, {L'\x1163'}, {L'\x1164'}, {L'\x1165'}, {L'\x1166'}, {L'\x1167'}, {L'\x1168'}, {L'\x1169'}, ++ /* 360 */ {L'\x116a'}, {L'\x116b'}, {L'\x116c'}, {L'\x116d'}, {L'\x116e'}, {L'\x116f'}, {L'\x1170'}, {L'\x1171'}, ++ /* 368 */ {L'\x1172'}, {L'\x1173'}, {L'\x1174'}, {L'\x1175'}, {L'\x1184'}, {L'\x1185'}, {L'\x1188'}, {L'\x1191'}, ++ /* 376 */ {L'\x1192'}, {L'\x1194'}, {L'\x119e'}, {L'\x11a1'}, {L'\x11aa'}, {L'\x11ac'}, {L'\x11ad'}, {L'\x11b0'}, ++ /* 384 */ {L'\x11b1'}, {L'\x11b2'}, {L'\x11b3'}, {L'\x11b4'}, {L'\x11b5'}, {L'\x11c7'}, {L'\x11c8'}, {L'\x11cc'}, ++ /* 392 */ {L'\x11ce'}, {L'\x11d3'}, {L'\x11d7'}, {L'\x11d9'}, {L'\x11dd'}, {L'\x11df'}, {L'\x11f1'}, {L'\x11f2'}, ++ /* 400 */ {L'\x1d02'}, {L'\x1d16'}, {L'\x1d17'}, {L'\x1d1c'}, {L'\x1d1d'}, {L'\x1d25'}, {L'\x1d7b'}, {L'\x1d85'}, ++ /* 408 */ {L'\x1d91'}, {L'\x2010'}, {L'\x2013'}, {L'\x2014'}, {L'\x20a9'}, {L'\x2190'}, {L'\x2191'}, {L'\x2192'}, ++ /* 416 */ {L'\x2193'}, {L'\x2202'}, {L'\x2207'}, {L'\x2211'}, {L'\x2212'}, {L'\x2502'}, {L'\x25a0'}, {L'\x25cb'}, ++ /* 424 */ {L'\x2985'}, {L'\x2986'}, {L'\x2c71'}, {L'\x2d61'}, {L'\x3001'}, {L'\x3002'}, {L'\x3008'}, {L'\x3009'}, ++ /* 432 */ {L'\x300a'}, {L'\x300b'}, {L'\x300c'}, {L'\x300d'}, {L'\x300e'}, {L'\x300f'}, {L'\x3010'}, {L'\x3011'}, ++ /* 440 */ {L'\x3012'}, {L'\x3014'}, {L'\x3015'}, {L'\x3016'}, {L'\x3017'}, {L'\x3099'}, {L'\x309a'}, {L'\x30a1'}, ++ /* 448 */ {L'\x30a2'}, {L'\x30a3'}, {L'\x30a4'}, {L'\x30a5'}, {L'\x30a6'}, {L'\x30a7'}, {L'\x30a8'}, {L'\x30a9'}, ++ /* 456 */ {L'\x30aa'}, {L'\x30ab'}, {L'\x30ad'}, {L'\x30af'}, {L'\x30b1'}, {L'\x30b3'}, {L'\x30b5'}, {L'\x30b7'}, ++ /* 464 */ {L'\x30b9'}, {L'\x30bb'}, {L'\x30bd'}, {L'\x30bf'}, {L'\x30c1'}, {L'\x30c3'}, {L'\x30c4'}, {L'\x30c6'}, ++ /* 472 */ {L'\x30c8'}, {L'\x30ca'}, {L'\x30cb'}, {L'\x30cc'}, {L'\x30cd'}, {L'\x30ce'}, {L'\x30cf'}, {L'\x30d2'}, ++ /* 480 */ {L'\x30d5'}, {L'\x30d8'}, {L'\x30db'}, {L'\x30de'}, {L'\x30df'}, {L'\x30e0'}, {L'\x30e1'}, {L'\x30e2'}, ++ /* 488 */ {L'\x30e3'}, {L'\x30e4'}, {L'\x30e5'}, {L'\x30e6'}, {L'\x30e7'}, {L'\x30e8'}, {L'\x30e9'}, {L'\x30ea'}, ++ /* 496 */ {L'\x30eb'}, {L'\x30ec'}, {L'\x30ed'}, {L'\x30ef'}, {L'\x30f0'}, {L'\x30f1'}, {L'\x30f2'}, {L'\x30f3'}, ++ /* 504 */ {L'\x30fb'}, {L'\x30fc'}, {L'\x349e'}, {L'\x34b9'}, {L'\x34bb'}, {L'\x34df'}, {L'\x3515'}, {L'\x36ee'}, ++ /* 512 */ {L'\x36fc'}, {L'\x3781'}, {L'\x382f'}, {L'\x3862'}, {L'\x387c'}, {L'\x38c7'}, {L'\x38e3'}, {L'\x391c'}, ++ /* 520 */ {L'\x393a'}, {L'\x3a2e'}, {L'\x3a6c'}, {L'\x3ae4'}, {L'\x3b08'}, {L'\x3b19'}, {L'\x3b49'}, {L'\x3b9d'}, ++ /* 528 */ {L'\x3c18'}, {L'\x3c4e'}, {L'\x3d33'}, {L'\x3d96'}, {L'\x3eac'}, {L'\x3eb8'}, {L'\x3f1b'}, {L'\x3ffc'}, ++ /* 536 */ {L'\x4008'}, {L'\x4018'}, {L'\x4039'}, {L'\x4046'}, {L'\x4096'}, {L'\x40e3'}, {L'\x412f'}, {L'\x4202'}, ++ /* 544 */ {L'\x4227'}, {L'\x42a0'}, {L'\x4301'}, {L'\x4334'}, {L'\x4359'}, {L'\x43d5'}, {L'\x43d9'}, {L'\x440b'}, ++ /* 552 */ {L'\x446b'}, {L'\x452b'}, {L'\x455d'}, {L'\x4561'}, {L'\x456b'}, {L'\x45d7'}, {L'\x45f9'}, {L'\x4635'}, ++ /* 560 */ {L'\x46be'}, {L'\x46c7'}, {L'\x4995'}, {L'\x49e6'}, {L'\x4a6e'}, {L'\x4a76'}, {L'\x4ab2'}, {L'\x4b33'}, ++ /* 568 */ {L'\x4bce'}, {L'\x4cce'}, {L'\x4ced'}, {L'\x4cf8'}, {L'\x4d56'}, {L'\x4e00'}, {L'\x4e01'}, {L'\x4e03'}, ++ /* 576 */ {L'\x4e09'}, {L'\x4e0a'}, {L'\x4e0b'}, {L'\x4e0d'}, {L'\x4e19'}, {L'\x4e26'}, {L'\x4e28'}, {L'\x4e2d'}, ++ /* 584 */ {L'\x4e32'}, {L'\x4e36'}, {L'\x4e38'}, {L'\x4e39'}, {L'\x4e3d'}, {L'\x4e3f'}, {L'\x4e41'}, {L'\x4e59'}, ++ /* 592 */ {L'\x4e5d'}, {L'\x4e82'}, {L'\x4e85'}, {L'\x4e86'}, {L'\x4e8c'}, {L'\x4e94'}, {L'\x4ea0'}, {L'\x4ea4'}, ++ /* 600 */ {L'\x4eae'}, {L'\x4eba'}, {L'\x4ec0'}, {L'\x4ecc'}, {L'\x4ee4'}, {L'\x4f01'}, {L'\x4f11'}, {L'\x4f60'}, ++ /* 608 */ {L'\x4f80'}, {L'\x4f86'}, {L'\x4f8b'}, {L'\x4fae'}, {L'\x4fbb'}, {L'\x4fbf'}, {L'\x5002'}, {L'\x502b'}, ++ /* 616 */ {L'\x507a'}, {L'\x5099'}, {L'\x50cf'}, {L'\x50da'}, {L'\x50e7'}, {L'\x512a'}, {L'\x513f'}, {L'\x5140'}, ++ /* 624 */ {L'\x5145'}, {L'\x514d'}, {L'\x5154'}, {L'\x5164'}, {L'\x5165'}, {L'\x5167'}, {L'\x5168'}, {L'\x5169'}, ++ /* 632 */ {L'\x516b'}, {L'\x516d'}, {L'\x5177'}, {L'\x5180'}, {L'\x5182'}, {L'\x518d'}, {L'\x5192'}, {L'\x5195'}, ++ /* 640 */ {L'\x5196'}, {L'\x5197'}, {L'\x5199'}, {L'\x51a4'}, {L'\x51ab'}, {L'\x51ac'}, {L'\x51b5'}, {L'\x51b7'}, ++ /* 648 */ {L'\x51c9'}, {L'\x51cc'}, {L'\x51dc'}, {L'\x51de'}, {L'\x51e0'}, {L'\x51f5'}, {L'\x5200'}, {L'\x5203'}, ++ /* 656 */ {L'\x5207'}, {L'\x5217'}, {L'\x521d'}, {L'\x5229'}, {L'\x523a'}, {L'\x523b'}, {L'\x5246'}, {L'\x524d'}, ++ /* 664 */ {L'\x5272'}, {L'\x5277'}, {L'\x5289'}, {L'\x529b'}, {L'\x52a3'}, {L'\x52b3'}, {L'\x52b4'}, {L'\x52c7'}, ++ /* 672 */ {L'\x52c9'}, {L'\x52d2'}, {L'\x52de'}, {L'\x52e4'}, {L'\x52f5'}, {L'\x52f9'}, {L'\x52fa'}, {L'\x5305'}, ++ /* 680 */ {L'\x5306'}, {L'\x5315'}, {L'\x5317'}, {L'\x531a'}, {L'\x5338'}, {L'\x533b'}, {L'\x533f'}, {L'\x5341'}, ++ /* 688 */ {L'\x5344'}, {L'\x5345'}, {L'\x5349'}, {L'\x5351'}, {L'\x5354'}, {L'\x535a'}, {L'\x535c'}, {L'\x5369'}, ++ /* 696 */ {L'\x5370'}, {L'\x5373'}, {L'\x5375'}, {L'\x537d'}, {L'\x537f'}, {L'\x5382'}, {L'\x53b6'}, {L'\x53c3'}, ++ /* 704 */ {L'\x53c8'}, {L'\x53ca'}, {L'\x53cc'}, {L'\x53df'}, {L'\x53e3'}, {L'\x53e5'}, {L'\x53eb'}, {L'\x53ef'}, ++ /* 712 */ {L'\x53f1'}, {L'\x53f3'}, {L'\x5406'}, {L'\x5408'}, {L'\x540d'}, {L'\x540f'}, {L'\x541d'}, {L'\x5438'}, ++ /* 720 */ {L'\x5439'}, {L'\x5442'}, {L'\x5448'}, {L'\x5468'}, {L'\x549e'}, {L'\x54a2'}, {L'\x54bd'}, {L'\x54f6'}, ++ /* 728 */ {L'\x5510'}, {L'\x554f'}, {L'\x5553'}, {L'\x5555'}, {L'\x5563'}, {L'\x5584'}, {L'\x5587'}, {L'\x5599'}, ++ /* 736 */ {L'\x559d'}, {L'\x55ab'}, {L'\x55b3'}, {L'\x55b6'}, {L'\x55c0'}, {L'\x55c2'}, {L'\x55e2'}, {L'\x5606'}, ++ /* 744 */ {L'\x5651'}, {L'\x5668'}, {L'\x5674'}, {L'\x56d7'}, {L'\x56db'}, {L'\x56f9'}, {L'\x5716'}, {L'\x5717'}, ++ /* 752 */ {L'\x571f'}, {L'\x5730'}, {L'\x578b'}, {L'\x57ce'}, {L'\x57f4'}, {L'\x580d'}, {L'\x5831'}, {L'\x5832'}, ++ /* 760 */ {L'\x5840'}, {L'\x585a'}, {L'\x585e'}, {L'\x58a8'}, {L'\x58ac'}, {L'\x58b3'}, {L'\x58d8'}, {L'\x58df'}, ++ /* 768 */ {L'\x58eb'}, {L'\x58ee'}, {L'\x58f0'}, {L'\x58f2'}, {L'\x58f7'}, {L'\x5902'}, {L'\x5906'}, {L'\x590a'}, ++ /* 776 */ {L'\x5915'}, {L'\x591a'}, {L'\x591c'}, {L'\x5922'}, {L'\x5927'}, {L'\x5929'}, {L'\x5944'}, {L'\x5948'}, ++ /* 784 */ {L'\x5951'}, {L'\x5954'}, {L'\x5962'}, {L'\x5973'}, {L'\x59d8'}, {L'\x59ec'}, {L'\x5a1b'}, {L'\x5a27'}, ++ /* 792 */ {L'\x5a62'}, {L'\x5a66'}, {L'\x5ab5'}, {L'\x5b08'}, {L'\x5b28'}, {L'\x5b3e'}, {L'\x5b50'}, {L'\x5b57'}, ++ /* 800 */ {L'\x5b66'}, {L'\x5b80'}, {L'\x5b85'}, {L'\x5b97'}, {L'\x5bc3'}, {L'\x5bd8'}, {L'\x5be7'}, {L'\x5bee'}, ++ /* 808 */ {L'\x5bf3'}, {L'\x5bf8'}, {L'\x5bff'}, {L'\x5c06'}, {L'\x5c0f'}, {L'\x5c22'}, {L'\x5c38'}, {L'\x5c3f'}, ++ /* 816 */ {L'\x5c60'}, {L'\x5c62'}, {L'\x5c64'}, {L'\x5c65'}, {L'\x5c6e'}, {L'\x5c71'}, {L'\x5c8d'}, {L'\x5cc0'}, ++ /* 824 */ {L'\x5d19'}, {L'\x5d43'}, {L'\x5d50'}, {L'\x5d6b'}, {L'\x5d6e'}, {L'\x5d7c'}, {L'\x5db2'}, {L'\x5dba'}, ++ /* 832 */ {L'\x5ddb'}, {L'\x5de1'}, {L'\x5de2'}, {L'\x5de5'}, {L'\x5de6'}, {L'\x5df1'}, {L'\x5dfd'}, {L'\x5dfe'}, ++ /* 840 */ {L'\x5e28'}, {L'\x5e3d'}, {L'\x5e69'}, {L'\x5e72'}, {L'\x5e74'}, {L'\x5e7a'}, {L'\x5e7c'}, {L'\x5e7f'}, ++ /* 848 */ {L'\x5ea6'}, {L'\x5eb0'}, {L'\x5eb3'}, {L'\x5eb6'}, {L'\x5ec9'}, {L'\x5eca'}, {L'\x5ed2'}, {L'\x5ed3'}, ++ /* 856 */ {L'\x5ed9'}, {L'\x5eec'}, {L'\x5ef4'}, {L'\x5efe'}, {L'\x5f04'}, {L'\x5f0b'}, {L'\x5f13'}, {L'\x5f22'}, ++ /* 864 */ {L'\x5f50'}, {L'\x5f53'}, {L'\x5f61'}, {L'\x5f62'}, {L'\x5f69'}, {L'\x5f6b'}, {L'\x5f73'}, {L'\x5f8b'}, ++ /* 872 */ {L'\x5f8c'}, {L'\x5f97'}, {L'\x5f9a'}, {L'\x5fa9'}, {L'\x5fad'}, {L'\x5fc3'}, {L'\x5fcd'}, {L'\x5fd7'}, ++ /* 880 */ {L'\x5ff5'}, {L'\x5ff9'}, {L'\x6012'}, {L'\x601c'}, {L'\x6075'}, {L'\x6081'}, {L'\x6094'}, {L'\x60c7'}, ++ /* 888 */ {L'\x60d8'}, {L'\x60e1'}, {L'\x6108'}, {L'\x6144'}, {L'\x6148'}, {L'\x614c'}, {L'\x614e'}, {L'\x6160'}, ++ /* 896 */ {L'\x6168'}, {L'\x617a'}, {L'\x618e'}, {L'\x6190'}, {L'\x61a4'}, {L'\x61af'}, {L'\x61b2'}, {L'\x61de'}, ++ /* 904 */ {L'\x61f2'}, {L'\x61f6'}, {L'\x6200'}, {L'\x6208'}, {L'\x6210'}, {L'\x621b'}, {L'\x622e'}, {L'\x6234'}, ++ /* 912 */ {L'\x6236'}, {L'\x624b'}, {L'\x6253'}, {L'\x625d'}, {L'\x6295'}, {L'\x62b1'}, {L'\x62c9'}, {L'\x62cf'}, ++ /* 920 */ {L'\x62d3'}, {L'\x62d4'}, {L'\x62fc'}, {L'\x62fe'}, {L'\x6307'}, {L'\x633d'}, {L'\x6350'}, {L'\x6355'}, ++ /* 928 */ {L'\x6368'}, {L'\x637b'}, {L'\x6383'}, {L'\x63a0'}, {L'\x63a9'}, {L'\x63c4'}, {L'\x63c5'}, {L'\x63e4'}, ++ /* 936 */ {L'\x641c'}, {L'\x6422'}, {L'\x6452'}, {L'\x6469'}, {L'\x6477'}, {L'\x647e'}, {L'\x649a'}, {L'\x649d'}, ++ /* 944 */ {L'\x64c4'}, {L'\x652f'}, {L'\x6534'}, {L'\x654f'}, {L'\x6556'}, {L'\x656c'}, {L'\x6578'}, {L'\x6587'}, ++ /* 952 */ {L'\x6597'}, {L'\x6599'}, {L'\x65a4'}, {L'\x65b0'}, {L'\x65b9'}, {L'\x65c5'}, {L'\x65e0'}, {L'\x65e2'}, ++ /* 960 */ {L'\x65e3'}, {L'\x65e5'}, {L'\x6613'}, {L'\x6620'}, {L'\x6649'}, {L'\x6674'}, {L'\x6688'}, {L'\x6691'}, ++ /* 968 */ {L'\x669c'}, {L'\x66b4'}, {L'\x66c6'}, {L'\x66f0'}, {L'\x66f4'}, {L'\x66f8'}, {L'\x6700'}, {L'\x6708'}, ++ /* 976 */ {L'\x6709'}, {L'\x6717'}, {L'\x671b'}, {L'\x6721'}, {L'\x6728'}, {L'\x674e'}, {L'\x6753'}, {L'\x6756'}, ++ /* 984 */ {L'\x675e'}, {L'\x677b'}, {L'\x6785'}, {L'\x6797'}, {L'\x67f3'}, {L'\x67fa'}, {L'\x6817'}, {L'\x681f'}, ++ /* 992 */ {L'\x682a'}, {L'\x6852'}, {L'\x6881'}, {L'\x6885'}, {L'\x688e'}, {L'\x68a8'}, {L'\x6914'}, {L'\x6942'}, ++ /* 1000 */ {L'\x69a3'}, {L'\x69ea'}, {L'\x6a02'}, {L'\x6a13'}, {L'\x6aa8'}, {L'\x6ad3'}, {L'\x6adb'}, {L'\x6b04'}, ++ /* 1008 */ {L'\x6b20'}, {L'\x6b21'}, {L'\x6b54'}, {L'\x6b62'}, {L'\x6b63'}, {L'\x6b72'}, {L'\x6b77'}, {L'\x6b79'}, ++ /* 1016 */ {L'\x6b9f'}, {L'\x6bae'}, {L'\x6bb3'}, {L'\x6bba'}, {L'\x6bbb'}, {L'\x6bcb'}, {L'\x6bcd'}, {L'\x6bd4'}, ++ /* 1024 */ {L'\x6bdb'}, {L'\x6c0f'}, {L'\x6c14'}, {L'\x6c34'}, {L'\x6c4e'}, {L'\x6c67'}, {L'\x6c88'}, {L'\x6cbf'}, ++ /* 1032 */ {L'\x6ccc'}, {L'\x6ccd'}, {L'\x6ce5'}, {L'\x6ce8'}, {L'\x6d16'}, {L'\x6d1b'}, {L'\x6d1e'}, {L'\x6d34'}, ++ /* 1040 */ {L'\x6d3e'}, {L'\x6d41'}, {L'\x6d69'}, {L'\x6d6a'}, {L'\x6d77'}, {L'\x6d78'}, {L'\x6d85'}, {L'\x6dcb'}, ++ /* 1048 */ {L'\x6dda'}, {L'\x6dea'}, {L'\x6df9'}, {L'\x6e1a'}, {L'\x6e2f'}, {L'\x6e6e'}, {L'\x6e80'}, {L'\x6e9c'}, ++ /* 1056 */ {L'\x6eba'}, {L'\x6ec7'}, {L'\x6ecb'}, {L'\x6ed1'}, {L'\x6edb'}, {L'\x6f0f'}, {L'\x6f14'}, {L'\x6f22'}, ++ /* 1064 */ {L'\x6f23'}, {L'\x6f6e'}, {L'\x6fc6'}, {L'\x6feb'}, {L'\x6ffe'}, {L'\x701b'}, {L'\x701e'}, {L'\x7039'}, ++ /* 1072 */ {L'\x704a'}, {L'\x706b'}, {L'\x7070'}, {L'\x7077'}, {L'\x707d'}, {L'\x7099'}, {L'\x70ad'}, {L'\x70c8'}, ++ /* 1080 */ {L'\x70d9'}, {L'\x7121'}, {L'\x7145'}, {L'\x7149'}, {L'\x716e'}, {L'\x719c'}, {L'\x71ce'}, {L'\x71d0'}, ++ /* 1088 */ {L'\x7210'}, {L'\x721b'}, {L'\x7228'}, {L'\x722a'}, {L'\x722b'}, {L'\x7235'}, {L'\x7236'}, {L'\x723b'}, ++ /* 1096 */ {L'\x723f'}, {L'\x7247'}, {L'\x7250'}, {L'\x7259'}, {L'\x725b'}, {L'\x7262'}, {L'\x7279'}, {L'\x7280'}, ++ /* 1104 */ {L'\x7295'}, {L'\x72ac'}, {L'\x72af'}, {L'\x72c0'}, {L'\x72fc'}, {L'\x732a'}, {L'\x7375'}, {L'\x737a'}, ++ /* 1112 */ {L'\x7384'}, {L'\x7387'}, {L'\x7389'}, {L'\x738b'}, {L'\x73a5'}, {L'\x73b2'}, {L'\x73de'}, {L'\x7406'}, ++ /* 1120 */ {L'\x7409'}, {L'\x7422'}, {L'\x7447'}, {L'\x745c'}, {L'\x7469'}, {L'\x7471'}, {L'\x7485'}, {L'\x7489'}, ++ /* 1128 */ {L'\x7498'}, {L'\x74ca'}, {L'\x74dc'}, {L'\x74e6'}, {L'\x7506'}, {L'\x7518'}, {L'\x751f'}, {L'\x7524'}, ++ /* 1136 */ {L'\x7528'}, {L'\x7530'}, {L'\x7532'}, {L'\x7533'}, {L'\x7537'}, {L'\x753b'}, {L'\x753e'}, {L'\x7559'}, ++ /* 1144 */ {L'\x7565'}, {L'\x7570'}, {L'\x758b'}, {L'\x7592'}, {L'\x75e2'}, {L'\x7610'}, {L'\x761d'}, {L'\x761f'}, ++ /* 1152 */ {L'\x7642'}, {L'\x7669'}, {L'\x7676'}, {L'\x767d'}, {L'\x76ae'}, {L'\x76bf'}, {L'\x76ca'}, {L'\x76db'}, ++ /* 1160 */ {L'\x76e3'}, {L'\x76e7'}, {L'\x76ee'}, {L'\x76f4'}, {L'\x7701'}, {L'\x771e'}, {L'\x771f'}, {L'\x7740'}, ++ /* 1168 */ {L'\x774a'}, {L'\x778b'}, {L'\x77a7'}, {L'\x77db'}, {L'\x77e2'}, {L'\x77f3'}, {L'\x784e'}, {L'\x786b'}, ++ /* 1176 */ {L'\x788c'}, {L'\x7891'}, {L'\x78ca'}, {L'\x78cc'}, {L'\x78fb'}, {L'\x792a'}, {L'\x793a'}, {L'\x793c'}, ++ /* 1184 */ {L'\x793e'}, {L'\x7948'}, {L'\x7949'}, {L'\x7950'}, {L'\x7956'}, {L'\x795d'}, {L'\x795e'}, {L'\x7965'}, ++ /* 1192 */ {L'\x797f'}, {L'\x7981'}, {L'\x798d'}, {L'\x798e'}, {L'\x798f'}, {L'\x79ae'}, {L'\x79b8'}, {L'\x79be'}, ++ /* 1200 */ {L'\x79ca'}, {L'\x79d8'}, {L'\x79eb'}, {L'\x7a1c'}, {L'\x7a40'}, {L'\x7a4a'}, {L'\x7a4f'}, {L'\x7a74'}, ++ /* 1208 */ {L'\x7a7a'}, {L'\x7a81'}, {L'\x7ab1'}, {L'\x7acb'}, {L'\x7aee'}, {L'\x7af9'}, {L'\x7b20'}, {L'\x7b8f'}, ++ /* 1216 */ {L'\x7bc0'}, {L'\x7bc6'}, {L'\x7bc9'}, {L'\x7c3e'}, {L'\x7c60'}, {L'\x7c73'}, {L'\x7c7b'}, {L'\x7c92'}, ++ /* 1224 */ {L'\x7cbe'}, {L'\x7cd2'}, {L'\x7cd6'}, {L'\x7ce3'}, {L'\x7ce7'}, {L'\x7ce8'}, {L'\x7cf8'}, {L'\x7d00'}, ++ /* 1232 */ {L'\x7d10'}, {L'\x7d22'}, {L'\x7d2f'}, {L'\x7d42'}, {L'\x7d5b'}, {L'\x7d63'}, {L'\x7da0'}, {L'\x7dbe'}, ++ /* 1240 */ {L'\x7dc7'}, {L'\x7df4'}, {L'\x7e02'}, {L'\x7e09'}, {L'\x7e37'}, {L'\x7e41'}, {L'\x7e45'}, {L'\x7f36'}, ++ /* 1248 */ {L'\x7f3e'}, {L'\x7f51'}, {L'\x7f72'}, {L'\x7f79'}, {L'\x7f7a'}, {L'\x7f85'}, {L'\x7f8a'}, {L'\x7f95'}, ++ /* 1256 */ {L'\x7f9a'}, {L'\x7fbd'}, {L'\x7ffa'}, {L'\x8001'}, {L'\x8005'}, {L'\x800c'}, {L'\x8012'}, {L'\x8033'}, ++ /* 1264 */ {L'\x8046'}, {L'\x8060'}, {L'\x806f'}, {L'\x8070'}, {L'\x807e'}, {L'\x807f'}, {L'\x8089'}, {L'\x808b'}, ++ /* 1272 */ {L'\x80ad'}, {L'\x80b2'}, {L'\x8103'}, {L'\x813e'}, {L'\x81d8'}, {L'\x81e3'}, {L'\x81e8'}, {L'\x81ea'}, ++ /* 1280 */ {L'\x81ed'}, {L'\x81f3'}, {L'\x81fc'}, {L'\x8201'}, {L'\x8204'}, {L'\x820c'}, {L'\x8218'}, {L'\x821b'}, ++ /* 1288 */ {L'\x821f'}, {L'\x826e'}, {L'\x826f'}, {L'\x8272'}, {L'\x8278'}, {L'\x8279'}, {L'\x828b'}, {L'\x8291'}, ++ /* 1296 */ {L'\x829d'}, {L'\x82b1'}, {L'\x82b3'}, {L'\x82bd'}, {L'\x82e5'}, {L'\x82e6'}, {L'\x831d'}, {L'\x8323'}, ++ /* 1304 */ {L'\x8336'}, {L'\x8352'}, {L'\x8353'}, {L'\x8363'}, {L'\x83ad'}, {L'\x83bd'}, {L'\x83c9'}, {L'\x83ca'}, ++ /* 1312 */ {L'\x83cc'}, {L'\x83dc'}, {L'\x83e7'}, {L'\x83ef'}, {L'\x83f1'}, {L'\x843d'}, {L'\x8449'}, {L'\x8457'}, ++ /* 1320 */ {L'\x84ee'}, {L'\x84f1'}, {L'\x84f3'}, {L'\x84fc'}, {L'\x8516'}, {L'\x8564'}, {L'\x85cd'}, {L'\x85fa'}, ++ /* 1328 */ {L'\x8606'}, {L'\x8612'}, {L'\x862d'}, {L'\x863f'}, {L'\x864d'}, {L'\x8650'}, {L'\x865c'}, {L'\x8667'}, ++ /* 1336 */ {L'\x8669'}, {L'\x866b'}, {L'\x8688'}, {L'\x86a9'}, {L'\x86e2'}, {L'\x870e'}, {L'\x8728'}, {L'\x876b'}, ++ /* 1344 */ {L'\x8779'}, {L'\x8786'}, {L'\x87ba'}, {L'\x87e1'}, {L'\x8801'}, {L'\x881f'}, {L'\x8840'}, {L'\x884c'}, ++ /* 1352 */ {L'\x8860'}, {L'\x8863'}, {L'\x88c2'}, {L'\x88cf'}, {L'\x88d7'}, {L'\x88de'}, {L'\x88e1'}, {L'\x88f8'}, ++ /* 1360 */ {L'\x88fa'}, {L'\x8910'}, {L'\x8941'}, {L'\x8964'}, {L'\x897e'}, {L'\x8986'}, {L'\x898b'}, {L'\x8996'}, ++ /* 1368 */ {L'\x89d2'}, {L'\x89e3'}, {L'\x8a00'}, {L'\x8aa0'}, {L'\x8aaa'}, {L'\x8abf'}, {L'\x8acb'}, {L'\x8ad2'}, ++ /* 1376 */ {L'\x8ad6'}, {L'\x8aed'}, {L'\x8af8'}, {L'\x8afe'}, {L'\x8b01'}, {L'\x8b39'}, {L'\x8b58'}, {L'\x8b80'}, ++ /* 1384 */ {L'\x8b8a'}, {L'\x8c37'}, {L'\x8c46'}, {L'\x8c48'}, {L'\x8c55'}, {L'\x8c78'}, {L'\x8c9d'}, {L'\x8ca1'}, ++ /* 1392 */ {L'\x8ca9'}, {L'\x8cab'}, {L'\x8cc1'}, {L'\x8cc2'}, {L'\x8cc7'}, {L'\x8cc8'}, {L'\x8cd3'}, {L'\x8d08'}, ++ /* 1400 */ {L'\x8d1b'}, {L'\x8d64'}, {L'\x8d70'}, {L'\x8d77'}, {L'\x8db3'}, {L'\x8dbc'}, {L'\x8dcb'}, {L'\x8def'}, ++ /* 1408 */ {L'\x8df0'}, {L'\x8eab'}, {L'\x8eca'}, {L'\x8ed4'}, {L'\x8f26'}, {L'\x8f2a'}, {L'\x8f38'}, {L'\x8f3b'}, ++ /* 1416 */ {L'\x8f62'}, {L'\x8f9b'}, {L'\x8f9e'}, {L'\x8fb0'}, {L'\x8fb5'}, {L'\x8fb6'}, {L'\x9023'}, {L'\x9038'}, ++ /* 1424 */ {L'\x904a'}, {L'\x9069'}, {L'\x9072'}, {L'\x907c'}, {L'\x908f'}, {L'\x9091'}, {L'\x9094'}, {L'\x90ce'}, ++ /* 1432 */ {L'\x90de'}, {L'\x90f1'}, {L'\x90fd'}, {L'\x9111'}, {L'\x911b'}, {L'\x9149'}, {L'\x914d'}, {L'\x916a'}, ++ /* 1440 */ {L'\x9199'}, {L'\x91b4'}, {L'\x91c6'}, {L'\x91cc'}, {L'\x91cf'}, {L'\x91d1'}, {L'\x9234'}, {L'\x9238'}, ++ /* 1448 */ {L'\x9276'}, {L'\x927c'}, {L'\x92d7'}, {L'\x92d8'}, {L'\x9304'}, {L'\x934a'}, {L'\x93f9'}, {L'\x9415'}, ++ /* 1456 */ {L'\x9577'}, {L'\x9580'}, {L'\x958b'}, {L'\x95ad'}, {L'\x95b7'}, {L'\x961c'}, {L'\x962e'}, {L'\x964b'}, ++ /* 1464 */ {L'\x964d'}, {L'\x9675'}, {L'\x9678'}, {L'\x967c'}, {L'\x9686'}, {L'\x96a3'}, {L'\x96b6'}, {L'\x96b7'}, ++ /* 1472 */ {L'\x96b8'}, {L'\x96b9'}, {L'\x96c3'}, {L'\x96e2'}, {L'\x96e3'}, {L'\x96e8'}, {L'\x96f6'}, {L'\x96f7'}, ++ /* 1480 */ {L'\x9723'}, {L'\x9732'}, {L'\x9748'}, {L'\x9751'}, {L'\x9756'}, {L'\x975e'}, {L'\x9762'}, {L'\x9769'}, ++ /* 1488 */ {L'\x97cb'}, {L'\x97db'}, {L'\x97e0'}, {L'\x97ed'}, {L'\x97f3'}, {L'\x97ff'}, {L'\x9801'}, {L'\x9805'}, ++ /* 1496 */ {L'\x980b'}, {L'\x9818'}, {L'\x9829'}, {L'\x983b'}, {L'\x985e'}, {L'\x98a8'}, {L'\x98db'}, {L'\x98df'}, ++ /* 1504 */ {L'\x98e2'}, {L'\x98ef'}, {L'\x98fc'}, {L'\x9928'}, {L'\x9929'}, {L'\x9996'}, {L'\x9999'}, {L'\x99a7'}, ++ /* 1512 */ {L'\x99ac'}, {L'\x99c2'}, {L'\x99f1'}, {L'\x99fe'}, {L'\x9a6a'}, {L'\x9aa8'}, {L'\x9ad8'}, {L'\x9adf'}, ++ /* 1520 */ {L'\x9b12'}, {L'\x9b25'}, {L'\x9b2f'}, {L'\x9b32'}, {L'\x9b3c'}, {L'\x9b5a'}, {L'\x9b6f'}, {L'\x9c40'}, ++ /* 1528 */ {L'\x9c57'}, {L'\x9ce5'}, {L'\x9cfd'}, {L'\x9d67'}, {L'\x9db4'}, {L'\x9dfa'}, {L'\x9e1e'}, {L'\x9e75'}, ++ /* 1536 */ {L'\x9e7f'}, {L'\x9e97'}, {L'\x9e9f'}, {L'\x9ea5'}, {L'\x9ebb'}, {L'\x9ec3'}, {L'\x9ecd'}, {L'\x9ece'}, ++ /* 1544 */ {L'\x9ed1'}, {L'\x9ef9'}, {L'\x9efd'}, {L'\x9efe'}, {L'\x9f05'}, {L'\x9f0e'}, {L'\x9f0f'}, {L'\x9f13'}, ++ /* 1552 */ {L'\x9f16'}, {L'\x9f20'}, {L'\x9f3b'}, {L'\x9f43'}, {L'\x9f4a'}, {L'\x9f52'}, {L'\x9f8d'}, {L'\x9f8e'}, ++ /* 1560 */ {L'\x9f9c'}, {L'\x9f9f'}, {L'\x9fa0'}, {L'\xa727'}, {L'\xa76f'}, {L'\xa78e'}, {L'\xab37'}, {L'\xab52'}, ++ /* 1568 */ {L'\xab66'}, {L'\xab67'}, {L']'}, {L'^'}, {L'_'}, {L'`'}, {L'a'}, {L'b'}, ++ /* 1576 */ {L'c'}, {L'd'}, {L'e'}, {L'f'}, {L'g'}, {L'h'}, {L'i'}, {L'j'}, ++ /* 1584 */ {L'k'}, {L'l'}, {L'm'}, {L'n'}, {L'o'}, {L'p'}, {L'q'}, {L'r'}, ++ /* 1592 */ {L's'}, {L't'}, {L'u'}, {L'v'}, {L'w'}, {L'x'}, {L'y'}, {L'z'}, ++ /* 1600 */ {L'{'}, {L'|'}, {L'}'}, {L'~'}}; ++ ++static const wchar_t UNWIF_compat_tbl_2 [1292][2] = { + /* 0 */ {L'.',L'.'}, {L'0',L','}, {L'0',L'.'}, {L'0',L'\x70b9'}, {L'1',L','}, {L'1',L'.'}, {L'1',L'0'}, {L'1',L'1'}, + /* 8 */ {L'1',L'2'}, {L'1',L'3'}, {L'1',L'4'}, {L'1',L'5'}, {L'1',L'6'}, {L'1',L'7'}, {L'1',L'8'}, {L'1',L'9'}, + /* 16 */ {L'1',L'\x2044'}, {L'1',L'\x65e5'}, {L'1',L'\x6708'}, {L'1',L'\x70b9'}, {L'2',L','}, {L'2',L'.'}, {L'2',L'0'}, {L'2',L'1'}, +@@ -336,52 +342,53 @@ static const wchar_t UNWIF_compat_tbl_2 [1286][2] = { + /* 896 */ {L'\x30c1',L'\x3099'}, {L'\x30c4',L'\x3099'}, {L'\x30c6',L'\x3099'}, {L'\x30c8',L'\x3099'}, {L'\x30c8',L'\x30f3'}, {L'\x30ca',L'\x30ce'}, {L'\x30cf',L'\x3099'}, {L'\x30cf',L'\x309a'}, + /* 904 */ {L'\x30d2',L'\x3099'}, {L'\x30d2',L'\x309a'}, {L'\x30d5',L'\x3099'}, {L'\x30d5',L'\x309a'}, {L'\x30d8',L'\x3099'}, {L'\x30d8',L'\x309a'}, {L'\x30db',L'\x3099'}, {L'\x30db',L'\x309a'}, + /* 912 */ {L'\x30db',L'\x30f3'}, {L'\x30df',L'\x30ea'}, {L'\x30ea',L'\x30e9'}, {L'\x30ec',L'\x30e0'}, {L'\x30ef',L'\x3099'}, {L'\x30f0',L'\x3099'}, {L'\x30f1',L'\x3099'}, {L'\x30f2',L'\x3099'}, +- /* 920 */ {L'\x30fd',L'\x3099'}, {L'\x4ee4',L'\x548c'}, {L'\x5927',L'\x6b63'}, {L'\x5e73',L'\x6210'}, {L'\x660e',L'\x6cbb'}, {L'\x662d',L'\x548c'}, {L'\xd840',L'\xdd22'}, {L'\xd841',L'\xdd1c'}, +- /* 928 */ {L'\xd841',L'\xdd25'}, {L'\xd841',L'\xdd4b'}, {L'\xd841',L'\xde3a'}, {L'\xd842',L'\xdc04'}, {L'\xd842',L'\xdcde'}, {L'\xd842',L'\xde2c'}, {L'\xd842',L'\xdf63'}, {L'\xd845',L'\xdce4'}, +- /* 936 */ {L'\xd845',L'\xdea8'}, {L'\xd845',L'\xdeea'}, {L'\xd846',L'\xddc8'}, {L'\xd846',L'\xdf18'}, {L'\xd847',L'\xdd0b'}, {L'\xd847',L'\xdde4'}, {L'\xd847',L'\xdde6'}, {L'\xd848',L'\xdd83'}, +- /* 944 */ {L'\xd848',L'\xdd9f'}, {L'\xd848',L'\xdf31'}, {L'\xd849',L'\xded4'}, {L'\xd84a',L'\xdc44'}, {L'\xd84a',L'\xdc4a'}, {L'\xd84a',L'\xdf0c'}, {L'\xd84a',L'\xdff1'}, {L'\xd84c',L'\xdc0a'}, +- /* 952 */ {L'\xd84c',L'\xdeb8'}, {L'\xd84c',L'\xdf5f'}, {L'\xd84c',L'\xdf93'}, {L'\xd84c',L'\xdf9c'}, {L'\xd84c',L'\xdfc3'}, {L'\xd84c',L'\xdfd5'}, {L'\xd84d',L'\xdc6d'}, {L'\xd84d',L'\xdea3'}, +- /* 960 */ {L'\xd84e',L'\xdca7'}, {L'\xd84e',L'\xde8d'}, {L'\xd84e',L'\xdefa'}, {L'\xd84f',L'\xdcbc'}, {L'\xd84f',L'\xdd1e'}, {L'\xd84f',L'\xded1'}, {L'\xd84f',L'\xdf5e'}, {L'\xd84f',L'\xdf8e'}, +- /* 968 */ {L'\xd850',L'\xde63'}, {L'\xd850',L'\xdeee'}, {L'\xd850',L'\xdfab'}, {L'\xd851',L'\xde08'}, {L'\xd851',L'\xdf35'}, {L'\xd852',L'\xdc14'}, {L'\xd853',L'\xdc36'}, {L'\xd853',L'\xdc92'}, +- /* 976 */ {L'\xd853',L'\xdfa1'}, {L'\xd853',L'\xdfb8'}, {L'\xd854',L'\xdc44'}, {L'\xd854',L'\xdcf2'}, {L'\xd854',L'\xdcf3'}, {L'\xd854',L'\xdd19'}, {L'\xd854',L'\xdd33'}, {L'\xd854',L'\xde49'}, +- /* 984 */ {L'\xd855',L'\xdc1d'}, {L'\xd855',L'\xde26'}, {L'\xd855',L'\xde9a'}, {L'\xd855',L'\xdec5'}, {L'\xd856',L'\xdd7c'}, {L'\xd856',L'\xdea7'}, {L'\xd856',L'\xdfab'}, {L'\xd857',L'\xdc80'}, +- /* 992 */ {L'\xd857',L'\xdcd0'}, {L'\xd857',L'\xdf86'}, {L'\xd858',L'\xddda'}, {L'\xd858',L'\xde28'}, {L'\xd858',L'\xde47'}, {L'\xd858',L'\xded9'}, {L'\xd858',L'\xdf3e'}, {L'\xd859',L'\xdcda'}, +- /* 1000 */ {L'\xd859',L'\xdd23'}, {L'\xd859',L'\xdda8'}, {L'\xd859',L'\xdfa7'}, {L'\xd859',L'\xdfb5'}, {L'\xd85a',L'\xdf3c'}, {L'\xd85b',L'\xdc36'}, {L'\xd85b',L'\xdcd5'}, {L'\xd85b',L'\xdd6b'}, +- /* 1008 */ {L'\xd85b',L'\xdf2c'}, {L'\xd85b',L'\xdfb1'}, {L'\xd85c',L'\xdcd2'}, {L'\xd85c',L'\xdfca'}, {L'\xd85d',L'\xde67'}, {L'\xd85e',L'\xdcae'}, {L'\xd85e',L'\xdd66'}, {L'\xd85f',L'\xdca8'}, +- /* 1016 */ {L'\xd85f',L'\xded3'}, {L'\xd85f',L'\xdf2f'}, {L'\xd861',L'\xddd2'}, {L'\xd861',L'\xdded'}, {L'\xd861',L'\xdf2e'}, {L'\xd862',L'\xdffa'}, {L'\xd863',L'\xdd77'}, {L'\xd864',L'\xdd45'}, +- /* 1024 */ {L'\xd864',L'\xdddf'}, {L'\xd864',L'\xde1a'}, {L'\xd865',L'\xdc0a'}, {L'\xd865',L'\xdc96'}, {L'\xd865',L'\xddb6'}, {L'\xd866',L'\xdf30'}, {L'\xd868',L'\xdcce'}, {L'\xd868',L'\xdd05'}, +- /* 1032 */ {L'\xd868',L'\xde0e'}, {L'\xd868',L'\xde91'}, {L'\xd868',L'\xdf92'}, {L'\xd869',L'\xde00'}, {L'a',L'\x02be'}, {L'a',L'\x0300'}, {L'a',L'\x0301'}, {L'a',L'\x0302'}, +- /* 1040 */ {L'a',L'\x0303'}, {L'a',L'\x0304'}, {L'a',L'\x0306'}, {L'a',L'\x0307'}, {L'a',L'\x0308'}, {L'a',L'\x0309'}, {L'a',L'\x030a'}, {L'a',L'\x030c'}, +- /* 1048 */ {L'a',L'\x030f'}, {L'a',L'\x0311'}, {L'a',L'\x0323'}, {L'a',L'\x0325'}, {L'a',L'\x0328'}, {L'b',L'\x0307'}, {L'b',L'\x0323'}, {L'b',L'\x0331'}, +- /* 1056 */ {L'c',L'\x0301'}, {L'c',L'\x0302'}, {L'c',L'\x0307'}, {L'c',L'\x030c'}, {L'c',L'\x0327'}, {L'c',L'c'}, {L'c',L'd'}, {L'c',L'm'}, +- /* 1064 */ {L'd',L'B'}, {L'd',L'\x0307'}, {L'd',L'\x030c'}, {L'd',L'\x0323'}, {L'd',L'\x0327'}, {L'd',L'\x032d'}, {L'd',L'\x0331'}, {L'd',L'a'}, +- /* 1072 */ {L'd',L'l'}, {L'd',L'm'}, {L'd',L'z'}, {L'e',L'V'}, {L'e',L'\x0300'}, {L'e',L'\x0301'}, {L'e',L'\x0302'}, {L'e',L'\x0303'}, +- /* 1080 */ {L'e',L'\x0304'}, {L'e',L'\x0306'}, {L'e',L'\x0307'}, {L'e',L'\x0308'}, {L'e',L'\x0309'}, {L'e',L'\x030c'}, {L'e',L'\x030f'}, {L'e',L'\x0311'}, +- /* 1088 */ {L'e',L'\x0323'}, {L'e',L'\x0327'}, {L'e',L'\x0328'}, {L'e',L'\x032d'}, {L'e',L'\x0330'}, {L'f',L'\x0307'}, {L'f',L'f'}, {L'f',L'i'}, +- /* 1096 */ {L'f',L'l'}, {L'f',L'm'}, {L'g',L'\x0301'}, {L'g',L'\x0302'}, {L'g',L'\x0304'}, {L'g',L'\x0306'}, {L'g',L'\x0307'}, {L'g',L'\x030c'}, +- /* 1104 */ {L'g',L'\x0327'}, {L'h',L'\x0302'}, {L'h',L'\x0307'}, {L'h',L'\x0308'}, {L'h',L'\x030c'}, {L'h',L'\x0323'}, {L'h',L'\x0327'}, {L'h',L'\x032e'}, +- /* 1112 */ {L'h',L'\x0331'}, {L'h',L'a'}, {L'i',L'\x0300'}, {L'i',L'\x0301'}, {L'i',L'\x0302'}, {L'i',L'\x0303'}, {L'i',L'\x0304'}, {L'i',L'\x0306'}, +- /* 1120 */ {L'i',L'\x0308'}, {L'i',L'\x0309'}, {L'i',L'\x030c'}, {L'i',L'\x030f'}, {L'i',L'\x0311'}, {L'i',L'\x0323'}, {L'i',L'\x0328'}, {L'i',L'\x0330'}, +- /* 1128 */ {L'i',L'i'}, {L'i',L'j'}, {L'i',L'n'}, {L'i',L'v'}, {L'i',L'x'}, {L'j',L'\x0302'}, {L'j',L'\x030c'}, {L'k',L'A'}, +- /* 1136 */ {L'k',L'V'}, {L'k',L'W'}, {L'k',L'\x0301'}, {L'k',L'\x030c'}, {L'k',L'\x0323'}, {L'k',L'\x0327'}, {L'k',L'\x0331'}, {L'k',L'\x03a9'}, +- /* 1144 */ {L'k',L'g'}, {L'k',L'l'}, {L'k',L'm'}, {L'k',L't'}, {L'l',L'\x00b7'}, {L'l',L'\x0301'}, {L'l',L'\x030c'}, {L'l',L'\x0323'}, +- /* 1152 */ {L'l',L'\x0327'}, {L'l',L'\x032d'}, {L'l',L'\x0331'}, {L'l',L'j'}, {L'l',L'm'}, {L'l',L'n'}, {L'l',L'x'}, {L'm',L'2'}, +- /* 1160 */ {L'm',L'3'}, {L'm',L'A'}, {L'm',L'V'}, {L'm',L'W'}, {L'm',L'\x0301'}, {L'm',L'\x0307'}, {L'm',L'\x0323'}, {L'm',L'b'}, +- /* 1168 */ {L'm',L'g'}, {L'm',L'l'}, {L'm',L'm'}, {L'm',L's'}, {L'n',L'A'}, {L'n',L'F'}, {L'n',L'V'}, {L'n',L'W'}, +- /* 1176 */ {L'n',L'\x0300'}, {L'n',L'\x0301'}, {L'n',L'\x0303'}, {L'n',L'\x0307'}, {L'n',L'\x030c'}, {L'n',L'\x0323'}, {L'n',L'\x0327'}, {L'n',L'\x032d'}, +- /* 1184 */ {L'n',L'\x0331'}, {L'n',L'j'}, {L'n',L'm'}, {L'n',L's'}, {L'o',L'V'}, {L'o',L'\x0300'}, {L'o',L'\x0301'}, {L'o',L'\x0302'}, +- /* 1192 */ {L'o',L'\x0303'}, {L'o',L'\x0304'}, {L'o',L'\x0306'}, {L'o',L'\x0307'}, {L'o',L'\x0308'}, {L'o',L'\x0309'}, {L'o',L'\x030b'}, {L'o',L'\x030c'}, +- /* 1200 */ {L'o',L'\x030f'}, {L'o',L'\x0311'}, {L'o',L'\x031b'}, {L'o',L'\x0323'}, {L'o',L'\x0328'}, {L'p',L'A'}, {L'p',L'F'}, {L'p',L'V'}, +- /* 1208 */ {L'p',L'W'}, {L'p',L'\x0301'}, {L'p',L'\x0307'}, {L'p',L'c'}, {L'p',L's'}, {L'r',L'\x0301'}, {L'r',L'\x0307'}, {L'r',L'\x030c'}, +- /* 1216 */ {L'r',L'\x030f'}, {L'r',L'\x0311'}, {L'r',L'\x0323'}, {L'r',L'\x0327'}, {L'r',L'\x0331'}, {L's',L'\x0301'}, {L's',L'\x0302'}, {L's',L'\x0307'}, +- /* 1224 */ {L's',L'\x030c'}, {L's',L'\x0323'}, {L's',L'\x0326'}, {L's',L'\x0327'}, {L's',L'r'}, {L's',L't'}, {L't',L'\x0307'}, {L't',L'\x0308'}, +- /* 1232 */ {L't',L'\x030c'}, {L't',L'\x0323'}, {L't',L'\x0326'}, {L't',L'\x0327'}, {L't',L'\x032d'}, {L't',L'\x0331'}, {L'u',L'\x0300'}, {L'u',L'\x0301'}, +- /* 1240 */ {L'u',L'\x0302'}, {L'u',L'\x0303'}, {L'u',L'\x0304'}, {L'u',L'\x0306'}, {L'u',L'\x0308'}, {L'u',L'\x0309'}, {L'u',L'\x030a'}, {L'u',L'\x030b'}, +- /* 1248 */ {L'u',L'\x030c'}, {L'u',L'\x030f'}, {L'u',L'\x0311'}, {L'u',L'\x031b'}, {L'u',L'\x0323'}, {L'u',L'\x0324'}, {L'u',L'\x0328'}, {L'u',L'\x032d'}, +- /* 1256 */ {L'u',L'\x0330'}, {L'v',L'\x0303'}, {L'v',L'\x0323'}, {L'v',L'i'}, {L'w',L'\x0300'}, {L'w',L'\x0301'}, {L'w',L'\x0302'}, {L'w',L'\x0307'}, +- /* 1264 */ {L'w',L'\x0308'}, {L'w',L'\x030a'}, {L'w',L'\x0323'}, {L'x',L'\x0307'}, {L'x',L'\x0308'}, {L'x',L'i'}, {L'y',L'\x0300'}, {L'y',L'\x0301'}, +- /* 1272 */ {L'y',L'\x0302'}, {L'y',L'\x0303'}, {L'y',L'\x0304'}, {L'y',L'\x0307'}, {L'y',L'\x0308'}, {L'y',L'\x0309'}, {L'y',L'\x030a'}, {L'y',L'\x0323'}, +- /* 1280 */ {L'z',L'\x0301'}, {L'z',L'\x0302'}, {L'z',L'\x0307'}, {L'z',L'\x030c'}, {L'z',L'\x0323'}, {L'z',L'\x0331'}}; ++ /* 920 */ {L'\x30fd',L'\x3099'}, {L'\x4ee4',L'\x548c'}, {L'\x5927',L'\x6b63'}, {L'\x5e73',L'\x6210'}, {L'\x660e',L'\x6cbb'}, {L'\x662d',L'\x548c'}, {L'\xd837',L'\xdf04'}, {L'\xd837',L'\xdf05'}, ++ /* 928 */ {L'\xd837',L'\xdf06'}, {L'\xd837',L'\xdf08'}, {L'\xd837',L'\xdf0a'}, {L'\xd837',L'\xdf1e'}, {L'\xd840',L'\xdd22'}, {L'\xd841',L'\xdd1c'}, {L'\xd841',L'\xdd25'}, {L'\xd841',L'\xdd4b'}, ++ /* 936 */ {L'\xd841',L'\xde3a'}, {L'\xd842',L'\xdc04'}, {L'\xd842',L'\xdcde'}, {L'\xd842',L'\xde2c'}, {L'\xd842',L'\xdf63'}, {L'\xd845',L'\xdce4'}, {L'\xd845',L'\xdea8'}, {L'\xd845',L'\xdeea'}, ++ /* 944 */ {L'\xd846',L'\xddc8'}, {L'\xd846',L'\xdf18'}, {L'\xd847',L'\xdd0b'}, {L'\xd847',L'\xdde4'}, {L'\xd847',L'\xdde6'}, {L'\xd848',L'\xdd83'}, {L'\xd848',L'\xdd9f'}, {L'\xd848',L'\xdf31'}, ++ /* 952 */ {L'\xd849',L'\xded4'}, {L'\xd84a',L'\xdc44'}, {L'\xd84a',L'\xdc4a'}, {L'\xd84a',L'\xdf0c'}, {L'\xd84a',L'\xdff1'}, {L'\xd84c',L'\xdc0a'}, {L'\xd84c',L'\xdeb8'}, {L'\xd84c',L'\xdf5f'}, ++ /* 960 */ {L'\xd84c',L'\xdf93'}, {L'\xd84c',L'\xdf9c'}, {L'\xd84c',L'\xdfc3'}, {L'\xd84c',L'\xdfd5'}, {L'\xd84d',L'\xdc6d'}, {L'\xd84d',L'\xdea3'}, {L'\xd84e',L'\xdca7'}, {L'\xd84e',L'\xde8d'}, ++ /* 968 */ {L'\xd84e',L'\xdefa'}, {L'\xd84f',L'\xdcbc'}, {L'\xd84f',L'\xdd1e'}, {L'\xd84f',L'\xded1'}, {L'\xd84f',L'\xdf5e'}, {L'\xd84f',L'\xdf8e'}, {L'\xd850',L'\xde63'}, {L'\xd850',L'\xdeee'}, ++ /* 976 */ {L'\xd850',L'\xdfab'}, {L'\xd851',L'\xde08'}, {L'\xd851',L'\xdf35'}, {L'\xd852',L'\xdc14'}, {L'\xd853',L'\xdc36'}, {L'\xd853',L'\xdc92'}, {L'\xd853',L'\xdfa1'}, {L'\xd853',L'\xdfb8'}, ++ /* 984 */ {L'\xd854',L'\xdc44'}, {L'\xd854',L'\xdcf2'}, {L'\xd854',L'\xdcf3'}, {L'\xd854',L'\xdd19'}, {L'\xd854',L'\xdd33'}, {L'\xd854',L'\xde49'}, {L'\xd855',L'\xdc1d'}, {L'\xd855',L'\xde26'}, ++ /* 992 */ {L'\xd855',L'\xde9a'}, {L'\xd855',L'\xdec5'}, {L'\xd856',L'\xdd7c'}, {L'\xd856',L'\xdea7'}, {L'\xd856',L'\xdfab'}, {L'\xd857',L'\xdc80'}, {L'\xd857',L'\xdcd0'}, {L'\xd857',L'\xdf86'}, ++ /* 1000 */ {L'\xd858',L'\xddda'}, {L'\xd858',L'\xde28'}, {L'\xd858',L'\xde47'}, {L'\xd858',L'\xded9'}, {L'\xd858',L'\xdf3e'}, {L'\xd859',L'\xdcda'}, {L'\xd859',L'\xdd23'}, {L'\xd859',L'\xdda8'}, ++ /* 1008 */ {L'\xd859',L'\xdfa7'}, {L'\xd859',L'\xdfb5'}, {L'\xd85a',L'\xdf3c'}, {L'\xd85b',L'\xdc36'}, {L'\xd85b',L'\xdcd5'}, {L'\xd85b',L'\xdd6b'}, {L'\xd85b',L'\xdf2c'}, {L'\xd85b',L'\xdfb1'}, ++ /* 1016 */ {L'\xd85c',L'\xdcd2'}, {L'\xd85c',L'\xdfca'}, {L'\xd85d',L'\xde67'}, {L'\xd85e',L'\xdcae'}, {L'\xd85e',L'\xdd66'}, {L'\xd85f',L'\xdca8'}, {L'\xd85f',L'\xded3'}, {L'\xd85f',L'\xdf2f'}, ++ /* 1024 */ {L'\xd861',L'\xddd2'}, {L'\xd861',L'\xdded'}, {L'\xd861',L'\xdf2e'}, {L'\xd862',L'\xdffa'}, {L'\xd863',L'\xdd77'}, {L'\xd864',L'\xdd45'}, {L'\xd864',L'\xdddf'}, {L'\xd864',L'\xde1a'}, ++ /* 1032 */ {L'\xd865',L'\xdc0a'}, {L'\xd865',L'\xdc96'}, {L'\xd865',L'\xddb6'}, {L'\xd866',L'\xdf30'}, {L'\xd868',L'\xdcce'}, {L'\xd868',L'\xdd05'}, {L'\xd868',L'\xde0e'}, {L'\xd868',L'\xde91'}, ++ /* 1040 */ {L'\xd868',L'\xdf92'}, {L'\xd869',L'\xde00'}, {L'a',L'\x02be'}, {L'a',L'\x0300'}, {L'a',L'\x0301'}, {L'a',L'\x0302'}, {L'a',L'\x0303'}, {L'a',L'\x0304'}, ++ /* 1048 */ {L'a',L'\x0306'}, {L'a',L'\x0307'}, {L'a',L'\x0308'}, {L'a',L'\x0309'}, {L'a',L'\x030a'}, {L'a',L'\x030c'}, {L'a',L'\x030f'}, {L'a',L'\x0311'}, ++ /* 1056 */ {L'a',L'\x0323'}, {L'a',L'\x0325'}, {L'a',L'\x0328'}, {L'b',L'\x0307'}, {L'b',L'\x0323'}, {L'b',L'\x0331'}, {L'c',L'\x0301'}, {L'c',L'\x0302'}, ++ /* 1064 */ {L'c',L'\x0307'}, {L'c',L'\x030c'}, {L'c',L'\x0327'}, {L'c',L'c'}, {L'c',L'd'}, {L'c',L'm'}, {L'd',L'B'}, {L'd',L'\x0307'}, ++ /* 1072 */ {L'd',L'\x030c'}, {L'd',L'\x0323'}, {L'd',L'\x0327'}, {L'd',L'\x032d'}, {L'd',L'\x0331'}, {L'd',L'a'}, {L'd',L'l'}, {L'd',L'm'}, ++ /* 1080 */ {L'd',L'z'}, {L'e',L'V'}, {L'e',L'\x0300'}, {L'e',L'\x0301'}, {L'e',L'\x0302'}, {L'e',L'\x0303'}, {L'e',L'\x0304'}, {L'e',L'\x0306'}, ++ /* 1088 */ {L'e',L'\x0307'}, {L'e',L'\x0308'}, {L'e',L'\x0309'}, {L'e',L'\x030c'}, {L'e',L'\x030f'}, {L'e',L'\x0311'}, {L'e',L'\x0323'}, {L'e',L'\x0327'}, ++ /* 1096 */ {L'e',L'\x0328'}, {L'e',L'\x032d'}, {L'e',L'\x0330'}, {L'f',L'\x0307'}, {L'f',L'f'}, {L'f',L'i'}, {L'f',L'l'}, {L'f',L'm'}, ++ /* 1104 */ {L'g',L'\x0301'}, {L'g',L'\x0302'}, {L'g',L'\x0304'}, {L'g',L'\x0306'}, {L'g',L'\x0307'}, {L'g',L'\x030c'}, {L'g',L'\x0327'}, {L'h',L'\x0302'}, ++ /* 1112 */ {L'h',L'\x0307'}, {L'h',L'\x0308'}, {L'h',L'\x030c'}, {L'h',L'\x0323'}, {L'h',L'\x0327'}, {L'h',L'\x032e'}, {L'h',L'\x0331'}, {L'h',L'a'}, ++ /* 1120 */ {L'i',L'\x0300'}, {L'i',L'\x0301'}, {L'i',L'\x0302'}, {L'i',L'\x0303'}, {L'i',L'\x0304'}, {L'i',L'\x0306'}, {L'i',L'\x0308'}, {L'i',L'\x0309'}, ++ /* 1128 */ {L'i',L'\x030c'}, {L'i',L'\x030f'}, {L'i',L'\x0311'}, {L'i',L'\x0323'}, {L'i',L'\x0328'}, {L'i',L'\x0330'}, {L'i',L'i'}, {L'i',L'j'}, ++ /* 1136 */ {L'i',L'n'}, {L'i',L'v'}, {L'i',L'x'}, {L'j',L'\x0302'}, {L'j',L'\x030c'}, {L'k',L'A'}, {L'k',L'V'}, {L'k',L'W'}, ++ /* 1144 */ {L'k',L'\x0301'}, {L'k',L'\x030c'}, {L'k',L'\x0323'}, {L'k',L'\x0327'}, {L'k',L'\x0331'}, {L'k',L'\x03a9'}, {L'k',L'g'}, {L'k',L'l'}, ++ /* 1152 */ {L'k',L'm'}, {L'k',L't'}, {L'l',L'\x00b7'}, {L'l',L'\x0301'}, {L'l',L'\x030c'}, {L'l',L'\x0323'}, {L'l',L'\x0327'}, {L'l',L'\x032d'}, ++ /* 1160 */ {L'l',L'\x0331'}, {L'l',L'j'}, {L'l',L'm'}, {L'l',L'n'}, {L'l',L'x'}, {L'm',L'2'}, {L'm',L'3'}, {L'm',L'A'}, ++ /* 1168 */ {L'm',L'V'}, {L'm',L'W'}, {L'm',L'\x0301'}, {L'm',L'\x0307'}, {L'm',L'\x0323'}, {L'm',L'b'}, {L'm',L'g'}, {L'm',L'l'}, ++ /* 1176 */ {L'm',L'm'}, {L'm',L's'}, {L'n',L'A'}, {L'n',L'F'}, {L'n',L'V'}, {L'n',L'W'}, {L'n',L'\x0300'}, {L'n',L'\x0301'}, ++ /* 1184 */ {L'n',L'\x0303'}, {L'n',L'\x0307'}, {L'n',L'\x030c'}, {L'n',L'\x0323'}, {L'n',L'\x0327'}, {L'n',L'\x032d'}, {L'n',L'\x0331'}, {L'n',L'j'}, ++ /* 1192 */ {L'n',L'm'}, {L'n',L's'}, {L'o',L'V'}, {L'o',L'\x0300'}, {L'o',L'\x0301'}, {L'o',L'\x0302'}, {L'o',L'\x0303'}, {L'o',L'\x0304'}, ++ /* 1200 */ {L'o',L'\x0306'}, {L'o',L'\x0307'}, {L'o',L'\x0308'}, {L'o',L'\x0309'}, {L'o',L'\x030b'}, {L'o',L'\x030c'}, {L'o',L'\x030f'}, {L'o',L'\x0311'}, ++ /* 1208 */ {L'o',L'\x031b'}, {L'o',L'\x0323'}, {L'o',L'\x0328'}, {L'p',L'A'}, {L'p',L'F'}, {L'p',L'V'}, {L'p',L'W'}, {L'p',L'\x0301'}, ++ /* 1216 */ {L'p',L'\x0307'}, {L'p',L'c'}, {L'p',L's'}, {L'r',L'\x0301'}, {L'r',L'\x0307'}, {L'r',L'\x030c'}, {L'r',L'\x030f'}, {L'r',L'\x0311'}, ++ /* 1224 */ {L'r',L'\x0323'}, {L'r',L'\x0327'}, {L'r',L'\x0331'}, {L's',L'\x0301'}, {L's',L'\x0302'}, {L's',L'\x0307'}, {L's',L'\x030c'}, {L's',L'\x0323'}, ++ /* 1232 */ {L's',L'\x0326'}, {L's',L'\x0327'}, {L's',L'r'}, {L's',L't'}, {L't',L'\x0307'}, {L't',L'\x0308'}, {L't',L'\x030c'}, {L't',L'\x0323'}, ++ /* 1240 */ {L't',L'\x0326'}, {L't',L'\x0327'}, {L't',L'\x032d'}, {L't',L'\x0331'}, {L'u',L'\x0300'}, {L'u',L'\x0301'}, {L'u',L'\x0302'}, {L'u',L'\x0303'}, ++ /* 1248 */ {L'u',L'\x0304'}, {L'u',L'\x0306'}, {L'u',L'\x0308'}, {L'u',L'\x0309'}, {L'u',L'\x030a'}, {L'u',L'\x030b'}, {L'u',L'\x030c'}, {L'u',L'\x030f'}, ++ /* 1256 */ {L'u',L'\x0311'}, {L'u',L'\x031b'}, {L'u',L'\x0323'}, {L'u',L'\x0324'}, {L'u',L'\x0328'}, {L'u',L'\x032d'}, {L'u',L'\x0330'}, {L'v',L'\x0303'}, ++ /* 1264 */ {L'v',L'\x0323'}, {L'v',L'i'}, {L'w',L'\x0300'}, {L'w',L'\x0301'}, {L'w',L'\x0302'}, {L'w',L'\x0307'}, {L'w',L'\x0308'}, {L'w',L'\x030a'}, ++ /* 1272 */ {L'w',L'\x0323'}, {L'x',L'\x0307'}, {L'x',L'\x0308'}, {L'x',L'i'}, {L'y',L'\x0300'}, {L'y',L'\x0301'}, {L'y',L'\x0302'}, {L'y',L'\x0303'}, ++ /* 1280 */ {L'y',L'\x0304'}, {L'y',L'\x0307'}, {L'y',L'\x0308'}, {L'y',L'\x0309'}, {L'y',L'\x030a'}, {L'y',L'\x0323'}, {L'z',L'\x0301'}, {L'z',L'\x0302'}, ++ /* 1288 */ {L'z',L'\x0307'}, {L'z',L'\x030c'}, {L'z',L'\x0323'}, {L'z',L'\x0331'}}; + + static const wchar_t UNWIF_compat_tbl_3 [629][3] = { + /* 0 */ {L'(',L'1',L')'}, {L'(',L'2',L')'}, {L'(',L'3',L')'}, {L'(',L'4',L')'}, {L'(',L'5',L')'}, {L'(',L'6',L')'}, {L'(',L'7',L')'}, {L'(',L'8',L')'}, +@@ -550,62 +557,62 @@ static const uint16_t UNWIF_compat_00_00 [256] = { + /* 0090 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0098 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 00a0 */ TBL(1)|52, 0, 0, 0, 0, 0, 0, 0, +-/* 00a8 */ TBL(2)|335, 0, TBL(1)|1526, 0, 0, 0, 0, TBL(2)|331, +-/* 00b0 */ 0, 0, TBL(1)|10, TBL(1)|11, TBL(2)|329, TBL(1)|160, 0, 0, +-/* 00b8 */ TBL(2)|340, TBL(1)|9, TBL(1)|1540, 0, TBL(3)|148, TBL(3)|146, TBL(3)|174, 0, ++/* 00a8 */ TBL(2)|335, 0, TBL(1)|1574, 0, 0, 0, 0, TBL(2)|331, ++/* 00b0 */ 0, 0, TBL(1)|10, TBL(1)|11, TBL(2)|329, TBL(1)|203, 0, 0, ++/* 00b8 */ TBL(2)|340, TBL(1)|9, TBL(1)|1588, 0, TBL(3)|148, TBL(3)|146, TBL(3)|174, 0, + /* 00c0 */ TBL(2)|98, TBL(2)|99, TBL(2)|100, TBL(2)|101, TBL(2)|105, TBL(2)|107, 0, TBL(2)|123, + /* 00c8 */ TBL(2)|133, TBL(2)|134, TBL(2)|135, TBL(2)|140, TBL(2)|176, TBL(2)|177, TBL(2)|178, TBL(2)|183, + /* 00d0 */ 0, TBL(2)|222, TBL(2)|231, TBL(2)|232, TBL(2)|233, TBL(2)|234, TBL(2)|238, 0, + /* 00d8 */ 0, TBL(2)|280, TBL(2)|281, TBL(2)|282, TBL(2)|286, TBL(2)|315, 0, 0, +-/* 00e0 */ TBL(2)|1037, TBL(2)|1038, TBL(2)|1039, TBL(2)|1040, TBL(2)|1044, TBL(2)|1046, 0, TBL(2)|1060, +-/* 00e8 */ TBL(2)|1076, TBL(2)|1077, TBL(2)|1078, TBL(2)|1083, TBL(2)|1114, TBL(2)|1115, TBL(2)|1116, TBL(2)|1120, +-/* 00f0 */ 0, TBL(2)|1178, TBL(2)|1189, TBL(2)|1190, TBL(2)|1191, TBL(2)|1192, TBL(2)|1196, 0, +-/* 00f8 */ 0, TBL(2)|1238, TBL(2)|1239, TBL(2)|1240, TBL(2)|1244, TBL(2)|1271, 0, TBL(2)|1276 ++/* 00e0 */ TBL(2)|1043, TBL(2)|1044, TBL(2)|1045, TBL(2)|1046, TBL(2)|1050, TBL(2)|1052, 0, TBL(2)|1066, ++/* 00e8 */ TBL(2)|1082, TBL(2)|1083, TBL(2)|1084, TBL(2)|1089, TBL(2)|1120, TBL(2)|1121, TBL(2)|1122, TBL(2)|1126, ++/* 00f0 */ 0, TBL(2)|1184, TBL(2)|1195, TBL(2)|1196, TBL(2)|1197, TBL(2)|1198, TBL(2)|1202, 0, ++/* 00f8 */ 0, TBL(2)|1244, TBL(2)|1245, TBL(2)|1246, TBL(2)|1250, TBL(2)|1277, 0, TBL(2)|1282 + }; + + static const uint16_t UNWIF_compat_00_01 [256] = { +-/* 0100 */ TBL(2)|102, TBL(2)|1041, TBL(2)|103, TBL(2)|1042, TBL(2)|113, TBL(2)|1052, TBL(2)|119, TBL(2)|1056, +-/* 0108 */ TBL(2)|120, TBL(2)|1057, TBL(2)|121, TBL(2)|1058, TBL(2)|122, TBL(2)|1059, TBL(2)|127, TBL(2)|1066, +-/* 0110 */ 0, 0, TBL(2)|137, TBL(2)|1080, TBL(2)|138, TBL(2)|1081, TBL(2)|139, TBL(2)|1082, +-/* 0118 */ TBL(2)|147, TBL(2)|1090, TBL(2)|142, TBL(2)|1085, TBL(2)|153, TBL(2)|1099, TBL(2)|155, TBL(2)|1101, +-/* 0120 */ TBL(2)|156, TBL(2)|1102, TBL(2)|158, TBL(2)|1104, TBL(2)|162, TBL(2)|1105, 0, 0, +-/* 0128 */ TBL(2)|179, TBL(2)|1117, TBL(2)|180, TBL(2)|1118, TBL(2)|181, TBL(2)|1119, TBL(2)|189, TBL(2)|1126, +-/* 0130 */ TBL(2)|182, 0, TBL(2)|172, TBL(2)|1129, TBL(2)|191, TBL(2)|1133, TBL(2)|198, TBL(2)|1141, +-/* 0138 */ 0, TBL(2)|202, TBL(2)|1149, TBL(2)|205, TBL(2)|1152, TBL(2)|203, TBL(2)|1150, TBL(2)|201, +-/* 0140 */ TBL(2)|1148, 0, 0, TBL(2)|221, TBL(2)|1177, TBL(2)|226, TBL(2)|1182, TBL(2)|224, +-/* 0148 */ TBL(2)|1180, TBL(2)|367, 0, 0, TBL(2)|235, TBL(2)|1193, TBL(2)|236, TBL(2)|1194, +-/* 0150 */ TBL(2)|240, TBL(2)|1198, 0, 0, TBL(2)|252, TBL(2)|1213, TBL(2)|258, TBL(2)|1219, +-/* 0158 */ TBL(2)|254, TBL(2)|1215, TBL(2)|264, TBL(2)|1221, TBL(2)|265, TBL(2)|1222, TBL(2)|270, TBL(2)|1227, +-/* 0160 */ TBL(2)|267, TBL(2)|1224, TBL(2)|277, TBL(2)|1235, TBL(2)|274, TBL(2)|1232, 0, 0, +-/* 0168 */ TBL(2)|283, TBL(2)|1241, TBL(2)|284, TBL(2)|1242, TBL(2)|285, TBL(2)|1243, TBL(2)|288, TBL(2)|1246, +-/* 0170 */ TBL(2)|289, TBL(2)|1247, TBL(2)|296, TBL(2)|1254, TBL(2)|306, TBL(2)|1262, TBL(2)|316, TBL(2)|1272, +-/* 0178 */ TBL(2)|320, TBL(2)|323, TBL(2)|1280, TBL(2)|325, TBL(2)|1282, TBL(2)|326, TBL(2)|1283, TBL(1)|1544, ++/* 0100 */ TBL(2)|102, TBL(2)|1047, TBL(2)|103, TBL(2)|1048, TBL(2)|113, TBL(2)|1058, TBL(2)|119, TBL(2)|1062, ++/* 0108 */ TBL(2)|120, TBL(2)|1063, TBL(2)|121, TBL(2)|1064, TBL(2)|122, TBL(2)|1065, TBL(2)|127, TBL(2)|1072, ++/* 0110 */ 0, 0, TBL(2)|137, TBL(2)|1086, TBL(2)|138, TBL(2)|1087, TBL(2)|139, TBL(2)|1088, ++/* 0118 */ TBL(2)|147, TBL(2)|1096, TBL(2)|142, TBL(2)|1091, TBL(2)|153, TBL(2)|1105, TBL(2)|155, TBL(2)|1107, ++/* 0120 */ TBL(2)|156, TBL(2)|1108, TBL(2)|158, TBL(2)|1110, TBL(2)|162, TBL(2)|1111, 0, 0, ++/* 0128 */ TBL(2)|179, TBL(2)|1123, TBL(2)|180, TBL(2)|1124, TBL(2)|181, TBL(2)|1125, TBL(2)|189, TBL(2)|1132, ++/* 0130 */ TBL(2)|182, 0, TBL(2)|172, TBL(2)|1135, TBL(2)|191, TBL(2)|1139, TBL(2)|198, TBL(2)|1147, ++/* 0138 */ 0, TBL(2)|202, TBL(2)|1155, TBL(2)|205, TBL(2)|1158, TBL(2)|203, TBL(2)|1156, TBL(2)|201, ++/* 0140 */ TBL(2)|1154, 0, 0, TBL(2)|221, TBL(2)|1183, TBL(2)|226, TBL(2)|1188, TBL(2)|224, ++/* 0148 */ TBL(2)|1186, TBL(2)|367, 0, 0, TBL(2)|235, TBL(2)|1199, TBL(2)|236, TBL(2)|1200, ++/* 0150 */ TBL(2)|240, TBL(2)|1204, 0, 0, TBL(2)|252, TBL(2)|1219, TBL(2)|258, TBL(2)|1225, ++/* 0158 */ TBL(2)|254, TBL(2)|1221, TBL(2)|264, TBL(2)|1227, TBL(2)|265, TBL(2)|1228, TBL(2)|270, TBL(2)|1233, ++/* 0160 */ TBL(2)|267, TBL(2)|1230, TBL(2)|277, TBL(2)|1241, TBL(2)|274, TBL(2)|1238, 0, 0, ++/* 0168 */ TBL(2)|283, TBL(2)|1247, TBL(2)|284, TBL(2)|1248, TBL(2)|285, TBL(2)|1249, TBL(2)|288, TBL(2)|1252, ++/* 0170 */ TBL(2)|289, TBL(2)|1253, TBL(2)|296, TBL(2)|1260, TBL(2)|306, TBL(2)|1268, TBL(2)|316, TBL(2)|1278, ++/* 0178 */ TBL(2)|320, TBL(2)|323, TBL(2)|1286, TBL(2)|325, TBL(2)|1288, TBL(2)|326, TBL(2)|1289, TBL(1)|1592, + /* 0180 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0188 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0190 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0198 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 01a0 */ TBL(2)|244, TBL(2)|1202, 0, 0, 0, 0, 0, 0, ++/* 01a0 */ TBL(2)|244, TBL(2)|1208, 0, 0, 0, 0, 0, 0, + /* 01a8 */ 0, 0, 0, 0, 0, 0, 0, TBL(2)|293, +-/* 01b0 */ TBL(2)|1251, 0, 0, 0, 0, 0, 0, 0, ++/* 01b0 */ TBL(2)|1257, 0, 0, 0, 0, 0, 0, 0, + /* 01b8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 01c0 */ 0, 0, 0, 0, TBL(3)|199, TBL(3)|200, TBL(3)|566, TBL(2)|200, +-/* 01c8 */ TBL(2)|208, TBL(2)|1155, TBL(2)|219, TBL(2)|229, TBL(2)|1185, TBL(2)|108, TBL(2)|1047, TBL(2)|185, +-/* 01d0 */ TBL(2)|1122, TBL(2)|241, TBL(2)|1199, TBL(2)|290, TBL(2)|1248, TBL(3)|249, TBL(3)|620, TBL(3)|248, ++/* 01c8 */ TBL(2)|208, TBL(2)|1161, TBL(2)|219, TBL(2)|229, TBL(2)|1191, TBL(2)|108, TBL(2)|1053, TBL(2)|185, ++/* 01d0 */ TBL(2)|1128, TBL(2)|241, TBL(2)|1205, TBL(2)|290, TBL(2)|1254, TBL(3)|249, TBL(3)|620, TBL(3)|248, + /* 01d8 */ TBL(3)|619, TBL(3)|250, TBL(3)|621, TBL(3)|247, TBL(3)|618, 0, TBL(3)|192, TBL(3)|553, +-/* 01e0 */ TBL(3)|191, TBL(3)|552, TBL(2)|360, TBL(2)|363, 0, 0, TBL(2)|157, TBL(2)|1103, +-/* 01e8 */ TBL(2)|196, TBL(2)|1139, TBL(2)|246, TBL(2)|1204, TBL(3)|235, TBL(3)|610, TBL(2)|365, TBL(2)|366, +-/* 01f0 */ TBL(2)|1134, TBL(2)|125, TBL(2)|132, TBL(2)|1074, TBL(2)|152, TBL(2)|1098, 0, 0, +-/* 01f8 */ TBL(2)|220, TBL(2)|1176, TBL(3)|193, TBL(3)|554, TBL(2)|359, TBL(2)|362, TBL(2)|361, TBL(2)|364 ++/* 01e0 */ TBL(3)|191, TBL(3)|552, TBL(2)|360, TBL(2)|363, 0, 0, TBL(2)|157, TBL(2)|1109, ++/* 01e8 */ TBL(2)|196, TBL(2)|1145, TBL(2)|246, TBL(2)|1210, TBL(3)|235, TBL(3)|610, TBL(2)|365, TBL(2)|366, ++/* 01f0 */ TBL(2)|1140, TBL(2)|125, TBL(2)|132, TBL(2)|1080, TBL(2)|152, TBL(2)|1104, 0, 0, ++/* 01f8 */ TBL(2)|220, TBL(2)|1182, TBL(3)|193, TBL(3)|554, TBL(2)|359, TBL(2)|362, TBL(2)|361, TBL(2)|364 + }; + + static const uint16_t UNWIF_compat_00_02 [256] = { +-/* 0200 */ TBL(2)|109, TBL(2)|1048, TBL(2)|110, TBL(2)|1049, TBL(2)|143, TBL(2)|1086, TBL(2)|144, TBL(2)|1087, +-/* 0208 */ TBL(2)|186, TBL(2)|1123, TBL(2)|187, TBL(2)|1124, TBL(2)|242, TBL(2)|1200, TBL(2)|243, TBL(2)|1201, +-/* 0210 */ TBL(2)|255, TBL(2)|1216, TBL(2)|256, TBL(2)|1217, TBL(2)|291, TBL(2)|1249, TBL(2)|292, TBL(2)|1250, +-/* 0218 */ TBL(2)|269, TBL(2)|1226, TBL(2)|276, TBL(2)|1234, 0, 0, TBL(2)|165, TBL(2)|1108, +-/* 0220 */ 0, 0, 0, 0, 0, 0, TBL(2)|104, TBL(2)|1043, +-/* 0228 */ TBL(2)|146, TBL(2)|1089, TBL(3)|228, TBL(3)|603, TBL(3)|223, TBL(3)|598, TBL(2)|237, TBL(2)|1195, +-/* 0230 */ TBL(3)|227, TBL(3)|602, TBL(2)|318, TBL(2)|1274, 0, 0, 0, 0, ++/* 0200 */ TBL(2)|109, TBL(2)|1054, TBL(2)|110, TBL(2)|1055, TBL(2)|143, TBL(2)|1092, TBL(2)|144, TBL(2)|1093, ++/* 0208 */ TBL(2)|186, TBL(2)|1129, TBL(2)|187, TBL(2)|1130, TBL(2)|242, TBL(2)|1206, TBL(2)|243, TBL(2)|1207, ++/* 0210 */ TBL(2)|255, TBL(2)|1222, TBL(2)|256, TBL(2)|1223, TBL(2)|291, TBL(2)|1255, TBL(2)|292, TBL(2)|1256, ++/* 0218 */ TBL(2)|269, TBL(2)|1232, TBL(2)|276, TBL(2)|1240, 0, 0, TBL(2)|165, TBL(2)|1114, ++/* 0220 */ 0, 0, 0, 0, 0, 0, TBL(2)|104, TBL(2)|1049, ++/* 0228 */ TBL(2)|146, TBL(2)|1095, TBL(3)|228, TBL(3)|603, TBL(3)|223, TBL(3)|598, TBL(2)|237, TBL(2)|1201, ++/* 0230 */ TBL(3)|227, TBL(3)|602, TBL(2)|318, TBL(2)|1280, 0, 0, 0, 0, + /* 0238 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0240 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0248 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -621,13 +628,13 @@ static const uint16_t UNWIF_compat_00_02 [256] = { + /* 0298 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 02a0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 02a8 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 02b0 */ TBL(1)|1533, TBL(1)|91, TBL(1)|1535, TBL(1)|1543, TBL(1)|105, TBL(1)|106, TBL(1)|107, TBL(1)|1548, +-/* 02b8 */ TBL(1)|1550, 0, 0, 0, 0, 0, 0, 0, ++/* 02b0 */ TBL(1)|1581, TBL(1)|104, TBL(1)|1583, TBL(1)|1591, TBL(1)|123, TBL(1)|125, TBL(1)|129, TBL(1)|1596, ++/* 02b8 */ TBL(1)|1598, 0, 0, 0, 0, 0, 0, 0, + /* 02c0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 02c8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 02d0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 02d8 */ TBL(2)|333, TBL(2)|334, TBL(2)|336, TBL(2)|341, TBL(2)|330, TBL(2)|337, 0, 0, +-/* 02e0 */ TBL(1)|89, TBL(1)|1537, TBL(1)|1544, TBL(1)|1549, TBL(1)|118, 0, 0, 0, ++/* 02e0 */ TBL(1)|101, TBL(1)|1585, TBL(1)|1592, TBL(1)|1597, TBL(1)|144, 0, 0, 0, + /* 02e8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 02f0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 02f8 */ 0, 0, 0, 0, 0, 0, 0, 0 +@@ -642,13 +649,13 @@ static const uint16_t UNWIF_compat_00_03 [256] = { + /* 0328 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0330 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0338 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 0340 */ TBL(1)|122, TBL(1)|123, 0, TBL(1)|124, TBL(2)|368, 0, 0, 0, ++/* 0340 */ TBL(1)|165, TBL(1)|166, 0, TBL(1)|167, TBL(2)|368, 0, 0, 0, + /* 0348 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0350 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0358 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0360 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0368 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 0370 */ 0, 0, 0, 0, TBL(1)|121, 0, 0, 0, ++/* 0370 */ 0, 0, 0, 0, TBL(1)|162, 0, 0, 0, + /* 0378 */ 0, 0, TBL(2)|344, 0, 0, 0, TBL(1)|19, 0, + /* 0380 */ 0, 0, 0, 0, TBL(2)|329, TBL(3)|260, TBL(2)|370, TBL(1)|66, + /* 0388 */ TBL(2)|377, TBL(2)|381, TBL(2)|386, 0, TBL(2)|393, 0, TBL(2)|398, TBL(2)|404, +@@ -660,12 +667,12 @@ static const uint16_t UNWIF_compat_00_03 [256] = { + /* 03b8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 03c0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 03c8 */ 0, 0, TBL(2)|430, TBL(2)|452, TBL(2)|443, TBL(2)|449, TBL(2)|457, 0, +-/* 03d0 */ TBL(1)|150, TBL(1)|156, TBL(1)|144, TBL(2)|398, TBL(2)|401, TBL(1)|170, TBL(1)|164, 0, ++/* 03d0 */ TBL(1)|193, TBL(1)|199, TBL(1)|187, TBL(2)|398, TBL(2)|401, TBL(1)|213, TBL(1)|207, 0, + /* 03d8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 03e0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 03e8 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 03f0 */ TBL(1)|158, TBL(1)|165, TBL(1)|166, 0, TBL(1)|132, TBL(1)|153, 0, 0, +-/* 03f8 */ 0, TBL(1)|142, 0, 0, 0, 0, 0, 0 ++/* 03f0 */ TBL(1)|201, TBL(1)|208, TBL(1)|209, 0, TBL(1)|175, TBL(1)|196, 0, 0, ++/* 03f8 */ 0, TBL(1)|185, 0, 0, 0, 0, 0, 0 + }; + + static const uint16_t UNWIF_compat_00_04 [256] = { +@@ -985,7 +992,7 @@ static const uint16_t UNWIF_compat_00_0e [256] = { + + static const uint16_t UNWIF_compat_00_0f [256] = { + /* 0f00 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 0f08 */ 0, 0, 0, 0, TBL(1)|261, 0, 0, 0, ++/* 0f08 */ 0, 0, 0, 0, TBL(1)|304, 0, 0, 0, + /* 0f10 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0f18 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0f20 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1050,7 +1057,7 @@ static const uint16_t UNWIF_compat_00_10 [256] = { + /* 10e0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 10e8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 10f0 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 10f8 */ 0, 0, 0, 0, TBL(1)|262, 0, 0, 0 ++/* 10f8 */ 0, 0, 0, 0, TBL(1)|305, 0, 0, 0 + }; + + static const uint16_t UNWIF_compat_00_1b [256] = { +@@ -1095,24 +1102,24 @@ static const uint16_t UNWIF_compat_00_1d [256] = { + /* 1d18 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1d20 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1d28 */ 0, 0, 0, 0, TBL(1)|25, TBL(1)|67, TBL(1)|26, 0, +-/* 1d30 */ TBL(1)|28, TBL(1)|29, TBL(1)|74, TBL(1)|31, TBL(1)|32, TBL(1)|33, TBL(1)|34, TBL(1)|35, +-/* 1d38 */ TBL(1)|36, TBL(1)|37, TBL(1)|38, 0, TBL(1)|39, TBL(1)|77, TBL(1)|40, TBL(1)|42, +-/* 1d40 */ TBL(1)|44, TBL(1)|45, TBL(1)|47, TBL(1)|1526, TBL(1)|79, TBL(1)|80, TBL(1)|357, TBL(1)|1527, +-/* 1d48 */ TBL(1)|1529, TBL(1)|1530, TBL(1)|84, TBL(1)|85, TBL(1)|86, TBL(1)|1532, 0, TBL(1)|1536, +-/* 1d50 */ TBL(1)|1538, TBL(1)|72, TBL(1)|1540, TBL(1)|82, TBL(1)|358, TBL(1)|359, TBL(1)|1541, TBL(1)|1545, +-/* 1d58 */ TBL(1)|1546, TBL(1)|361, TBL(1)|97, TBL(1)|1547, TBL(1)|362, TBL(1)|150, TBL(1)|151, TBL(1)|152, +-/* 1d60 */ TBL(1)|170, TBL(1)|171, TBL(1)|1534, TBL(1)|1543, TBL(1)|1546, TBL(1)|1547, TBL(1)|150, TBL(1)|151, +-/* 1d68 */ TBL(1)|165, TBL(1)|170, TBL(1)|171, 0, 0, 0, 0, 0, ++/* 1d30 */ TBL(1)|28, TBL(1)|29, TBL(1)|76, TBL(1)|31, TBL(1)|32, TBL(1)|33, TBL(1)|34, TBL(1)|35, ++/* 1d38 */ TBL(1)|36, TBL(1)|37, TBL(1)|38, 0, TBL(1)|39, TBL(1)|82, TBL(1)|40, TBL(1)|42, ++/* 1d40 */ TBL(1)|44, TBL(1)|45, TBL(1)|47, TBL(1)|1574, TBL(1)|84, TBL(1)|85, TBL(1)|400, TBL(1)|1575, ++/* 1d48 */ TBL(1)|1577, TBL(1)|1578, TBL(1)|93, TBL(1)|94, TBL(1)|95, TBL(1)|1580, 0, TBL(1)|1584, ++/* 1d50 */ TBL(1)|1586, TBL(1)|74, TBL(1)|1588, TBL(1)|88, TBL(1)|401, TBL(1)|402, TBL(1)|1589, TBL(1)|1593, ++/* 1d58 */ TBL(1)|1594, TBL(1)|404, TBL(1)|113, TBL(1)|1595, TBL(1)|405, TBL(1)|193, TBL(1)|194, TBL(1)|195, ++/* 1d60 */ TBL(1)|213, TBL(1)|214, TBL(1)|1582, TBL(1)|1591, TBL(1)|1594, TBL(1)|1595, TBL(1)|193, TBL(1)|194, ++/* 1d68 */ TBL(1)|208, TBL(1)|213, TBL(1)|214, 0, 0, 0, 0, 0, + /* 1d70 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 1d78 */ TBL(1)|176, 0, 0, 0, 0, 0, 0, 0, ++/* 1d78 */ TBL(1)|219, 0, 0, 0, 0, 0, 0, 0, + /* 1d80 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1d88 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1d90 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 1d98 */ 0, 0, 0, TBL(1)|81, TBL(1)|1528, TBL(1)|83, TBL(1)|68, TBL(1)|86, +-/* 1da0 */ TBL(1)|1531, TBL(1)|87, TBL(1)|88, TBL(1)|90, TBL(1)|92, TBL(1)|93, TBL(1)|94, TBL(1)|363, +-/* 1da8 */ TBL(1)|119, TBL(1)|96, TBL(1)|364, TBL(1)|120, TBL(1)|99, TBL(1)|98, TBL(1)|100, TBL(1)|101, +-/* 1db0 */ TBL(1)|102, TBL(1)|103, TBL(1)|104, TBL(1)|108, TBL(1)|109, TBL(1)|76, TBL(1)|110, TBL(1)|111, +-/* 1db8 */ TBL(1)|360, TBL(1)|112, TBL(1)|113, TBL(1)|1551, TBL(1)|115, TBL(1)|116, TBL(1)|117, TBL(1)|156, ++/* 1d98 */ 0, 0, 0, TBL(1)|86, TBL(1)|1576, TBL(1)|89, TBL(1)|69, TBL(1)|95, ++/* 1da0 */ TBL(1)|1579, TBL(1)|97, TBL(1)|99, TBL(1)|103, TBL(1)|106, TBL(1)|107, TBL(1)|108, TBL(1)|406, ++/* 1da8 */ TBL(1)|149, TBL(1)|111, TBL(1)|407, TBL(1)|150, TBL(1)|115, TBL(1)|114, TBL(1)|116, TBL(1)|117, ++/* 1db0 */ TBL(1)|118, TBL(1)|119, TBL(1)|122, TBL(1)|130, TBL(1)|131, TBL(1)|78, TBL(1)|134, TBL(1)|135, ++/* 1db8 */ TBL(1)|403, TBL(1)|136, TBL(1)|137, TBL(1)|1599, TBL(1)|141, TBL(1)|142, TBL(1)|143, TBL(1)|199, + /* 1dc0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1dc8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1dd0 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1124,38 +1131,38 @@ static const uint16_t UNWIF_compat_00_1d [256] = { + }; + + static const uint16_t UNWIF_compat_00_1e [256] = { +-/* 1e00 */ TBL(2)|112, TBL(2)|1051, TBL(2)|114, TBL(2)|1053, TBL(2)|115, TBL(2)|1054, TBL(2)|116, TBL(2)|1055, +-/* 1e08 */ TBL(3)|197, TBL(3)|560, TBL(2)|126, TBL(2)|1065, TBL(2)|128, TBL(2)|1067, TBL(2)|131, TBL(2)|1070, +-/* 1e10 */ TBL(2)|129, TBL(2)|1068, TBL(2)|130, TBL(2)|1069, TBL(3)|205, TBL(3)|571, TBL(3)|206, TBL(3)|572, +-/* 1e18 */ TBL(2)|148, TBL(2)|1091, TBL(2)|149, TBL(2)|1092, TBL(3)|208, TBL(3)|574, TBL(2)|150, TBL(2)|1093, +-/* 1e20 */ TBL(2)|154, TBL(2)|1100, TBL(2)|163, TBL(2)|1106, TBL(2)|166, TBL(2)|1109, TBL(2)|164, TBL(2)|1107, +-/* 1e28 */ TBL(2)|167, TBL(2)|1110, TBL(2)|168, TBL(2)|1111, TBL(2)|190, TBL(2)|1127, TBL(3)|213, TBL(3)|580, +-/* 1e30 */ TBL(2)|195, TBL(2)|1138, TBL(2)|197, TBL(2)|1140, TBL(2)|199, TBL(2)|1142, TBL(2)|204, TBL(2)|1151, +-/* 1e38 */ TBL(3)|215, TBL(3)|586, TBL(2)|207, TBL(2)|1154, TBL(2)|206, TBL(2)|1153, TBL(2)|215, TBL(2)|1164, +-/* 1e40 */ TBL(2)|216, TBL(2)|1165, TBL(2)|217, TBL(2)|1166, TBL(2)|223, TBL(2)|1179, TBL(2)|225, TBL(2)|1181, +-/* 1e48 */ TBL(2)|228, TBL(2)|1184, TBL(2)|227, TBL(2)|1183, TBL(3)|222, TBL(3)|597, TBL(3)|224, TBL(3)|599, +-/* 1e50 */ TBL(3)|225, TBL(3)|600, TBL(3)|226, TBL(3)|601, TBL(2)|249, TBL(2)|1209, TBL(2)|250, TBL(2)|1210, +-/* 1e58 */ TBL(2)|253, TBL(2)|1214, TBL(2)|257, TBL(2)|1218, TBL(3)|239, TBL(3)|611, TBL(2)|259, TBL(2)|1220, +-/* 1e60 */ TBL(2)|266, TBL(2)|1223, TBL(2)|268, TBL(2)|1225, TBL(3)|240, TBL(3)|613, TBL(3)|241, TBL(3)|614, +-/* 1e68 */ TBL(3)|242, TBL(3)|615, TBL(2)|273, TBL(2)|1230, TBL(2)|275, TBL(2)|1233, TBL(2)|279, TBL(2)|1237, +-/* 1e70 */ TBL(2)|278, TBL(2)|1236, TBL(2)|295, TBL(2)|1253, TBL(2)|298, TBL(2)|1256, TBL(2)|297, TBL(2)|1255, +-/* 1e78 */ TBL(3)|245, TBL(3)|616, TBL(3)|246, TBL(3)|617, TBL(2)|300, TBL(2)|1257, TBL(2)|301, TBL(2)|1258, +-/* 1e80 */ TBL(2)|304, TBL(2)|1260, TBL(2)|305, TBL(2)|1261, TBL(2)|308, TBL(2)|1264, TBL(2)|307, TBL(2)|1263, +-/* 1e88 */ TBL(2)|309, TBL(2)|1266, TBL(2)|312, TBL(2)|1267, TBL(2)|313, TBL(2)|1268, TBL(2)|319, TBL(2)|1275, +-/* 1e90 */ TBL(2)|324, TBL(2)|1281, TBL(2)|327, TBL(2)|1284, TBL(2)|328, TBL(2)|1285, TBL(2)|1112, TBL(2)|1231, +-/* 1e98 */ TBL(2)|1265, TBL(2)|1278, TBL(2)|1036, TBL(2)|1223, 0, 0, 0, 0, +-/* 1ea0 */ TBL(2)|111, TBL(2)|1050, TBL(2)|106, TBL(2)|1045, TBL(3)|184, TBL(3)|545, TBL(3)|183, TBL(3)|544, ++/* 1e00 */ TBL(2)|112, TBL(2)|1057, TBL(2)|114, TBL(2)|1059, TBL(2)|115, TBL(2)|1060, TBL(2)|116, TBL(2)|1061, ++/* 1e08 */ TBL(3)|197, TBL(3)|560, TBL(2)|126, TBL(2)|1071, TBL(2)|128, TBL(2)|1073, TBL(2)|131, TBL(2)|1076, ++/* 1e10 */ TBL(2)|129, TBL(2)|1074, TBL(2)|130, TBL(2)|1075, TBL(3)|205, TBL(3)|571, TBL(3)|206, TBL(3)|572, ++/* 1e18 */ TBL(2)|148, TBL(2)|1097, TBL(2)|149, TBL(2)|1098, TBL(3)|208, TBL(3)|574, TBL(2)|150, TBL(2)|1099, ++/* 1e20 */ TBL(2)|154, TBL(2)|1106, TBL(2)|163, TBL(2)|1112, TBL(2)|166, TBL(2)|1115, TBL(2)|164, TBL(2)|1113, ++/* 1e28 */ TBL(2)|167, TBL(2)|1116, TBL(2)|168, TBL(2)|1117, TBL(2)|190, TBL(2)|1133, TBL(3)|213, TBL(3)|580, ++/* 1e30 */ TBL(2)|195, TBL(2)|1144, TBL(2)|197, TBL(2)|1146, TBL(2)|199, TBL(2)|1148, TBL(2)|204, TBL(2)|1157, ++/* 1e38 */ TBL(3)|215, TBL(3)|586, TBL(2)|207, TBL(2)|1160, TBL(2)|206, TBL(2)|1159, TBL(2)|215, TBL(2)|1170, ++/* 1e40 */ TBL(2)|216, TBL(2)|1171, TBL(2)|217, TBL(2)|1172, TBL(2)|223, TBL(2)|1185, TBL(2)|225, TBL(2)|1187, ++/* 1e48 */ TBL(2)|228, TBL(2)|1190, TBL(2)|227, TBL(2)|1189, TBL(3)|222, TBL(3)|597, TBL(3)|224, TBL(3)|599, ++/* 1e50 */ TBL(3)|225, TBL(3)|600, TBL(3)|226, TBL(3)|601, TBL(2)|249, TBL(2)|1215, TBL(2)|250, TBL(2)|1216, ++/* 1e58 */ TBL(2)|253, TBL(2)|1220, TBL(2)|257, TBL(2)|1224, TBL(3)|239, TBL(3)|611, TBL(2)|259, TBL(2)|1226, ++/* 1e60 */ TBL(2)|266, TBL(2)|1229, TBL(2)|268, TBL(2)|1231, TBL(3)|240, TBL(3)|613, TBL(3)|241, TBL(3)|614, ++/* 1e68 */ TBL(3)|242, TBL(3)|615, TBL(2)|273, TBL(2)|1236, TBL(2)|275, TBL(2)|1239, TBL(2)|279, TBL(2)|1243, ++/* 1e70 */ TBL(2)|278, TBL(2)|1242, TBL(2)|295, TBL(2)|1259, TBL(2)|298, TBL(2)|1262, TBL(2)|297, TBL(2)|1261, ++/* 1e78 */ TBL(3)|245, TBL(3)|616, TBL(3)|246, TBL(3)|617, TBL(2)|300, TBL(2)|1263, TBL(2)|301, TBL(2)|1264, ++/* 1e80 */ TBL(2)|304, TBL(2)|1266, TBL(2)|305, TBL(2)|1267, TBL(2)|308, TBL(2)|1270, TBL(2)|307, TBL(2)|1269, ++/* 1e88 */ TBL(2)|309, TBL(2)|1272, TBL(2)|312, TBL(2)|1273, TBL(2)|313, TBL(2)|1274, TBL(2)|319, TBL(2)|1281, ++/* 1e90 */ TBL(2)|324, TBL(2)|1287, TBL(2)|327, TBL(2)|1290, TBL(2)|328, TBL(2)|1291, TBL(2)|1118, TBL(2)|1237, ++/* 1e98 */ TBL(2)|1271, TBL(2)|1284, TBL(2)|1042, TBL(2)|1229, 0, 0, 0, 0, ++/* 1ea0 */ TBL(2)|111, TBL(2)|1056, TBL(2)|106, TBL(2)|1051, TBL(3)|184, TBL(3)|545, TBL(3)|183, TBL(3)|544, + /* 1ea8 */ TBL(3)|186, TBL(3)|547, TBL(3)|185, TBL(3)|546, TBL(3)|194, TBL(3)|555, TBL(3)|188, TBL(3)|549, + /* 1eb0 */ TBL(3)|187, TBL(3)|548, TBL(3)|190, TBL(3)|551, TBL(3)|189, TBL(3)|550, TBL(3)|195, TBL(3)|556, +-/* 1eb8 */ TBL(2)|145, TBL(2)|1088, TBL(2)|141, TBL(2)|1084, TBL(2)|136, TBL(2)|1079, TBL(3)|202, TBL(3)|568, ++/* 1eb8 */ TBL(2)|145, TBL(2)|1094, TBL(2)|141, TBL(2)|1090, TBL(2)|136, TBL(2)|1085, TBL(3)|202, TBL(3)|568, + /* 1ec0 */ TBL(3)|201, TBL(3)|567, TBL(3)|204, TBL(3)|570, TBL(3)|203, TBL(3)|569, TBL(3)|207, TBL(3)|573, +-/* 1ec8 */ TBL(2)|184, TBL(2)|1121, TBL(2)|188, TBL(2)|1125, TBL(2)|245, TBL(2)|1203, TBL(2)|239, TBL(2)|1197, ++/* 1ec8 */ TBL(2)|184, TBL(2)|1127, TBL(2)|188, TBL(2)|1131, TBL(2)|245, TBL(2)|1209, TBL(2)|239, TBL(2)|1203, + /* 1ed0 */ TBL(3)|219, TBL(3)|594, TBL(3)|218, TBL(3)|593, TBL(3)|221, TBL(3)|596, TBL(3)|220, TBL(3)|595, + /* 1ed8 */ TBL(3)|234, TBL(3)|609, TBL(3)|230, TBL(3)|605, TBL(3)|229, TBL(3)|604, TBL(3)|232, TBL(3)|607, +-/* 1ee0 */ TBL(3)|231, TBL(3)|606, TBL(3)|233, TBL(3)|608, TBL(2)|294, TBL(2)|1252, TBL(2)|287, TBL(2)|1245, ++/* 1ee0 */ TBL(3)|231, TBL(3)|606, TBL(3)|233, TBL(3)|608, TBL(2)|294, TBL(2)|1258, TBL(2)|287, TBL(2)|1251, + /* 1ee8 */ TBL(3)|252, TBL(3)|623, TBL(3)|251, TBL(3)|622, TBL(3)|254, TBL(3)|625, TBL(3)|253, TBL(3)|624, +-/* 1ef0 */ TBL(3)|255, TBL(3)|626, TBL(2)|314, TBL(2)|1270, TBL(2)|322, TBL(2)|1279, TBL(2)|321, TBL(2)|1277, +-/* 1ef8 */ TBL(2)|317, TBL(2)|1273, 0, 0, 0, 0, 0, 0 ++/* 1ef0 */ TBL(3)|255, TBL(3)|626, TBL(2)|314, TBL(2)|1276, TBL(2)|322, TBL(2)|1285, TBL(2)|321, TBL(2)|1283, ++/* 1ef8 */ TBL(2)|317, TBL(2)|1279, 0, 0, 0, 0, 0, 0 + }; + + static const uint16_t UNWIF_compat_00_1f [256] = { +@@ -1182,13 +1189,13 @@ static const uint16_t UNWIF_compat_00_1f [256] = { + /* 1fa0 */ TBL(3)|368, TBL(3)|372, TBL(4)|59, TBL(4)|62, TBL(4)|60, TBL(4)|63, TBL(4)|61, TBL(4)|64, + /* 1fa8 */ TBL(3)|310, TBL(3)|314, TBL(4)|41, TBL(4)|44, TBL(4)|42, TBL(4)|45, TBL(4)|43, TBL(4)|46, + /* 1fb0 */ TBL(2)|411, TBL(2)|410, TBL(3)|315, TBL(2)|415, TBL(3)|316, 0, TBL(2)|414, TBL(3)|325, +-/* 1fb8 */ TBL(2)|372, TBL(2)|371, TBL(2)|369, TBL(2)|370, TBL(2)|375, TBL(2)|338, TBL(1)|157, TBL(2)|338, ++/* 1fb8 */ TBL(2)|372, TBL(2)|371, TBL(2)|369, TBL(2)|370, TBL(2)|375, TBL(2)|338, TBL(1)|200, TBL(2)|338, + /* 1fc0 */ TBL(2)|343, TBL(3)|261, TBL(3)|330, TBL(2)|425, TBL(3)|331, 0, TBL(2)|424, TBL(3)|340, + /* 1fc8 */ TBL(2)|376, TBL(2)|377, TBL(2)|380, TBL(2)|381, TBL(2)|384, TBL(3)|262, TBL(3)|263, TBL(3)|264, + /* 1fd0 */ TBL(2)|429, TBL(2)|428, TBL(3)|341, TBL(3)|342, 0, 0, TBL(2)|433, TBL(3)|343, + /* 1fd8 */ TBL(2)|388, TBL(2)|387, TBL(2)|385, TBL(2)|386, 0, TBL(3)|265, TBL(3)|266, TBL(3)|267, + /* 1fe0 */ TBL(2)|451, TBL(2)|450, TBL(3)|354, TBL(3)|355, TBL(2)|446, TBL(2)|447, TBL(2)|455, TBL(3)|356, +-/* 1fe8 */ TBL(2)|400, TBL(2)|399, TBL(2)|397, TBL(2)|398, TBL(2)|396, TBL(3)|259, TBL(3)|260, TBL(1)|1525, ++/* 1fe8 */ TBL(2)|400, TBL(2)|399, TBL(2)|397, TBL(2)|398, TBL(2)|396, TBL(3)|259, TBL(3)|260, TBL(1)|1573, + /* 1ff0 */ 0, 0, TBL(3)|363, TBL(2)|461, TBL(3)|364, 0, TBL(2)|460, TBL(3)|373, + /* 1ff8 */ TBL(2)|392, TBL(2)|393, TBL(2)|403, TBL(2)|404, TBL(2)|407, TBL(2)|329, TBL(2)|339, 0 + }; +@@ -1196,7 +1203,7 @@ static const uint16_t UNWIF_compat_00_1f [256] = { + static const uint16_t UNWIF_compat_00_20 [256] = { + /* 2000 */ TBL(1)|52, TBL(1)|52, TBL(1)|52, TBL(1)|52, TBL(1)|52, TBL(1)|52, TBL(1)|52, TBL(1)|52, + /* 2008 */ TBL(1)|52, TBL(1)|52, TBL(1)|52, 0, 0, 0, 0, 0, +-/* 2010 */ 0, TBL(1)|365, 0, 0, 0, 0, 0, TBL(2)|342, ++/* 2010 */ 0, TBL(1)|409, 0, 0, 0, 0, 0, TBL(2)|342, + /* 2018 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2020 */ 0, 0, 0, 0, TBL(1)|6, TBL(2)|0, TBL(3)|111, 0, + /* 2028 */ 0, 0, 0, 0, 0, 0, 0, TBL(1)|52, +@@ -1208,12 +1215,12 @@ static const uint16_t UNWIF_compat_00_20 [256] = { + /* 2058 */ 0, 0, 0, 0, 0, 0, 0, TBL(1)|52, + /* 2060 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2068 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 2070 */ TBL(1)|8, TBL(1)|1534, 0, 0, TBL(1)|12, TBL(1)|13, TBL(1)|14, TBL(1)|15, +-/* 2078 */ TBL(1)|16, TBL(1)|17, TBL(1)|3, TBL(1)|376, TBL(1)|21, TBL(1)|0, TBL(1)|1, TBL(1)|1539, ++/* 2070 */ TBL(1)|8, TBL(1)|1582, 0, 0, TBL(1)|12, TBL(1)|13, TBL(1)|14, TBL(1)|15, ++/* 2078 */ TBL(1)|16, TBL(1)|17, TBL(1)|3, TBL(1)|420, TBL(1)|21, TBL(1)|0, TBL(1)|1, TBL(1)|1587, + /* 2080 */ TBL(1)|8, TBL(1)|9, TBL(1)|10, TBL(1)|11, TBL(1)|12, TBL(1)|13, TBL(1)|14, TBL(1)|15, +-/* 2088 */ TBL(1)|16, TBL(1)|17, TBL(1)|3, TBL(1)|376, TBL(1)|21, TBL(1)|0, TBL(1)|1, 0, +-/* 2090 */ TBL(1)|1526, TBL(1)|1530, TBL(1)|1540, TBL(1)|1549, TBL(1)|84, TBL(1)|1533, TBL(1)|1536, TBL(1)|1537, +-/* 2098 */ TBL(1)|1538, TBL(1)|1539, TBL(1)|1541, TBL(1)|1544, TBL(1)|1545, 0, 0, 0, ++/* 2088 */ TBL(1)|16, TBL(1)|17, TBL(1)|3, TBL(1)|420, TBL(1)|21, TBL(1)|0, TBL(1)|1, 0, ++/* 2090 */ TBL(1)|1574, TBL(1)|1578, TBL(1)|1588, TBL(1)|1597, TBL(1)|93, TBL(1)|1581, TBL(1)|1584, TBL(1)|1585, ++/* 2098 */ TBL(1)|1586, TBL(1)|1587, TBL(1)|1589, TBL(1)|1592, TBL(1)|1593, 0, 0, 0, + /* 20a0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 20a8 */ TBL(2)|260, 0, 0, 0, 0, 0, 0, 0, + /* 20b0 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1229,22 +1236,22 @@ static const uint16_t UNWIF_compat_00_20 [256] = { + }; + + static const uint16_t UNWIF_compat_00_21 [256] = { +-/* 2100 */ TBL(3)|542, TBL(3)|543, TBL(1)|27, TBL(2)|357, 0, TBL(3)|558, TBL(3)|559, TBL(1)|75, +-/* 2108 */ 0, TBL(2)|358, TBL(1)|1532, TBL(1)|32, TBL(1)|32, TBL(1)|32, TBL(1)|1533, TBL(1)|70, +-/* 2110 */ TBL(1)|33, TBL(1)|33, TBL(1)|36, TBL(1)|1537, 0, TBL(1)|38, TBL(2)|230, 0, ++/* 2100 */ TBL(3)|542, TBL(3)|543, TBL(1)|27, TBL(2)|357, 0, TBL(3)|558, TBL(3)|559, TBL(1)|77, ++/* 2108 */ 0, TBL(2)|358, TBL(1)|1580, TBL(1)|32, TBL(1)|32, TBL(1)|32, TBL(1)|1581, TBL(1)|72, ++/* 2110 */ TBL(1)|33, TBL(1)|33, TBL(1)|36, TBL(1)|1585, 0, TBL(1)|38, TBL(2)|230, 0, + /* 2118 */ 0, TBL(1)|40, TBL(1)|41, TBL(1)|42, TBL(1)|42, TBL(1)|42, 0, 0, +-/* 2120 */ TBL(2)|262, TBL(3)|243, TBL(2)|272, 0, TBL(1)|50, 0, TBL(1)|148, 0, +-/* 2128 */ TBL(1)|50, 0, TBL(1)|35, TBL(2)|107, TBL(1)|26, TBL(1)|27, 0, TBL(1)|1530, +-/* 2130 */ TBL(1)|29, TBL(1)|30, 0, TBL(1)|37, TBL(1)|1540, TBL(1)|179, TBL(1)|180, TBL(1)|181, +-/* 2138 */ TBL(1)|182, TBL(1)|1534, 0, TBL(3)|209, TBL(1)|164, TBL(1)|151, TBL(1)|127, TBL(1)|140, +-/* 2140 */ TBL(1)|375, 0, 0, 0, 0, TBL(1)|28, TBL(1)|1529, TBL(1)|1530, +-/* 2148 */ TBL(1)|1534, TBL(1)|1535, 0, 0, 0, 0, 0, 0, ++/* 2120 */ TBL(2)|262, TBL(3)|243, TBL(2)|272, 0, TBL(1)|50, 0, TBL(1)|191, 0, ++/* 2128 */ TBL(1)|50, 0, TBL(1)|35, TBL(2)|107, TBL(1)|26, TBL(1)|27, 0, TBL(1)|1578, ++/* 2130 */ TBL(1)|29, TBL(1)|30, 0, TBL(1)|37, TBL(1)|1588, TBL(1)|222, TBL(1)|223, TBL(1)|224, ++/* 2138 */ TBL(1)|225, TBL(1)|1582, 0, TBL(3)|209, TBL(1)|207, TBL(1)|194, TBL(1)|170, TBL(1)|183, ++/* 2140 */ TBL(1)|419, 0, 0, 0, 0, TBL(1)|28, TBL(1)|1577, TBL(1)|1578, ++/* 2148 */ TBL(1)|1582, TBL(1)|1583, 0, 0, 0, 0, 0, 0, + /* 2150 */ TBL(3)|151, TBL(3)|153, TBL(4)|26, TBL(3)|147, TBL(3)|170, TBL(3)|149, TBL(3)|171, TBL(3)|175, + /* 2158 */ TBL(3)|177, TBL(3)|150, TBL(3)|178, TBL(3)|152, TBL(3)|176, TBL(3)|179, TBL(3)|180, TBL(2)|16, + /* 2160 */ TBL(1)|33, TBL(2)|171, TBL(3)|212, TBL(2)|174, TBL(1)|46, TBL(2)|299, TBL(3)|256, TBL(4)|28, + /* 2168 */ TBL(2)|175, TBL(1)|48, TBL(2)|311, TBL(3)|258, TBL(1)|36, TBL(1)|27, TBL(1)|28, TBL(1)|37, +-/* 2170 */ TBL(1)|1534, TBL(2)|1128, TBL(3)|581, TBL(2)|1131, TBL(1)|1547, TBL(2)|1259, TBL(3)|627, TBL(4)|125, +-/* 2178 */ TBL(2)|1132, TBL(1)|1549, TBL(2)|1269, TBL(3)|628, TBL(1)|1537, TBL(1)|1528, TBL(1)|1529, TBL(1)|1538, ++/* 2170 */ TBL(1)|1582, TBL(2)|1134, TBL(3)|581, TBL(2)|1137, TBL(1)|1595, TBL(2)|1265, TBL(3)|627, TBL(4)|125, ++/* 2178 */ TBL(2)|1138, TBL(1)|1597, TBL(2)|1275, TBL(3)|628, TBL(1)|1585, TBL(1)|1576, TBL(1)|1577, TBL(1)|1586, + /* 2180 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2188 */ 0, TBL(3)|112, 0, 0, 0, 0, 0, 0, + /* 2190 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1304,7 +1311,7 @@ static const uint16_t UNWIF_compat_00_23 [256] = { + /* 2310 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2318 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2320 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 2328 */ 0, TBL(1)|385, TBL(1)|386, 0, 0, 0, 0, 0, ++/* 2328 */ 0, TBL(1)|430, TBL(1)|431, 0, 0, 0, 0, 0, + /* 2330 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2338 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2340 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1360,10 +1367,10 @@ static const uint16_t UNWIF_compat_00_24 [256] = { + /* 24b8 */ TBL(1)|27, TBL(1)|28, TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, TBL(1)|33, TBL(1)|34, + /* 24c0 */ TBL(1)|35, TBL(1)|36, TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, TBL(1)|41, TBL(1)|42, + /* 24c8 */ TBL(1)|43, TBL(1)|44, TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, +-/* 24d0 */ TBL(1)|1526, TBL(1)|1527, TBL(1)|1528, TBL(1)|1529, TBL(1)|1530, TBL(1)|1531, TBL(1)|1532, TBL(1)|1533, +-/* 24d8 */ TBL(1)|1534, TBL(1)|1535, TBL(1)|1536, TBL(1)|1537, TBL(1)|1538, TBL(1)|1539, TBL(1)|1540, TBL(1)|1541, +-/* 24e0 */ TBL(1)|1542, TBL(1)|1543, TBL(1)|1544, TBL(1)|1545, TBL(1)|1546, TBL(1)|1547, TBL(1)|1548, TBL(1)|1549, +-/* 24e8 */ TBL(1)|1550, TBL(1)|1551, TBL(1)|8, 0, 0, 0, 0, 0, ++/* 24d0 */ TBL(1)|1574, TBL(1)|1575, TBL(1)|1576, TBL(1)|1577, TBL(1)|1578, TBL(1)|1579, TBL(1)|1580, TBL(1)|1581, ++/* 24d8 */ TBL(1)|1582, TBL(1)|1583, TBL(1)|1584, TBL(1)|1585, TBL(1)|1586, TBL(1)|1587, TBL(1)|1588, TBL(1)|1589, ++/* 24e0 */ TBL(1)|1590, TBL(1)|1591, TBL(1)|1592, TBL(1)|1593, TBL(1)|1594, TBL(1)|1595, TBL(1)|1596, TBL(1)|1597, ++/* 24e8 */ TBL(1)|1598, TBL(1)|1599, TBL(1)|8, 0, 0, 0, 0, 0, + /* 24f0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 24f8 */ 0, 0, 0, 0, 0, 0, 0, 0 + }; +@@ -1419,7 +1426,7 @@ static const uint16_t UNWIF_compat_00_2c [256] = { + /* 2c60 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2c68 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2c70 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 2c78 */ 0, 0, 0, 0, TBL(1)|1535, TBL(1)|46, 0, 0, ++/* 2c78 */ 0, 0, 0, 0, TBL(1)|1583, TBL(1)|46, 0, 0, + /* 2c80 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2c88 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2c90 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1452,7 +1459,7 @@ static const uint16_t UNWIF_compat_00_2d [256] = { + /* 2d50 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2d58 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2d60 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 2d68 */ 0, 0, 0, 0, 0, 0, 0, TBL(1)|382, ++/* 2d68 */ 0, 0, 0, 0, 0, 0, 0, TBL(1)|427, + /* 2d70 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2d78 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2d80 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1493,7 +1500,7 @@ static const uint16_t UNWIF_compat_00_2e [256] = { + /* 2e80 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2e88 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2e90 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 2e98 */ 0, 0, 0, 0, 0, 0, 0, TBL(1)|977, ++/* 2e98 */ 0, 0, 0, 0, 0, 0, 0, TBL(1)|1022, + /* 2ea0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2ea8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2eb0 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1504,38 +1511,38 @@ static const uint16_t UNWIF_compat_00_2e [256] = { + /* 2ed8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2ee0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2ee8 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 2ef0 */ 0, 0, 0, TBL(1)|1516, 0, 0, 0, 0, ++/* 2ef0 */ 0, 0, 0, TBL(1)|1561, 0, 0, 0, 0, + /* 2ef8 */ 0, 0, 0, 0, 0, 0, 0, 0 + }; + + static const uint16_t UNWIF_compat_00_2f [256] = { +-/* 2f00 */ TBL(1)|528, TBL(1)|537, TBL(1)|540, TBL(1)|544, TBL(1)|546, TBL(1)|549, TBL(1)|551, TBL(1)|553, +-/* 2f08 */ TBL(1)|556, TBL(1)|577, TBL(1)|583, TBL(1)|587, TBL(1)|591, TBL(1)|595, TBL(1)|599, TBL(1)|607, +-/* 2f10 */ TBL(1)|608, TBL(1)|609, TBL(1)|622, TBL(1)|632, TBL(1)|636, TBL(1)|638, TBL(1)|639, TBL(1)|642, +-/* 2f18 */ TBL(1)|649, TBL(1)|650, TBL(1)|656, TBL(1)|657, TBL(1)|659, TBL(1)|663, TBL(1)|702, TBL(1)|707, +-/* 2f20 */ TBL(1)|723, TBL(1)|728, TBL(1)|730, TBL(1)|731, TBL(1)|735, TBL(1)|742, TBL(1)|753, TBL(1)|756, +-/* 2f28 */ TBL(1)|764, TBL(1)|767, TBL(1)|768, TBL(1)|769, TBL(1)|775, TBL(1)|776, TBL(1)|787, TBL(1)|790, +-/* 2f30 */ TBL(1)|792, TBL(1)|794, TBL(1)|798, TBL(1)|800, TBL(1)|802, TBL(1)|813, TBL(1)|814, TBL(1)|816, +-/* 2f38 */ TBL(1)|817, TBL(1)|819, TBL(1)|821, TBL(1)|825, TBL(1)|832, TBL(1)|862, TBL(1)|867, TBL(1)|868, +-/* 2f40 */ TBL(1)|900, TBL(1)|901, TBL(1)|906, TBL(1)|907, TBL(1)|909, TBL(1)|911, TBL(1)|913, TBL(1)|916, +-/* 2f48 */ TBL(1)|926, TBL(1)|930, TBL(1)|935, TBL(1)|963, TBL(1)|966, TBL(1)|970, TBL(1)|973, TBL(1)|976, +-/* 2f50 */ TBL(1)|978, TBL(1)|979, TBL(1)|980, TBL(1)|981, TBL(1)|982, TBL(1)|1028, TBL(1)|1046, TBL(1)|1049, +-/* 2f58 */ TBL(1)|1050, TBL(1)|1051, TBL(1)|1052, TBL(1)|1054, TBL(1)|1055, TBL(1)|1060, TBL(1)|1067, TBL(1)|1069, +-/* 2f60 */ TBL(1)|1085, TBL(1)|1086, TBL(1)|1088, TBL(1)|1089, TBL(1)|1091, TBL(1)|1092, TBL(1)|1101, TBL(1)|1102, +-/* 2f68 */ TBL(1)|1109, TBL(1)|1110, TBL(1)|1111, TBL(1)|1112, TBL(1)|1117, TBL(1)|1126, TBL(1)|1127, TBL(1)|1128, +-/* 2f70 */ TBL(1)|1137, TBL(1)|1153, TBL(1)|1154, TBL(1)|1162, TBL(1)|1166, TBL(1)|1168, TBL(1)|1176, TBL(1)|1185, +-/* 2f78 */ TBL(1)|1202, TBL(1)|1204, TBL(1)|1209, TBL(1)|1212, TBL(1)|1214, TBL(1)|1216, TBL(1)|1217, TBL(1)|1218, +-/* 2f80 */ TBL(1)|1224, TBL(1)|1225, TBL(1)|1232, TBL(1)|1234, TBL(1)|1236, TBL(1)|1237, TBL(1)|1240, TBL(1)|1242, +-/* 2f88 */ TBL(1)|1243, TBL(1)|1244, TBL(1)|1246, TBL(1)|1247, TBL(1)|1287, TBL(1)|1292, TBL(1)|1305, TBL(1)|1306, +-/* 2f90 */ TBL(1)|1308, TBL(1)|1319, TBL(1)|1321, TBL(1)|1323, TBL(1)|1325, TBL(1)|1340, TBL(1)|1341, TBL(1)|1343, +-/* 2f98 */ TBL(1)|1344, TBL(1)|1345, TBL(1)|1356, TBL(1)|1357, TBL(1)|1359, TBL(1)|1364, TBL(1)|1365, TBL(1)|1372, +-/* 2fa0 */ TBL(1)|1374, TBL(1)|1375, TBL(1)|1384, TBL(1)|1392, TBL(1)|1397, TBL(1)|1398, TBL(1)|1400, TBL(1)|1411, +-/* 2fa8 */ TBL(1)|1412, TBL(1)|1416, TBL(1)|1425, TBL(1)|1428, TBL(1)|1432, TBL(1)|1438, TBL(1)|1440, TBL(1)|1441, +-/* 2fb0 */ TBL(1)|1442, TBL(1)|1443, TBL(1)|1446, TBL(1)|1447, TBL(1)|1449, TBL(1)|1456, TBL(1)|1457, TBL(1)|1458, +-/* 2fb8 */ TBL(1)|1464, TBL(1)|1465, TBL(1)|1467, TBL(1)|1472, TBL(1)|1473, TBL(1)|1474, TBL(1)|1476, TBL(1)|1477, +-/* 2fc0 */ TBL(1)|1478, TBL(1)|1479, TBL(1)|1480, TBL(1)|1484, TBL(1)|1490, TBL(1)|1491, TBL(1)|1494, TBL(1)|1495, +-/* 2fc8 */ TBL(1)|1496, TBL(1)|1497, TBL(1)|1499, TBL(1)|1500, TBL(1)|1501, TBL(1)|1504, TBL(1)|1506, TBL(1)|1508, +-/* 2fd0 */ TBL(1)|1509, TBL(1)|1511, TBL(1)|1512, TBL(1)|1513, TBL(1)|1515, TBL(1)|1517, 0, 0, ++/* 2f00 */ TBL(1)|573, TBL(1)|582, TBL(1)|585, TBL(1)|589, TBL(1)|591, TBL(1)|594, TBL(1)|596, TBL(1)|598, ++/* 2f08 */ TBL(1)|601, TBL(1)|622, TBL(1)|628, TBL(1)|632, TBL(1)|636, TBL(1)|640, TBL(1)|644, TBL(1)|652, ++/* 2f10 */ TBL(1)|653, TBL(1)|654, TBL(1)|667, TBL(1)|677, TBL(1)|681, TBL(1)|683, TBL(1)|684, TBL(1)|687, ++/* 2f18 */ TBL(1)|694, TBL(1)|695, TBL(1)|701, TBL(1)|702, TBL(1)|704, TBL(1)|708, TBL(1)|747, TBL(1)|752, ++/* 2f20 */ TBL(1)|768, TBL(1)|773, TBL(1)|775, TBL(1)|776, TBL(1)|780, TBL(1)|787, TBL(1)|798, TBL(1)|801, ++/* 2f28 */ TBL(1)|809, TBL(1)|812, TBL(1)|813, TBL(1)|814, TBL(1)|820, TBL(1)|821, TBL(1)|832, TBL(1)|835, ++/* 2f30 */ TBL(1)|837, TBL(1)|839, TBL(1)|843, TBL(1)|845, TBL(1)|847, TBL(1)|858, TBL(1)|859, TBL(1)|861, ++/* 2f38 */ TBL(1)|862, TBL(1)|864, TBL(1)|866, TBL(1)|870, TBL(1)|877, TBL(1)|907, TBL(1)|912, TBL(1)|913, ++/* 2f40 */ TBL(1)|945, TBL(1)|946, TBL(1)|951, TBL(1)|952, TBL(1)|954, TBL(1)|956, TBL(1)|958, TBL(1)|961, ++/* 2f48 */ TBL(1)|971, TBL(1)|975, TBL(1)|980, TBL(1)|1008, TBL(1)|1011, TBL(1)|1015, TBL(1)|1018, TBL(1)|1021, ++/* 2f50 */ TBL(1)|1023, TBL(1)|1024, TBL(1)|1025, TBL(1)|1026, TBL(1)|1027, TBL(1)|1073, TBL(1)|1091, TBL(1)|1094, ++/* 2f58 */ TBL(1)|1095, TBL(1)|1096, TBL(1)|1097, TBL(1)|1099, TBL(1)|1100, TBL(1)|1105, TBL(1)|1112, TBL(1)|1114, ++/* 2f60 */ TBL(1)|1130, TBL(1)|1131, TBL(1)|1133, TBL(1)|1134, TBL(1)|1136, TBL(1)|1137, TBL(1)|1146, TBL(1)|1147, ++/* 2f68 */ TBL(1)|1154, TBL(1)|1155, TBL(1)|1156, TBL(1)|1157, TBL(1)|1162, TBL(1)|1171, TBL(1)|1172, TBL(1)|1173, ++/* 2f70 */ TBL(1)|1182, TBL(1)|1198, TBL(1)|1199, TBL(1)|1207, TBL(1)|1211, TBL(1)|1213, TBL(1)|1221, TBL(1)|1230, ++/* 2f78 */ TBL(1)|1247, TBL(1)|1249, TBL(1)|1254, TBL(1)|1257, TBL(1)|1259, TBL(1)|1261, TBL(1)|1262, TBL(1)|1263, ++/* 2f80 */ TBL(1)|1269, TBL(1)|1270, TBL(1)|1277, TBL(1)|1279, TBL(1)|1281, TBL(1)|1282, TBL(1)|1285, TBL(1)|1287, ++/* 2f88 */ TBL(1)|1288, TBL(1)|1289, TBL(1)|1291, TBL(1)|1292, TBL(1)|1332, TBL(1)|1337, TBL(1)|1350, TBL(1)|1351, ++/* 2f90 */ TBL(1)|1353, TBL(1)|1364, TBL(1)|1366, TBL(1)|1368, TBL(1)|1370, TBL(1)|1385, TBL(1)|1386, TBL(1)|1388, ++/* 2f98 */ TBL(1)|1389, TBL(1)|1390, TBL(1)|1401, TBL(1)|1402, TBL(1)|1404, TBL(1)|1409, TBL(1)|1410, TBL(1)|1417, ++/* 2fa0 */ TBL(1)|1419, TBL(1)|1420, TBL(1)|1429, TBL(1)|1437, TBL(1)|1442, TBL(1)|1443, TBL(1)|1445, TBL(1)|1456, ++/* 2fa8 */ TBL(1)|1457, TBL(1)|1461, TBL(1)|1470, TBL(1)|1473, TBL(1)|1477, TBL(1)|1483, TBL(1)|1485, TBL(1)|1486, ++/* 2fb0 */ TBL(1)|1487, TBL(1)|1488, TBL(1)|1491, TBL(1)|1492, TBL(1)|1494, TBL(1)|1501, TBL(1)|1502, TBL(1)|1503, ++/* 2fb8 */ TBL(1)|1509, TBL(1)|1510, TBL(1)|1512, TBL(1)|1517, TBL(1)|1518, TBL(1)|1519, TBL(1)|1521, TBL(1)|1522, ++/* 2fc0 */ TBL(1)|1523, TBL(1)|1524, TBL(1)|1525, TBL(1)|1529, TBL(1)|1535, TBL(1)|1536, TBL(1)|1539, TBL(1)|1540, ++/* 2fc8 */ TBL(1)|1541, TBL(1)|1542, TBL(1)|1544, TBL(1)|1545, TBL(1)|1546, TBL(1)|1549, TBL(1)|1551, TBL(1)|1553, ++/* 2fd0 */ TBL(1)|1554, TBL(1)|1556, TBL(1)|1557, TBL(1)|1558, TBL(1)|1560, TBL(1)|1562, 0, 0, + /* 2fd8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2fe0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2fe8 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1550,8 +1557,8 @@ static const uint16_t UNWIF_compat_00_30 [256] = { + /* 3018 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 3020 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 3028 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 3030 */ 0, 0, 0, 0, 0, 0, TBL(1)|395, 0, +-/* 3038 */ TBL(1)|642, TBL(1)|643, TBL(1)|644, 0, 0, 0, 0, 0, ++/* 3030 */ 0, 0, 0, 0, 0, 0, TBL(1)|440, 0, ++/* 3038 */ TBL(1)|687, TBL(1)|688, TBL(1)|689, 0, 0, 0, 0, 0, + /* 3040 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 3048 */ 0, 0, 0, 0, TBL(2)|853, 0, TBL(2)|854, 0, + /* 3050 */ TBL(2)|855, 0, TBL(2)|856, 0, TBL(2)|857, 0, TBL(2)|858, 0, +@@ -1585,20 +1592,20 @@ static const uint16_t UNWIF_compat_00_31 [256] = { + /* 3118 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 3120 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 3128 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 3130 */ 0, TBL(1)|263, TBL(1)|264, TBL(1)|337, TBL(1)|265, TBL(1)|338, TBL(1)|339, TBL(1)|266, +-/* 3138 */ TBL(1)|267, TBL(1)|268, TBL(1)|340, TBL(1)|341, TBL(1)|342, TBL(1)|343, TBL(1)|344, TBL(1)|345, +-/* 3140 */ TBL(1)|284, TBL(1)|269, TBL(1)|270, TBL(1)|271, TBL(1)|289, TBL(1)|272, TBL(1)|273, TBL(1)|274, +-/* 3148 */ TBL(1)|275, TBL(1)|276, TBL(1)|277, TBL(1)|278, TBL(1)|279, TBL(1)|280, TBL(1)|281, TBL(1)|308, +-/* 3150 */ TBL(1)|309, TBL(1)|310, TBL(1)|311, TBL(1)|312, TBL(1)|313, TBL(1)|314, TBL(1)|315, TBL(1)|316, +-/* 3158 */ TBL(1)|317, TBL(1)|318, TBL(1)|319, TBL(1)|320, TBL(1)|321, TBL(1)|322, TBL(1)|323, TBL(1)|324, +-/* 3160 */ TBL(1)|325, TBL(1)|326, TBL(1)|327, TBL(1)|328, TBL(1)|307, TBL(1)|282, TBL(1)|283, TBL(1)|346, +-/* 3168 */ TBL(1)|347, TBL(1)|348, TBL(1)|349, TBL(1)|350, TBL(1)|351, TBL(1)|352, TBL(1)|285, TBL(1)|353, +-/* 3170 */ TBL(1)|354, TBL(1)|286, TBL(1)|287, TBL(1)|288, TBL(1)|290, TBL(1)|291, TBL(1)|292, TBL(1)|293, +-/* 3178 */ TBL(1)|294, TBL(1)|295, TBL(1)|296, TBL(1)|297, TBL(1)|298, TBL(1)|299, TBL(1)|300, TBL(1)|301, +-/* 3180 */ TBL(1)|302, TBL(1)|303, TBL(1)|355, TBL(1)|356, TBL(1)|304, TBL(1)|305, TBL(1)|306, TBL(1)|329, +-/* 3188 */ TBL(1)|330, TBL(1)|331, TBL(1)|332, TBL(1)|333, TBL(1)|334, TBL(1)|335, TBL(1)|336, 0, +-/* 3190 */ 0, 0, TBL(1)|528, TBL(1)|551, TBL(1)|531, TBL(1)|703, TBL(1)|532, TBL(1)|538, +-/* 3198 */ TBL(1)|533, TBL(1)|1093, TBL(1)|546, TBL(1)|535, TBL(1)|529, TBL(1)|736, TBL(1)|708, TBL(1)|556, ++/* 3130 */ 0, TBL(1)|306, TBL(1)|307, TBL(1)|380, TBL(1)|308, TBL(1)|381, TBL(1)|382, TBL(1)|309, ++/* 3138 */ TBL(1)|310, TBL(1)|311, TBL(1)|383, TBL(1)|384, TBL(1)|385, TBL(1)|386, TBL(1)|387, TBL(1)|388, ++/* 3140 */ TBL(1)|327, TBL(1)|312, TBL(1)|313, TBL(1)|314, TBL(1)|332, TBL(1)|315, TBL(1)|316, TBL(1)|317, ++/* 3148 */ TBL(1)|318, TBL(1)|319, TBL(1)|320, TBL(1)|321, TBL(1)|322, TBL(1)|323, TBL(1)|324, TBL(1)|351, ++/* 3150 */ TBL(1)|352, TBL(1)|353, TBL(1)|354, TBL(1)|355, TBL(1)|356, TBL(1)|357, TBL(1)|358, TBL(1)|359, ++/* 3158 */ TBL(1)|360, TBL(1)|361, TBL(1)|362, TBL(1)|363, TBL(1)|364, TBL(1)|365, TBL(1)|366, TBL(1)|367, ++/* 3160 */ TBL(1)|368, TBL(1)|369, TBL(1)|370, TBL(1)|371, TBL(1)|350, TBL(1)|325, TBL(1)|326, TBL(1)|389, ++/* 3168 */ TBL(1)|390, TBL(1)|391, TBL(1)|392, TBL(1)|393, TBL(1)|394, TBL(1)|395, TBL(1)|328, TBL(1)|396, ++/* 3170 */ TBL(1)|397, TBL(1)|329, TBL(1)|330, TBL(1)|331, TBL(1)|333, TBL(1)|334, TBL(1)|335, TBL(1)|336, ++/* 3178 */ TBL(1)|337, TBL(1)|338, TBL(1)|339, TBL(1)|340, TBL(1)|341, TBL(1)|342, TBL(1)|343, TBL(1)|344, ++/* 3180 */ TBL(1)|345, TBL(1)|346, TBL(1)|398, TBL(1)|399, TBL(1)|347, TBL(1)|348, TBL(1)|349, TBL(1)|372, ++/* 3188 */ TBL(1)|373, TBL(1)|374, TBL(1)|375, TBL(1)|376, TBL(1)|377, TBL(1)|378, TBL(1)|379, 0, ++/* 3190 */ 0, 0, TBL(1)|573, TBL(1)|596, TBL(1)|576, TBL(1)|748, TBL(1)|577, TBL(1)|583, ++/* 3198 */ TBL(1)|578, TBL(1)|1138, TBL(1)|591, TBL(1)|580, TBL(1)|574, TBL(1)|781, TBL(1)|753, TBL(1)|601, + /* 31a0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 31a8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 31b0 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1622,30 +1629,30 @@ static const uint16_t UNWIF_compat_00_32 [256] = { + /* 3228 */ TBL(3)|52, TBL(3)|61, TBL(3)|69, TBL(3)|74, TBL(3)|73, TBL(3)|71, TBL(3)|84, TBL(3)|66, + /* 3230 */ TBL(3)|68, TBL(3)|72, TBL(3)|70, TBL(3)|77, TBL(3)|63, TBL(3)|75, TBL(3)|82, TBL(3)|78, + /* 3238 */ TBL(3)|60, TBL(3)|55, TBL(3)|64, TBL(3)|67, TBL(3)|76, TBL(3)|56, TBL(3)|83, TBL(3)|62, +-/* 3240 */ TBL(3)|79, TBL(3)|57, TBL(3)|80, TBL(3)|81, TBL(1)|684, TBL(1)|801, TBL(1)|906, TBL(1)|1170, ++/* 3240 */ TBL(3)|79, TBL(3)|57, TBL(3)|80, TBL(3)|81, TBL(1)|729, TBL(1)|846, TBL(1)|951, TBL(1)|1215, + /* 3248 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 3250 */ TBL(3)|238, TBL(2)|23, TBL(2)|24, TBL(2)|25, TBL(2)|26, TBL(2)|27, TBL(2)|28, TBL(2)|29, + /* 3258 */ TBL(2)|30, TBL(2)|31, TBL(2)|37, TBL(2)|38, TBL(2)|39, TBL(2)|40, TBL(2)|41, TBL(2)|42, +-/* 3260 */ TBL(1)|263, TBL(1)|265, TBL(1)|266, TBL(1)|268, TBL(1)|269, TBL(1)|270, TBL(1)|272, TBL(1)|274, +-/* 3268 */ TBL(1)|275, TBL(1)|277, TBL(1)|278, TBL(1)|279, TBL(1)|280, TBL(1)|281, TBL(2)|780, TBL(2)|781, ++/* 3260 */ TBL(1)|306, TBL(1)|308, TBL(1)|309, TBL(1)|311, TBL(1)|312, TBL(1)|313, TBL(1)|315, TBL(1)|317, ++/* 3268 */ TBL(1)|318, TBL(1)|320, TBL(1)|321, TBL(1)|322, TBL(1)|323, TBL(1)|324, TBL(2)|780, TBL(2)|781, + /* 3270 */ TBL(2)|782, TBL(2)|783, TBL(2)|784, TBL(2)|785, TBL(2)|786, TBL(2)|787, TBL(2)|789, TBL(2)|790, + /* 3278 */ TBL(2)|791, TBL(2)|792, TBL(2)|793, TBL(2)|794, TBL(5)|0, TBL(4)|73, TBL(2)|788, 0, +-/* 3280 */ TBL(1)|528, TBL(1)|551, TBL(1)|531, TBL(1)|703, TBL(1)|552, TBL(1)|588, TBL(1)|530, TBL(1)|587, +-/* 3288 */ TBL(1)|547, TBL(1)|642, TBL(1)|930, TBL(1)|1028, TBL(1)|982, TBL(1)|935, TBL(1)|1400, TBL(1)|707, +-/* 3290 */ TBL(1)|916, TBL(1)|947, TBL(1)|931, TBL(1)|1139, TBL(1)|671, TBL(1)|1057, TBL(1)|1346, TBL(1)|1144, +-/* 3298 */ TBL(1)|625, TBL(1)|1156, TBL(1)|1095, TBL(1)|742, TBL(1)|1380, TBL(1)|576, TBL(1)|651, TBL(1)|990, +-/* 32a0 */ TBL(1)|1450, TBL(1)|561, TBL(1)|597, TBL(1)|967, TBL(1)|532, TBL(1)|538, TBL(1)|533, TBL(1)|791, +-/* 32a8 */ TBL(1)|668, TBL(1)|640, TBL(1)|758, TBL(1)|755, TBL(1)|1115, TBL(1)|560, TBL(1)|1351, TBL(1)|647, +-/* 32b0 */ TBL(1)|733, TBL(2)|43, TBL(2)|44, TBL(2)|45, TBL(2)|46, TBL(2)|52, TBL(2)|53, TBL(2)|54, ++/* 3280 */ TBL(1)|573, TBL(1)|596, TBL(1)|576, TBL(1)|748, TBL(1)|597, TBL(1)|633, TBL(1)|575, TBL(1)|632, ++/* 3288 */ TBL(1)|592, TBL(1)|687, TBL(1)|975, TBL(1)|1073, TBL(1)|1027, TBL(1)|980, TBL(1)|1445, TBL(1)|752, ++/* 3290 */ TBL(1)|961, TBL(1)|992, TBL(1)|976, TBL(1)|1184, TBL(1)|716, TBL(1)|1102, TBL(1)|1391, TBL(1)|1189, ++/* 3298 */ TBL(1)|670, TBL(1)|1201, TBL(1)|1140, TBL(1)|787, TBL(1)|1425, TBL(1)|621, TBL(1)|696, TBL(1)|1035, ++/* 32a0 */ TBL(1)|1495, TBL(1)|606, TBL(1)|642, TBL(1)|1012, TBL(1)|577, TBL(1)|583, TBL(1)|578, TBL(1)|836, ++/* 32a8 */ TBL(1)|713, TBL(1)|685, TBL(1)|803, TBL(1)|800, TBL(1)|1160, TBL(1)|605, TBL(1)|1396, TBL(1)|692, ++/* 32b0 */ TBL(1)|778, TBL(2)|43, TBL(2)|44, TBL(2)|45, TBL(2)|46, TBL(2)|52, TBL(2)|53, TBL(2)|54, + /* 32b8 */ TBL(2)|55, TBL(2)|56, TBL(2)|57, TBL(2)|58, TBL(2)|59, TBL(2)|60, TBL(2)|61, TBL(2)|67, + /* 32c0 */ TBL(2)|18, TBL(2)|33, TBL(2)|48, TBL(2)|63, TBL(2)|69, TBL(2)|74, TBL(2)|79, TBL(2)|84, +-/* 32c8 */ TBL(2)|89, TBL(3)|115, TBL(3)|119, TBL(3)|123, TBL(2)|169, TBL(3)|575, TBL(2)|1075, TBL(3)|214, +-/* 32d0 */ TBL(1)|403, TBL(1)|405, TBL(1)|407, TBL(1)|409, TBL(1)|411, TBL(1)|412, TBL(1)|413, TBL(1)|414, +-/* 32d8 */ TBL(1)|415, TBL(1)|416, TBL(1)|417, TBL(1)|418, TBL(1)|419, TBL(1)|420, TBL(1)|421, TBL(1)|422, +-/* 32e0 */ TBL(1)|423, TBL(1)|425, TBL(1)|426, TBL(1)|427, TBL(1)|428, TBL(1)|429, TBL(1)|430, TBL(1)|431, +-/* 32e8 */ TBL(1)|432, TBL(1)|433, TBL(1)|434, TBL(1)|435, TBL(1)|436, TBL(1)|437, TBL(1)|438, TBL(1)|439, +-/* 32f0 */ TBL(1)|440, TBL(1)|441, TBL(1)|442, TBL(1)|444, TBL(1)|446, TBL(1)|448, TBL(1)|449, TBL(1)|450, +-/* 32f8 */ TBL(1)|451, TBL(1)|452, TBL(1)|453, TBL(1)|454, TBL(1)|455, TBL(1)|456, TBL(1)|457, TBL(2)|921 ++/* 32c8 */ TBL(2)|89, TBL(3)|115, TBL(3)|119, TBL(3)|123, TBL(2)|169, TBL(3)|575, TBL(2)|1081, TBL(3)|214, ++/* 32d0 */ TBL(1)|448, TBL(1)|450, TBL(1)|452, TBL(1)|454, TBL(1)|456, TBL(1)|457, TBL(1)|458, TBL(1)|459, ++/* 32d8 */ TBL(1)|460, TBL(1)|461, TBL(1)|462, TBL(1)|463, TBL(1)|464, TBL(1)|465, TBL(1)|466, TBL(1)|467, ++/* 32e0 */ TBL(1)|468, TBL(1)|470, TBL(1)|471, TBL(1)|472, TBL(1)|473, TBL(1)|474, TBL(1)|475, TBL(1)|476, ++/* 32e8 */ TBL(1)|477, TBL(1)|478, TBL(1)|479, TBL(1)|480, TBL(1)|481, TBL(1)|482, TBL(1)|483, TBL(1)|484, ++/* 32f0 */ TBL(1)|485, TBL(1)|486, TBL(1)|487, TBL(1)|489, TBL(1)|491, TBL(1)|493, TBL(1)|494, TBL(1)|495, ++/* 32f8 */ TBL(1)|496, TBL(1)|497, TBL(1)|498, TBL(1)|499, TBL(1)|500, TBL(1)|501, TBL(1)|502, TBL(2)|921 + }; + + static const uint16_t UNWIF_compat_00_33 [256] = { +@@ -1663,20 +1670,20 @@ static const uint16_t UNWIF_compat_00_33 [256] = { + /* 3358 */ TBL(2)|3, TBL(2)|19, TBL(2)|34, TBL(2)|49, TBL(2)|64, TBL(2)|70, TBL(2)|75, TBL(2)|80, + /* 3360 */ TBL(2)|85, TBL(2)|90, TBL(3)|116, TBL(3)|120, TBL(3)|124, TBL(3)|127, TBL(3)|130, TBL(3)|133, + /* 3368 */ TBL(3)|136, TBL(3)|139, TBL(3)|142, TBL(3)|145, TBL(3)|156, TBL(3)|158, TBL(3)|160, TBL(3)|162, +-/* 3370 */ TBL(3)|164, TBL(3)|579, TBL(2)|1071, TBL(2)|97, TBL(3)|557, TBL(2)|1188, TBL(2)|1211, TBL(2)|1073, ++/* 3370 */ TBL(3)|164, TBL(3)|579, TBL(2)|1077, TBL(2)|97, TBL(3)|557, TBL(2)|1194, TBL(2)|1217, TBL(2)|1079, + /* 3378 */ TBL(3)|564, TBL(3)|565, TBL(2)|173, TBL(2)|923, TBL(2)|925, TBL(2)|922, TBL(2)|924, TBL(4)|103, +-/* 3380 */ TBL(2)|1205, TBL(2)|1172, TBL(2)|434, TBL(2)|1161, TBL(2)|1135, TBL(2)|192, TBL(2)|209, TBL(2)|151, +-/* 3388 */ TBL(3)|561, TBL(4)|122, TBL(2)|1206, TBL(2)|1173, TBL(2)|435, TBL(2)|438, TBL(2)|1168, TBL(2)|1144, +-/* 3390 */ TBL(2)|170, TBL(3)|582, TBL(3)|216, TBL(3)|210, TBL(3)|244, TBL(2)|439, TBL(2)|1169, TBL(2)|1072, +-/* 3398 */ TBL(2)|1145, TBL(2)|1097, TBL(2)|1186, TBL(2)|440, TBL(2)|1170, TBL(2)|1063, TBL(2)|1146, TBL(3)|590, +-/* 33a0 */ TBL(3)|562, TBL(2)|1159, TBL(3)|584, TBL(3)|591, TBL(3)|563, TBL(2)|1160, TBL(3)|585, TBL(3)|588, ++/* 3380 */ TBL(2)|1211, TBL(2)|1178, TBL(2)|434, TBL(2)|1167, TBL(2)|1141, TBL(2)|192, TBL(2)|209, TBL(2)|151, ++/* 3388 */ TBL(3)|561, TBL(4)|122, TBL(2)|1212, TBL(2)|1179, TBL(2)|435, TBL(2)|438, TBL(2)|1174, TBL(2)|1150, ++/* 3390 */ TBL(2)|170, TBL(3)|582, TBL(3)|216, TBL(3)|210, TBL(3)|244, TBL(2)|439, TBL(2)|1175, TBL(2)|1078, ++/* 3398 */ TBL(2)|1151, TBL(2)|1103, TBL(2)|1192, TBL(2)|440, TBL(2)|1176, TBL(2)|1069, TBL(2)|1152, TBL(3)|590, ++/* 33a0 */ TBL(3)|562, TBL(2)|1165, TBL(3)|584, TBL(3)|591, TBL(3)|563, TBL(2)|1166, TBL(3)|585, TBL(3)|588, + /* 33a8 */ TBL(4)|123, TBL(2)|251, TBL(3)|583, TBL(3)|217, TBL(3)|211, TBL(3)|612, TBL(5)|15, (uint16_t)-1 /*TBL(6)|22*/, +-/* 33b0 */ TBL(2)|1212, TBL(2)|1187, TBL(2)|441, TBL(2)|1171, TBL(2)|1207, TBL(2)|1174, TBL(2)|436, TBL(2)|1162, +-/* 33b8 */ TBL(2)|1136, TBL(2)|213, TBL(2)|1208, TBL(2)|1175, TBL(2)|437, TBL(2)|1163, TBL(2)|1137, TBL(2)|214, +-/* 33c0 */ TBL(2)|1143, TBL(2)|218, TBL(4)|121, TBL(2)|117, TBL(2)|1061, TBL(2)|1062, TBL(4)|27, TBL(3)|198, +-/* 33c8 */ TBL(2)|1064, TBL(2)|159, TBL(2)|1113, TBL(2)|160, TBL(2)|1130, TBL(2)|193, TBL(2)|194, TBL(2)|1147, +-/* 33d0 */ TBL(2)|1156, TBL(2)|1157, TBL(3)|587, TBL(2)|1158, TBL(2)|1167, TBL(3)|589, TBL(3)|592, TBL(2)|247, +-/* 33d8 */ TBL(4)|124, TBL(3)|236, TBL(2)|248, TBL(2)|1228, TBL(2)|271, TBL(2)|310, TBL(3)|257, TBL(3)|196, ++/* 33b0 */ TBL(2)|1218, TBL(2)|1193, TBL(2)|441, TBL(2)|1177, TBL(2)|1213, TBL(2)|1180, TBL(2)|436, TBL(2)|1168, ++/* 33b8 */ TBL(2)|1142, TBL(2)|213, TBL(2)|1214, TBL(2)|1181, TBL(2)|437, TBL(2)|1169, TBL(2)|1143, TBL(2)|214, ++/* 33c0 */ TBL(2)|1149, TBL(2)|218, TBL(4)|121, TBL(2)|117, TBL(2)|1067, TBL(2)|1068, TBL(4)|27, TBL(3)|198, ++/* 33c8 */ TBL(2)|1070, TBL(2)|159, TBL(2)|1119, TBL(2)|160, TBL(2)|1136, TBL(2)|193, TBL(2)|194, TBL(2)|1153, ++/* 33d0 */ TBL(2)|1162, TBL(2)|1163, TBL(3)|587, TBL(2)|1164, TBL(2)|1173, TBL(3)|589, TBL(3)|592, TBL(2)|247, ++/* 33d8 */ TBL(4)|124, TBL(3)|236, TBL(2)|248, TBL(2)|1234, TBL(2)|271, TBL(2)|310, TBL(3)|257, TBL(3)|196, + /* 33e0 */ TBL(2)|17, TBL(2)|32, TBL(2)|47, TBL(2)|62, TBL(2)|68, TBL(2)|73, TBL(2)|78, TBL(2)|83, + /* 33e8 */ TBL(2)|88, TBL(3)|114, TBL(3)|118, TBL(3)|122, TBL(3)|126, TBL(3)|129, TBL(3)|132, TBL(3)|135, + /* 33f0 */ TBL(3)|138, TBL(3)|141, TBL(3)|144, TBL(3)|155, TBL(3)|157, TBL(3)|159, TBL(3)|161, TBL(3)|163, +@@ -1703,7 +1710,7 @@ static const uint16_t UNWIF_compat_00_a6 [256] = { + /* a680 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* a688 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* a690 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* a698 */ 0, 0, 0, 0, TBL(1)|177, TBL(1)|178, 0, 0, ++/* a698 */ 0, 0, 0, 0, TBL(1)|220, TBL(1)|221, 0, 0, + /* a6a0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* a6a8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* a6b0 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1733,7 +1740,7 @@ static const uint16_t UNWIF_compat_00_a7 [256] = { + /* a758 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* a760 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* a768 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* a770 */ TBL(1)|1519, 0, 0, 0, 0, 0, 0, 0, ++/* a770 */ TBL(1)|1564, 0, 0, 0, 0, 0, 0, 0, + /* a778 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* a780 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* a788 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1749,8 +1756,8 @@ static const uint16_t UNWIF_compat_00_a7 [256] = { + /* a7d8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* a7e0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* a7e8 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* a7f0 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* a7f8 */ TBL(1)|69, TBL(1)|73, 0, 0, 0, 0, 0, 0 ++/* a7f0 */ 0, 0, TBL(1)|27, TBL(1)|30, TBL(1)|41, 0, 0, 0, ++/* a7f8 */ TBL(1)|71, TBL(1)|75, 0, 0, 0, 0, 0, 0 + }; + + static const uint16_t UNWIF_compat_00_ab [256] = { +@@ -1765,9 +1772,9 @@ static const uint16_t UNWIF_compat_00_ab [256] = { + /* ab40 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* ab48 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* ab50 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* ab58 */ 0, 0, 0, 0, TBL(1)|1518, TBL(1)|1520, TBL(1)|95, TBL(1)|1521, ++/* ab58 */ 0, 0, 0, 0, TBL(1)|1563, TBL(1)|1566, TBL(1)|109, TBL(1)|1567, + /* ab60 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* ab68 */ 0, TBL(1)|114, 0, 0, 0, 0, 0, 0, ++/* ab68 */ 0, TBL(1)|138, 0, 0, 0, 0, 0, 0, + /* ab70 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* ab78 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* ab80 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1789,69 +1796,69 @@ static const uint16_t UNWIF_compat_00_ab [256] = { + }; + + static const uint16_t UNWIF_compat_00_f9 [256] = { +-/* f900 */ TBL(1)|1342, TBL(1)|927, TBL(1)|1365, TBL(1)|1352, TBL(1)|1014, TBL(1)|539, TBL(1)|664, TBL(1)|1515, +-/* f908 */ TBL(1)|1515, TBL(1)|739, TBL(1)|1400, TBL(1)|689, TBL(1)|738, TBL(1)|860, TBL(1)|1108, TBL(1)|1208, +-/* f910 */ TBL(1)|1286, TBL(1)|1301, TBL(1)|1314, TBL(1)|1383, TBL(1)|957, TBL(1)|992, TBL(1)|1035, TBL(1)|1073, +-/* f918 */ TBL(1)|1272, TBL(1)|1394, TBL(1)|1469, TBL(1)|548, TBL(1)|653, TBL(1)|962, TBL(1)|1044, TBL(1)|1285, +-/* f920 */ TBL(1)|1489, TBL(1)|781, TBL(1)|1022, TBL(1)|1281, TBL(1)|1318, TBL(1)|873, TBL(1)|1231, TBL(1)|1304, +-/* f928 */ TBL(1)|808, TBL(1)|932, TBL(1)|998, TBL(1)|1063, TBL(1)|1386, TBL(1)|564, TBL(1)|602, TBL(1)|629, +-/* f930 */ TBL(1)|899, TBL(1)|960, TBL(1)|1043, TBL(1)|1116, TBL(1)|1214, TBL(1)|1283, TBL(1)|1289, TBL(1)|1362, +-/* f938 */ TBL(1)|1436, TBL(1)|1481, TBL(1)|1488, TBL(1)|1131, TBL(1)|1147, TBL(1)|1193, TBL(1)|1265, TBL(1)|1407, +-/* f940 */ TBL(1)|1491, TBL(1)|1331, TBL(1)|722, TBL(1)|815, TBL(1)|1175, TBL(1)|1223, TBL(1)|1056, TBL(1)|1133, +-/* f948 */ TBL(1)|1350, TBL(1)|1434, TBL(1)|721, TBL(1)|772, TBL(1)|958, TBL(1)|1003, TBL(1)|1016, TBL(1)|1189, +-/* f950 */ TBL(1)|1199, TBL(1)|1418, TBL(1)|628, TBL(1)|1226, TBL(1)|605, TBL(1)|604, TBL(1)|1158, TBL(1)|1194, +-/* f958 */ TBL(1)|1271, TBL(1)|1420, TBL(1)|1338, TBL(1)|874, TBL(1)|957, TBL(1)|1334, TBL(1)|542, TBL(1)|761, +-/* f960 */ TBL(1)|837, TBL(1)|1068, TBL(1)|1100, TBL(1)|637, TBL(1)|1135, TBL(1)|568, TBL(1)|830, TBL(1)|534, +-/* f968 */ TBL(1)|987, TBL(1)|905, TBL(1)|1188, TBL(1)|658, TBL(1)|717, TBL(1)|1119, TBL(1)|1273, TBL(1)|1327, +-/* f970 */ TBL(1)|974, TBL(1)|1374, TBL(1)|985, TBL(1)|878, TBL(1)|1255, TBL(1)|886, TBL(1)|1099, TBL(1)|555, +-/* f978 */ TBL(1)|586, TBL(1)|603, TBL(1)|949, TBL(1)|1183, TBL(1)|1245, TBL(1)|1330, TBL(1)|1399, TBL(1)|631, +-/* f980 */ TBL(1)|676, TBL(1)|742, TBL(1)|812, TBL(1)|912, TBL(1)|1023, TBL(1)|1136, TBL(1)|1414, TBL(1)|1471, +-/* f988 */ TBL(1)|1492, TBL(1)|1498, TBL(1)|622, TBL(1)|925, TBL(1)|969, TBL(1)|1371, TBL(1)|799, TBL(1)|854, +-/* f990 */ TBL(1)|861, TBL(1)|897, TBL(1)|1019, TBL(1)|1038, TBL(1)|1082, TBL(1)|1155, TBL(1)|1196, TBL(1)|1221, +-/* f998 */ TBL(1)|1367, TBL(1)|1275, TBL(1)|1377, TBL(1)|1408, TBL(1)|612, TBL(1)|623, TBL(1)|681, TBL(1)|1034, +-/* f9a0 */ TBL(1)|1309, TBL(1)|1327, TBL(1)|807, TBL(1)|835, TBL(1)|884, TBL(1)|972, TBL(1)|1174, TBL(1)|1065, +-/* f9a8 */ TBL(1)|559, TBL(1)|704, TBL(1)|761, TBL(1)|786, TBL(1)|838, TBL(1)|1072, TBL(1)|1079, TBL(1)|1211, +-/* f9b0 */ TBL(1)|1219, TBL(1)|1401, TBL(1)|1433, TBL(1)|1437, TBL(1)|1452, TBL(1)|565, TBL(1)|1152, TBL(1)|1396, +-/* f9b8 */ TBL(1)|1427, TBL(1)|844, TBL(1)|550, TBL(1)|574, TBL(1)|762, TBL(1)|770, TBL(1)|908, TBL(1)|957, +-/* f9c0 */ TBL(1)|1041, TBL(1)|1107, TBL(1)|1278, TBL(1)|1382, TBL(1)|1513, TBL(1)|921, TBL(1)|1417, TBL(1)|621, +-/* f9c8 */ TBL(1)|940, TBL(1)|943, TBL(1)|996, TBL(1)|1010, TBL(1)|1075, TBL(1)|1098, TBL(1)|1130, TBL(1)|1187, +-/* f9d0 */ TBL(1)|1455, TBL(1)|588, TBL(1)|865, TBL(1)|1421, TBL(1)|570, TBL(1)|779, TBL(1)|1004, TBL(1)|1368, +-/* f9d8 */ TBL(1)|826, TBL(1)|846, TBL(1)|945, TBL(1)|1068, TBL(1)|1423, TBL(1)|614, TBL(1)|672, TBL(1)|774, +-/* f9e0 */ TBL(1)|917, TBL(1)|936, TBL(1)|952, TBL(1)|989, TBL(1)|1074, TBL(1)|1103, TBL(1)|1206, TBL(1)|1310, +-/* f9e8 */ TBL(1)|1313, TBL(1)|1398, TBL(1)|1430, TBL(1)|641, TBL(1)|1011, TBL(1)|673, TBL(1)|1042, TBL(1)|1083, +-/* f9f0 */ TBL(1)|1282, TBL(1)|1424, TBL(1)|1483, TBL(1)|1493, TBL(1)|942, TBL(1)|1002, TBL(1)|1233, TBL(1)|1166, +-/* f9f8 */ TBL(1)|1169, TBL(1)|1178, TBL(1)|1062, TBL(1)|1032, TBL(1)|1337, TBL(1)|557, TBL(1)|1259, TBL(1)|615 ++/* f900 */ TBL(1)|1387, TBL(1)|972, TBL(1)|1410, TBL(1)|1397, TBL(1)|1059, TBL(1)|584, TBL(1)|709, TBL(1)|1560, ++/* f908 */ TBL(1)|1560, TBL(1)|784, TBL(1)|1445, TBL(1)|734, TBL(1)|783, TBL(1)|905, TBL(1)|1153, TBL(1)|1253, ++/* f910 */ TBL(1)|1331, TBL(1)|1346, TBL(1)|1359, TBL(1)|1428, TBL(1)|1002, TBL(1)|1037, TBL(1)|1080, TBL(1)|1118, ++/* f918 */ TBL(1)|1317, TBL(1)|1439, TBL(1)|1514, TBL(1)|593, TBL(1)|698, TBL(1)|1007, TBL(1)|1089, TBL(1)|1330, ++/* f920 */ TBL(1)|1534, TBL(1)|826, TBL(1)|1067, TBL(1)|1326, TBL(1)|1363, TBL(1)|918, TBL(1)|1276, TBL(1)|1349, ++/* f928 */ TBL(1)|853, TBL(1)|977, TBL(1)|1043, TBL(1)|1108, TBL(1)|1431, TBL(1)|609, TBL(1)|647, TBL(1)|674, ++/* f930 */ TBL(1)|944, TBL(1)|1005, TBL(1)|1088, TBL(1)|1161, TBL(1)|1259, TBL(1)|1328, TBL(1)|1334, TBL(1)|1407, ++/* f938 */ TBL(1)|1481, TBL(1)|1526, TBL(1)|1533, TBL(1)|1176, TBL(1)|1192, TBL(1)|1238, TBL(1)|1310, TBL(1)|1452, ++/* f940 */ TBL(1)|1536, TBL(1)|1376, TBL(1)|767, TBL(1)|860, TBL(1)|1220, TBL(1)|1268, TBL(1)|1101, TBL(1)|1178, ++/* f948 */ TBL(1)|1395, TBL(1)|1479, TBL(1)|766, TBL(1)|817, TBL(1)|1003, TBL(1)|1048, TBL(1)|1061, TBL(1)|1234, ++/* f950 */ TBL(1)|1244, TBL(1)|1463, TBL(1)|673, TBL(1)|1271, TBL(1)|650, TBL(1)|649, TBL(1)|1203, TBL(1)|1239, ++/* f958 */ TBL(1)|1316, TBL(1)|1465, TBL(1)|1383, TBL(1)|919, TBL(1)|1002, TBL(1)|1379, TBL(1)|587, TBL(1)|806, ++/* f960 */ TBL(1)|882, TBL(1)|1113, TBL(1)|1145, TBL(1)|682, TBL(1)|1180, TBL(1)|613, TBL(1)|875, TBL(1)|579, ++/* f968 */ TBL(1)|1032, TBL(1)|950, TBL(1)|1233, TBL(1)|703, TBL(1)|762, TBL(1)|1164, TBL(1)|1318, TBL(1)|1372, ++/* f970 */ TBL(1)|1019, TBL(1)|1419, TBL(1)|1030, TBL(1)|923, TBL(1)|1300, TBL(1)|931, TBL(1)|1144, TBL(1)|600, ++/* f978 */ TBL(1)|631, TBL(1)|648, TBL(1)|994, TBL(1)|1228, TBL(1)|1290, TBL(1)|1375, TBL(1)|1444, TBL(1)|676, ++/* f980 */ TBL(1)|721, TBL(1)|787, TBL(1)|857, TBL(1)|957, TBL(1)|1068, TBL(1)|1181, TBL(1)|1459, TBL(1)|1516, ++/* f988 */ TBL(1)|1537, TBL(1)|1543, TBL(1)|667, TBL(1)|970, TBL(1)|1014, TBL(1)|1416, TBL(1)|844, TBL(1)|899, ++/* f990 */ TBL(1)|906, TBL(1)|942, TBL(1)|1064, TBL(1)|1083, TBL(1)|1127, TBL(1)|1200, TBL(1)|1241, TBL(1)|1266, ++/* f998 */ TBL(1)|1412, TBL(1)|1320, TBL(1)|1422, TBL(1)|1453, TBL(1)|657, TBL(1)|668, TBL(1)|726, TBL(1)|1079, ++/* f9a0 */ TBL(1)|1354, TBL(1)|1372, TBL(1)|852, TBL(1)|880, TBL(1)|929, TBL(1)|1017, TBL(1)|1219, TBL(1)|1110, ++/* f9a8 */ TBL(1)|604, TBL(1)|749, TBL(1)|806, TBL(1)|831, TBL(1)|883, TBL(1)|1117, TBL(1)|1124, TBL(1)|1256, ++/* f9b0 */ TBL(1)|1264, TBL(1)|1446, TBL(1)|1478, TBL(1)|1482, TBL(1)|1497, TBL(1)|610, TBL(1)|1197, TBL(1)|1441, ++/* f9b8 */ TBL(1)|1472, TBL(1)|889, TBL(1)|595, TBL(1)|619, TBL(1)|807, TBL(1)|815, TBL(1)|953, TBL(1)|1002, ++/* f9c0 */ TBL(1)|1086, TBL(1)|1152, TBL(1)|1323, TBL(1)|1427, TBL(1)|1558, TBL(1)|966, TBL(1)|1462, TBL(1)|666, ++/* f9c8 */ TBL(1)|985, TBL(1)|988, TBL(1)|1041, TBL(1)|1055, TBL(1)|1120, TBL(1)|1143, TBL(1)|1175, TBL(1)|1232, ++/* f9d0 */ TBL(1)|1500, TBL(1)|633, TBL(1)|910, TBL(1)|1466, TBL(1)|615, TBL(1)|824, TBL(1)|1049, TBL(1)|1413, ++/* f9d8 */ TBL(1)|871, TBL(1)|891, TBL(1)|990, TBL(1)|1113, TBL(1)|1468, TBL(1)|659, TBL(1)|717, TBL(1)|819, ++/* f9e0 */ TBL(1)|962, TBL(1)|981, TBL(1)|997, TBL(1)|1034, TBL(1)|1119, TBL(1)|1148, TBL(1)|1251, TBL(1)|1355, ++/* f9e8 */ TBL(1)|1358, TBL(1)|1443, TBL(1)|1475, TBL(1)|686, TBL(1)|1056, TBL(1)|718, TBL(1)|1087, TBL(1)|1128, ++/* f9f0 */ TBL(1)|1327, TBL(1)|1469, TBL(1)|1528, TBL(1)|1538, TBL(1)|987, TBL(1)|1047, TBL(1)|1278, TBL(1)|1211, ++/* f9f8 */ TBL(1)|1214, TBL(1)|1223, TBL(1)|1107, TBL(1)|1077, TBL(1)|1382, TBL(1)|602, TBL(1)|1304, TBL(1)|660 + }; + + static const uint16_t UNWIF_compat_00_fa [256] = { +-/* fa00 */ TBL(1)|611, TBL(1)|803, TBL(1)|875, TBL(1)|1181, TBL(1)|757, TBL(1)|993, TBL(1)|924, TBL(1)|1370, +-/* fa08 */ TBL(1)|1306, TBL(1)|1419, TBL(1)|1321, TBL(1)|810, TBL(1)|578, TBL(1)|695, 0, 0, +-/* fa10 */ TBL(1)|716, 0, TBL(1)|920, 0, 0, TBL(1)|606, TBL(1)|1064, TBL(1)|1113, +-/* fa18 */ TBL(1)|1138, TBL(1)|1145, TBL(1)|1146, TBL(1)|1151, TBL(1)|1439, TBL(1)|1179, TBL(1)|1212, 0, +-/* fa20 */ TBL(1)|1284, 0, TBL(1)|1333, 0, 0, TBL(1)|1378, TBL(1)|1389, 0, +-/* fa28 */ 0, 0, TBL(1)|1460, TBL(1)|1461, TBL(1)|1462, TBL(1)|1487, TBL(1)|1387, TBL(1)|1426, +-/* fa30 */ TBL(1)|566, TBL(1)|575, TBL(1)|580, TBL(1)|627, TBL(1)|630, TBL(1)|646, TBL(1)|691, TBL(1)|698, +-/* fa38 */ TBL(1)|700, TBL(1)|715, TBL(1)|718, TBL(1)|773, TBL(1)|775, TBL(1)|841, TBL(1)|851, TBL(1)|853, +-/* fa40 */ TBL(1)|859, TBL(1)|902, TBL(1)|914, TBL(1)|922, TBL(1)|950, TBL(1)|999, TBL(1)|1006, TBL(1)|1018, +-/* fa48 */ TBL(1)|1039, TBL(1)|1047, TBL(1)|1076, TBL(1)|1132, TBL(1)|1139, TBL(1)|1141, TBL(1)|1140, TBL(1)|1142, +-/* fa50 */ TBL(1)|1143, TBL(1)|1144, TBL(1)|1149, TBL(1)|1150, TBL(1)|1159, TBL(1)|1164, TBL(1)|1171, TBL(1)|1196, +-/* fa58 */ TBL(1)|1198, TBL(1)|1200, TBL(1)|1205, TBL(1)|1215, TBL(1)|1235, TBL(1)|1248, TBL(1)|1248, TBL(1)|1274, +-/* fa60 */ TBL(1)|1316, TBL(1)|1322, TBL(1)|1335, TBL(1)|1336, TBL(1)|1353, TBL(1)|1354, TBL(1)|1376, TBL(1)|1378, +-/* fa68 */ TBL(1)|1431, TBL(1)|1448, TBL(1)|1454, TBL(1)|839, TBL(2)|969, TBL(1)|1241, 0, 0, +-/* fa70 */ TBL(1)|536, TBL(1)|601, TBL(1)|585, TBL(1)|563, TBL(1)|579, TBL(1)|590, TBL(1)|626, TBL(1)|633, +-/* fa78 */ TBL(1)|691, TBL(1)|686, TBL(1)|690, TBL(1)|697, TBL(1)|716, TBL(1)|720, TBL(1)|737, TBL(1)|740, +-/* fa80 */ TBL(1)|747, TBL(1)|751, TBL(1)|809, TBL(1)|811, TBL(1)|823, TBL(1)|831, TBL(1)|843, TBL(1)|849, +-/* fa88 */ TBL(1)|845, TBL(1)|853, TBL(1)|850, TBL(1)|859, TBL(1)|866, TBL(1)|888, TBL(1)|891, TBL(1)|893, +-/* fa90 */ TBL(1)|903, TBL(1)|920, TBL(1)|932, TBL(1)|933, TBL(1)|938, TBL(1)|970, TBL(1)|974, TBL(1)|996, +-/* fa98 */ TBL(1)|1015, TBL(1)|1013, TBL(1)|1018, TBL(1)|1025, TBL(1)|1039, TBL(1)|1125, TBL(1)|1048, TBL(1)|1061, +-/* faa0 */ TBL(1)|1064, TBL(1)|1080, TBL(1)|1087, TBL(1)|1096, TBL(1)|1105, TBL(1)|1106, TBL(1)|1113, TBL(1)|1114, +-/* faa8 */ TBL(1)|1118, TBL(1)|1123, TBL(1)|1122, TBL(1)|1134, TBL(1)|1165, TBL(1)|1171, TBL(1)|1177, TBL(1)|1191, +-/* fab0 */ TBL(1)|1196, TBL(1)|1203, TBL(1)|1215, TBL(1)|1260, TBL(1)|1270, TBL(1)|1299, TBL(1)|1317, TBL(1)|1320, +-/* fab8 */ TBL(1)|1322, TBL(1)|1328, TBL(1)|1333, TBL(1)|1329, TBL(1)|1335, TBL(1)|1334, TBL(1)|1332, TBL(1)|1336, +-/* fac0 */ TBL(1)|1339, TBL(1)|1354, TBL(1)|1369, TBL(1)|1381, TBL(1)|1395, TBL(1)|1403, TBL(1)|1422, TBL(1)|1431, +-/* fac8 */ TBL(1)|1439, TBL(1)|1444, TBL(1)|1448, TBL(1)|1451, TBL(1)|1454, TBL(1)|1475, TBL(1)|1515, TBL(2)|948, +-/* fad0 */ TBL(2)|947, TBL(2)|957, TBL(1)|482, TBL(1)|492, TBL(1)|493, TBL(2)|983, TBL(2)|992, TBL(2)|1016, +-/* fad8 */ TBL(1)|1510, TBL(1)|1514, 0, 0, 0, 0, 0, 0, ++/* fa00 */ TBL(1)|656, TBL(1)|848, TBL(1)|920, TBL(1)|1226, TBL(1)|802, TBL(1)|1038, TBL(1)|969, TBL(1)|1415, ++/* fa08 */ TBL(1)|1351, TBL(1)|1464, TBL(1)|1366, TBL(1)|855, TBL(1)|623, TBL(1)|740, 0, 0, ++/* fa10 */ TBL(1)|761, 0, TBL(1)|965, 0, 0, TBL(1)|651, TBL(1)|1109, TBL(1)|1158, ++/* fa18 */ TBL(1)|1183, TBL(1)|1190, TBL(1)|1191, TBL(1)|1196, TBL(1)|1484, TBL(1)|1224, TBL(1)|1257, 0, ++/* fa20 */ TBL(1)|1329, 0, TBL(1)|1378, 0, 0, TBL(1)|1423, TBL(1)|1434, 0, ++/* fa28 */ 0, 0, TBL(1)|1505, TBL(1)|1506, TBL(1)|1507, TBL(1)|1532, TBL(1)|1432, TBL(1)|1471, ++/* fa30 */ TBL(1)|611, TBL(1)|620, TBL(1)|625, TBL(1)|672, TBL(1)|675, TBL(1)|691, TBL(1)|736, TBL(1)|743, ++/* fa38 */ TBL(1)|745, TBL(1)|760, TBL(1)|763, TBL(1)|818, TBL(1)|820, TBL(1)|886, TBL(1)|896, TBL(1)|898, ++/* fa40 */ TBL(1)|904, TBL(1)|947, TBL(1)|959, TBL(1)|967, TBL(1)|995, TBL(1)|1044, TBL(1)|1051, TBL(1)|1063, ++/* fa48 */ TBL(1)|1084, TBL(1)|1092, TBL(1)|1121, TBL(1)|1177, TBL(1)|1184, TBL(1)|1186, TBL(1)|1185, TBL(1)|1187, ++/* fa50 */ TBL(1)|1188, TBL(1)|1189, TBL(1)|1194, TBL(1)|1195, TBL(1)|1204, TBL(1)|1209, TBL(1)|1216, TBL(1)|1241, ++/* fa58 */ TBL(1)|1243, TBL(1)|1245, TBL(1)|1250, TBL(1)|1260, TBL(1)|1280, TBL(1)|1293, TBL(1)|1293, TBL(1)|1319, ++/* fa60 */ TBL(1)|1361, TBL(1)|1367, TBL(1)|1380, TBL(1)|1381, TBL(1)|1398, TBL(1)|1399, TBL(1)|1421, TBL(1)|1423, ++/* fa68 */ TBL(1)|1476, TBL(1)|1493, TBL(1)|1499, TBL(1)|884, TBL(2)|975, TBL(1)|1286, 0, 0, ++/* fa70 */ TBL(1)|581, TBL(1)|646, TBL(1)|630, TBL(1)|608, TBL(1)|624, TBL(1)|635, TBL(1)|671, TBL(1)|678, ++/* fa78 */ TBL(1)|736, TBL(1)|731, TBL(1)|735, TBL(1)|742, TBL(1)|761, TBL(1)|765, TBL(1)|782, TBL(1)|785, ++/* fa80 */ TBL(1)|792, TBL(1)|796, TBL(1)|854, TBL(1)|856, TBL(1)|868, TBL(1)|876, TBL(1)|888, TBL(1)|894, ++/* fa88 */ TBL(1)|890, TBL(1)|898, TBL(1)|895, TBL(1)|904, TBL(1)|911, TBL(1)|933, TBL(1)|936, TBL(1)|938, ++/* fa90 */ TBL(1)|948, TBL(1)|965, TBL(1)|977, TBL(1)|978, TBL(1)|983, TBL(1)|1015, TBL(1)|1019, TBL(1)|1041, ++/* fa98 */ TBL(1)|1060, TBL(1)|1058, TBL(1)|1063, TBL(1)|1070, TBL(1)|1084, TBL(1)|1170, TBL(1)|1093, TBL(1)|1106, ++/* faa0 */ TBL(1)|1109, TBL(1)|1125, TBL(1)|1132, TBL(1)|1141, TBL(1)|1150, TBL(1)|1151, TBL(1)|1158, TBL(1)|1159, ++/* faa8 */ TBL(1)|1163, TBL(1)|1168, TBL(1)|1167, TBL(1)|1179, TBL(1)|1210, TBL(1)|1216, TBL(1)|1222, TBL(1)|1236, ++/* fab0 */ TBL(1)|1241, TBL(1)|1248, TBL(1)|1260, TBL(1)|1305, TBL(1)|1315, TBL(1)|1344, TBL(1)|1362, TBL(1)|1365, ++/* fab8 */ TBL(1)|1367, TBL(1)|1373, TBL(1)|1378, TBL(1)|1374, TBL(1)|1380, TBL(1)|1379, TBL(1)|1377, TBL(1)|1381, ++/* fac0 */ TBL(1)|1384, TBL(1)|1399, TBL(1)|1414, TBL(1)|1426, TBL(1)|1440, TBL(1)|1448, TBL(1)|1467, TBL(1)|1476, ++/* fac8 */ TBL(1)|1484, TBL(1)|1489, TBL(1)|1493, TBL(1)|1496, TBL(1)|1499, TBL(1)|1520, TBL(1)|1560, TBL(2)|954, ++/* fad0 */ TBL(2)|953, TBL(2)|963, TBL(1)|527, TBL(1)|537, TBL(1)|538, TBL(2)|989, TBL(2)|998, TBL(2)|1022, ++/* fad8 */ TBL(1)|1555, TBL(1)|1559, 0, 0, 0, 0, 0, 0, + /* fae0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* fae8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* faf0 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1859,38 +1866,38 @@ static const uint16_t UNWIF_compat_00_fa [256] = { + }; + + static const uint16_t UNWIF_compat_00_fb [256] = { +-/* fb00 */ TBL(2)|1094, TBL(2)|1095, TBL(2)|1096, TBL(3)|576, TBL(3)|577, TBL(2)|1229, TBL(2)|1229, 0, ++/* fb00 */ TBL(2)|1100, TBL(2)|1101, TBL(2)|1102, TBL(3)|576, TBL(3)|577, TBL(2)|1235, TBL(2)|1235, 0, + /* fb08 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* fb10 */ 0, 0, 0, TBL(2)|518, TBL(2)|515, TBL(2)|516, TBL(2)|519, TBL(2)|517, + /* fb18 */ 0, 0, 0, 0, 0, TBL(2)|533, 0, TBL(2)|552, +-/* fb20 */ TBL(1)|187, TBL(1)|179, TBL(1)|182, TBL(1)|183, TBL(1)|184, TBL(1)|185, TBL(1)|186, TBL(1)|188, +-/* fb28 */ TBL(1)|189, TBL(1)|3, TBL(2)|549, TBL(2)|550, TBL(3)|374, TBL(3)|375, TBL(2)|520, TBL(2)|521, ++/* fb20 */ TBL(1)|230, TBL(1)|222, TBL(1)|225, TBL(1)|226, TBL(1)|227, TBL(1)|228, TBL(1)|229, TBL(1)|231, ++/* fb28 */ TBL(1)|232, TBL(1)|3, TBL(2)|549, TBL(2)|550, TBL(3)|374, TBL(3)|375, TBL(2)|520, TBL(2)|521, + /* fb30 */ TBL(2)|522, TBL(2)|524, TBL(2)|526, TBL(2)|527, TBL(2)|528, TBL(2)|530, TBL(2)|531, 0, + /* fb38 */ TBL(2)|532, TBL(2)|534, TBL(2)|535, TBL(2)|536, TBL(2)|538, 0, TBL(2)|539, 0, + /* fb40 */ TBL(2)|540, TBL(2)|541, 0, TBL(2)|542, TBL(2)|543, 0, TBL(2)|545, TBL(2)|546, + /* fb48 */ TBL(2)|547, TBL(2)|548, TBL(2)|551, TBL(2)|529, TBL(2)|525, TBL(2)|537, TBL(2)|544, TBL(2)|523, +-/* fb50 */ TBL(1)|223, TBL(1)|223, TBL(1)|226, TBL(1)|226, TBL(1)|226, TBL(1)|226, TBL(1)|227, TBL(1)|227, +-/* fb58 */ TBL(1)|227, TBL(1)|227, TBL(1)|229, TBL(1)|229, TBL(1)|229, TBL(1)|229, TBL(1)|225, TBL(1)|225, +-/* fb60 */ TBL(1)|225, TBL(1)|225, TBL(1)|228, TBL(1)|228, TBL(1)|228, TBL(1)|228, TBL(1)|224, TBL(1)|224, +-/* fb68 */ TBL(1)|224, TBL(1)|224, TBL(1)|241, TBL(1)|241, TBL(1)|241, TBL(1)|241, TBL(1)|242, TBL(1)|242, +-/* fb70 */ TBL(1)|242, TBL(1)|242, TBL(1)|231, TBL(1)|231, TBL(1)|231, TBL(1)|231, TBL(1)|230, TBL(1)|230, +-/* fb78 */ TBL(1)|230, TBL(1)|230, TBL(1)|232, TBL(1)|232, TBL(1)|232, TBL(1)|232, TBL(1)|233, TBL(1)|233, +-/* fb80 */ TBL(1)|233, TBL(1)|233, TBL(1)|236, TBL(1)|236, TBL(1)|235, TBL(1)|235, TBL(1)|237, TBL(1)|237, +-/* fb88 */ TBL(1)|234, TBL(1)|234, TBL(1)|239, TBL(1)|239, TBL(1)|238, TBL(1)|238, TBL(1)|243, TBL(1)|243, +-/* fb90 */ TBL(1)|243, TBL(1)|243, TBL(1)|245, TBL(1)|245, TBL(1)|245, TBL(1)|245, TBL(1)|247, TBL(1)|247, +-/* fb98 */ TBL(1)|247, TBL(1)|247, TBL(1)|246, TBL(1)|246, TBL(1)|246, TBL(1)|246, TBL(1)|248, TBL(1)|248, +-/* fba0 */ TBL(1)|249, TBL(1)|249, TBL(1)|249, TBL(1)|249, TBL(2)|715, TBL(2)|715, TBL(1)|251, TBL(1)|251, +-/* fba8 */ TBL(1)|251, TBL(1)|251, TBL(1)|250, TBL(1)|250, TBL(1)|250, TBL(1)|250, TBL(1)|260, TBL(1)|260, ++/* fb50 */ TBL(1)|266, TBL(1)|266, TBL(1)|269, TBL(1)|269, TBL(1)|269, TBL(1)|269, TBL(1)|270, TBL(1)|270, ++/* fb58 */ TBL(1)|270, TBL(1)|270, TBL(1)|272, TBL(1)|272, TBL(1)|272, TBL(1)|272, TBL(1)|268, TBL(1)|268, ++/* fb60 */ TBL(1)|268, TBL(1)|268, TBL(1)|271, TBL(1)|271, TBL(1)|271, TBL(1)|271, TBL(1)|267, TBL(1)|267, ++/* fb68 */ TBL(1)|267, TBL(1)|267, TBL(1)|284, TBL(1)|284, TBL(1)|284, TBL(1)|284, TBL(1)|285, TBL(1)|285, ++/* fb70 */ TBL(1)|285, TBL(1)|285, TBL(1)|274, TBL(1)|274, TBL(1)|274, TBL(1)|274, TBL(1)|273, TBL(1)|273, ++/* fb78 */ TBL(1)|273, TBL(1)|273, TBL(1)|275, TBL(1)|275, TBL(1)|275, TBL(1)|275, TBL(1)|276, TBL(1)|276, ++/* fb80 */ TBL(1)|276, TBL(1)|276, TBL(1)|279, TBL(1)|279, TBL(1)|278, TBL(1)|278, TBL(1)|280, TBL(1)|280, ++/* fb88 */ TBL(1)|277, TBL(1)|277, TBL(1)|282, TBL(1)|282, TBL(1)|281, TBL(1)|281, TBL(1)|286, TBL(1)|286, ++/* fb90 */ TBL(1)|286, TBL(1)|286, TBL(1)|288, TBL(1)|288, TBL(1)|288, TBL(1)|288, TBL(1)|290, TBL(1)|290, ++/* fb98 */ TBL(1)|290, TBL(1)|290, TBL(1)|289, TBL(1)|289, TBL(1)|289, TBL(1)|289, TBL(1)|291, TBL(1)|291, ++/* fba0 */ TBL(1)|292, TBL(1)|292, TBL(1)|292, TBL(1)|292, TBL(2)|715, TBL(2)|715, TBL(1)|294, TBL(1)|294, ++/* fba8 */ TBL(1)|294, TBL(1)|294, TBL(1)|293, TBL(1)|293, TBL(1)|293, TBL(1)|293, TBL(1)|303, TBL(1)|303, + /* fbb0 */ TBL(2)|714, TBL(2)|714, 0, 0, 0, 0, 0, 0, + /* fbb8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* fbc0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* fbc8 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* fbd0 */ 0, 0, 0, TBL(1)|244, TBL(1)|244, TBL(1)|244, TBL(1)|244, TBL(1)|254, +-/* fbd8 */ TBL(1)|254, TBL(1)|253, TBL(1)|253, TBL(1)|255, TBL(1)|255, TBL(2)|713, TBL(1)|257, TBL(1)|257, +-/* fbe0 */ TBL(1)|252, TBL(1)|252, TBL(1)|256, TBL(1)|256, TBL(1)|259, TBL(1)|259, TBL(1)|259, TBL(1)|259, +-/* fbe8 */ TBL(1)|219, TBL(1)|219, TBL(3)|479, TBL(3)|479, TBL(3)|495, TBL(3)|495, TBL(3)|488, TBL(3)|488, ++/* fbd0 */ 0, 0, 0, TBL(1)|287, TBL(1)|287, TBL(1)|287, TBL(1)|287, TBL(1)|297, ++/* fbd8 */ TBL(1)|297, TBL(1)|296, TBL(1)|296, TBL(1)|298, TBL(1)|298, TBL(2)|713, TBL(1)|300, TBL(1)|300, ++/* fbe0 */ TBL(1)|295, TBL(1)|295, TBL(1)|299, TBL(1)|299, TBL(1)|302, TBL(1)|302, TBL(1)|302, TBL(1)|302, ++/* fbe8 */ TBL(1)|262, TBL(1)|262, TBL(3)|479, TBL(3)|479, TBL(3)|495, TBL(3)|495, TBL(3)|488, TBL(3)|488, + /* fbf0 */ TBL(3)|492, TBL(3)|492, TBL(3)|491, TBL(3)|491, TBL(3)|493, TBL(3)|493, TBL(3)|494, TBL(3)|494, +-/* fbf8 */ TBL(3)|494, TBL(3)|489, TBL(3)|489, TBL(3)|489, TBL(1)|258, TBL(1)|258, TBL(1)|258, TBL(1)|258 ++/* fbf8 */ TBL(3)|494, TBL(3)|489, TBL(3)|489, TBL(3)|489, TBL(1)|301, TBL(1)|301, TBL(1)|301, TBL(1)|301 + }; + + static const uint16_t UNWIF_compat_00_fc [256] = { +@@ -1966,35 +1973,35 @@ static const uint16_t UNWIF_compat_00_fd [256] = { + static const uint16_t UNWIF_compat_00_fe [256] = { + /* fe00 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* fe08 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* fe10 */ TBL(1)|4, TBL(1)|383, TBL(1)|384, TBL(1)|18, TBL(1)|19, TBL(1)|53, TBL(1)|23, TBL(1)|398, +-/* fe18 */ TBL(1)|399, TBL(3)|111, 0, 0, 0, 0, 0, 0, ++/* fe10 */ TBL(1)|4, TBL(1)|428, TBL(1)|429, TBL(1)|18, TBL(1)|19, TBL(1)|53, TBL(1)|23, TBL(1)|443, ++/* fe18 */ TBL(1)|444, TBL(3)|111, 0, 0, 0, 0, 0, 0, + /* fe20 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* fe28 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* fe30 */ TBL(2)|0, TBL(1)|367, TBL(1)|366, TBL(1)|1524, TBL(1)|1524, TBL(1)|0, TBL(1)|1, TBL(1)|1552, +-/* fe38 */ TBL(1)|1554, TBL(1)|396, TBL(1)|397, TBL(1)|393, TBL(1)|394, TBL(1)|387, TBL(1)|388, TBL(1)|385, +-/* fe40 */ TBL(1)|386, TBL(1)|389, TBL(1)|390, TBL(1)|391, TBL(1)|392, 0, 0, TBL(1)|51, +-/* fe48 */ TBL(1)|1522, TBL(2)|332, TBL(2)|332, TBL(2)|332, TBL(2)|332, TBL(1)|1524, TBL(1)|1524, TBL(1)|1524, +-/* fe50 */ TBL(1)|4, TBL(1)|383, TBL(1)|6, 0, TBL(1)|19, TBL(1)|18, TBL(1)|23, TBL(1)|53, +-/* fe58 */ TBL(1)|367, TBL(1)|0, TBL(1)|1, TBL(1)|1552, TBL(1)|1554, TBL(1)|396, TBL(1)|397, TBL(1)|55, ++/* fe30 */ TBL(2)|0, TBL(1)|411, TBL(1)|410, TBL(1)|1572, TBL(1)|1572, TBL(1)|0, TBL(1)|1, TBL(1)|1600, ++/* fe38 */ TBL(1)|1602, TBL(1)|441, TBL(1)|442, TBL(1)|438, TBL(1)|439, TBL(1)|432, TBL(1)|433, TBL(1)|430, ++/* fe40 */ TBL(1)|431, TBL(1)|434, TBL(1)|435, TBL(1)|436, TBL(1)|437, 0, 0, TBL(1)|51, ++/* fe48 */ TBL(1)|1570, TBL(2)|332, TBL(2)|332, TBL(2)|332, TBL(2)|332, TBL(1)|1572, TBL(1)|1572, TBL(1)|1572, ++/* fe50 */ TBL(1)|4, TBL(1)|428, TBL(1)|6, 0, TBL(1)|19, TBL(1)|18, TBL(1)|23, TBL(1)|53, ++/* fe58 */ TBL(1)|411, TBL(1)|0, TBL(1)|1, TBL(1)|1600, TBL(1)|1602, TBL(1)|441, TBL(1)|442, TBL(1)|55, + /* fe60 */ TBL(1)|58, TBL(1)|2, TBL(1)|3, TBL(1)|5, TBL(1)|20, TBL(1)|22, TBL(1)|21, 0, + /* fe68 */ TBL(1)|60, TBL(1)|56, TBL(1)|57, TBL(1)|24, 0, 0, 0, 0, + /* fe70 */ TBL(2)|345, TBL(2)|643, TBL(2)|346, 0, TBL(2)|347, 0, TBL(2)|348, TBL(2)|644, + /* fe78 */ TBL(2)|349, TBL(2)|645, TBL(2)|350, TBL(2)|646, TBL(2)|351, TBL(2)|647, TBL(2)|352, TBL(2)|648, +-/* fe80 */ TBL(1)|190, TBL(2)|554, TBL(2)|554, TBL(2)|555, TBL(2)|555, TBL(2)|697, TBL(2)|697, TBL(2)|556, +-/* fe88 */ TBL(2)|556, TBL(2)|710, TBL(2)|710, TBL(2)|710, TBL(2)|710, TBL(1)|191, TBL(1)|191, TBL(1)|192, +-/* fe90 */ TBL(1)|192, TBL(1)|192, TBL(1)|192, TBL(1)|193, TBL(1)|193, TBL(1)|194, TBL(1)|194, TBL(1)|194, +-/* fe98 */ TBL(1)|194, TBL(1)|195, TBL(1)|195, TBL(1)|195, TBL(1)|195, TBL(1)|196, TBL(1)|196, TBL(1)|196, +-/* fea0 */ TBL(1)|196, TBL(1)|197, TBL(1)|197, TBL(1)|197, TBL(1)|197, TBL(1)|198, TBL(1)|198, TBL(1)|198, +-/* fea8 */ TBL(1)|198, TBL(1)|199, TBL(1)|199, TBL(1)|200, TBL(1)|200, TBL(1)|201, TBL(1)|201, TBL(1)|202, +-/* feb0 */ TBL(1)|202, TBL(1)|203, TBL(1)|203, TBL(1)|203, TBL(1)|203, TBL(1)|204, TBL(1)|204, TBL(1)|204, +-/* feb8 */ TBL(1)|204, TBL(1)|205, TBL(1)|205, TBL(1)|205, TBL(1)|205, TBL(1)|206, TBL(1)|206, TBL(1)|206, +-/* fec0 */ TBL(1)|206, TBL(1)|207, TBL(1)|207, TBL(1)|207, TBL(1)|207, TBL(1)|208, TBL(1)|208, TBL(1)|208, +-/* fec8 */ TBL(1)|208, TBL(1)|209, TBL(1)|209, TBL(1)|209, TBL(1)|209, TBL(1)|210, TBL(1)|210, TBL(1)|210, +-/* fed0 */ TBL(1)|210, TBL(1)|211, TBL(1)|211, TBL(1)|211, TBL(1)|211, TBL(1)|212, TBL(1)|212, TBL(1)|212, +-/* fed8 */ TBL(1)|212, TBL(1)|213, TBL(1)|213, TBL(1)|213, TBL(1)|213, TBL(1)|214, TBL(1)|214, TBL(1)|214, +-/* fee0 */ TBL(1)|214, TBL(1)|215, TBL(1)|215, TBL(1)|215, TBL(1)|215, TBL(1)|216, TBL(1)|216, TBL(1)|216, +-/* fee8 */ TBL(1)|216, TBL(1)|217, TBL(1)|217, TBL(1)|217, TBL(1)|217, TBL(1)|218, TBL(1)|218, TBL(1)|219, +-/* fef0 */ TBL(1)|219, TBL(1)|220, TBL(1)|220, TBL(1)|220, TBL(1)|220, TBL(3)|441, TBL(3)|441, TBL(3)|442, ++/* fe80 */ TBL(1)|233, TBL(2)|554, TBL(2)|554, TBL(2)|555, TBL(2)|555, TBL(2)|697, TBL(2)|697, TBL(2)|556, ++/* fe88 */ TBL(2)|556, TBL(2)|710, TBL(2)|710, TBL(2)|710, TBL(2)|710, TBL(1)|234, TBL(1)|234, TBL(1)|235, ++/* fe90 */ TBL(1)|235, TBL(1)|235, TBL(1)|235, TBL(1)|236, TBL(1)|236, TBL(1)|237, TBL(1)|237, TBL(1)|237, ++/* fe98 */ TBL(1)|237, TBL(1)|238, TBL(1)|238, TBL(1)|238, TBL(1)|238, TBL(1)|239, TBL(1)|239, TBL(1)|239, ++/* fea0 */ TBL(1)|239, TBL(1)|240, TBL(1)|240, TBL(1)|240, TBL(1)|240, TBL(1)|241, TBL(1)|241, TBL(1)|241, ++/* fea8 */ TBL(1)|241, TBL(1)|242, TBL(1)|242, TBL(1)|243, TBL(1)|243, TBL(1)|244, TBL(1)|244, TBL(1)|245, ++/* feb0 */ TBL(1)|245, TBL(1)|246, TBL(1)|246, TBL(1)|246, TBL(1)|246, TBL(1)|247, TBL(1)|247, TBL(1)|247, ++/* feb8 */ TBL(1)|247, TBL(1)|248, TBL(1)|248, TBL(1)|248, TBL(1)|248, TBL(1)|249, TBL(1)|249, TBL(1)|249, ++/* fec0 */ TBL(1)|249, TBL(1)|250, TBL(1)|250, TBL(1)|250, TBL(1)|250, TBL(1)|251, TBL(1)|251, TBL(1)|251, ++/* fec8 */ TBL(1)|251, TBL(1)|252, TBL(1)|252, TBL(1)|252, TBL(1)|252, TBL(1)|253, TBL(1)|253, TBL(1)|253, ++/* fed0 */ TBL(1)|253, TBL(1)|254, TBL(1)|254, TBL(1)|254, TBL(1)|254, TBL(1)|255, TBL(1)|255, TBL(1)|255, ++/* fed8 */ TBL(1)|255, TBL(1)|256, TBL(1)|256, TBL(1)|256, TBL(1)|256, TBL(1)|257, TBL(1)|257, TBL(1)|257, ++/* fee0 */ TBL(1)|257, TBL(1)|258, TBL(1)|258, TBL(1)|258, TBL(1)|258, TBL(1)|259, TBL(1)|259, TBL(1)|259, ++/* fee8 */ TBL(1)|259, TBL(1)|260, TBL(1)|260, TBL(1)|260, TBL(1)|260, TBL(1)|261, TBL(1)|261, TBL(1)|262, ++/* fef0 */ TBL(1)|262, TBL(1)|263, TBL(1)|263, TBL(1)|263, TBL(1)|263, TBL(3)|441, TBL(3)|441, TBL(3)|442, + /* fef8 */ TBL(3)|442, TBL(3)|443, TBL(3)|443, TBL(2)|667, TBL(2)|667, 0, 0, 0 + }; + +@@ -2006,33 +2013,68 @@ static const uint16_t UNWIF_compat_00_ff [256] = { + /* ff20 */ TBL(1)|24, TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, TBL(1)|29, TBL(1)|30, TBL(1)|31, + /* ff28 */ TBL(1)|32, TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, TBL(1)|37, TBL(1)|38, TBL(1)|39, + /* ff30 */ TBL(1)|40, TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, TBL(1)|45, TBL(1)|46, TBL(1)|47, +-/* ff38 */ TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|51, TBL(1)|60, TBL(1)|1522, TBL(1)|1523, TBL(1)|1524, +-/* ff40 */ TBL(1)|1525, TBL(1)|1526, TBL(1)|1527, TBL(1)|1528, TBL(1)|1529, TBL(1)|1530, TBL(1)|1531, TBL(1)|1532, +-/* ff48 */ TBL(1)|1533, TBL(1)|1534, TBL(1)|1535, TBL(1)|1536, TBL(1)|1537, TBL(1)|1538, TBL(1)|1539, TBL(1)|1540, +-/* ff50 */ TBL(1)|1541, TBL(1)|1542, TBL(1)|1543, TBL(1)|1544, TBL(1)|1545, TBL(1)|1546, TBL(1)|1547, TBL(1)|1548, +-/* ff58 */ TBL(1)|1549, TBL(1)|1550, TBL(1)|1551, TBL(1)|1552, TBL(1)|1553, TBL(1)|1554, TBL(1)|1555, TBL(1)|380, +-/* ff60 */ TBL(1)|381, TBL(1)|384, TBL(1)|389, TBL(1)|390, TBL(1)|383, TBL(1)|459, TBL(1)|457, TBL(1)|402, +-/* ff68 */ TBL(1)|404, TBL(1)|406, TBL(1)|408, TBL(1)|410, TBL(1)|443, TBL(1)|445, TBL(1)|447, TBL(1)|424, +-/* ff70 */ TBL(1)|460, TBL(1)|403, TBL(1)|405, TBL(1)|407, TBL(1)|409, TBL(1)|411, TBL(1)|412, TBL(1)|413, +-/* ff78 */ TBL(1)|414, TBL(1)|415, TBL(1)|416, TBL(1)|417, TBL(1)|418, TBL(1)|419, TBL(1)|420, TBL(1)|421, +-/* ff80 */ TBL(1)|422, TBL(1)|423, TBL(1)|425, TBL(1)|426, TBL(1)|427, TBL(1)|428, TBL(1)|429, TBL(1)|430, +-/* ff88 */ TBL(1)|431, TBL(1)|432, TBL(1)|433, TBL(1)|434, TBL(1)|435, TBL(1)|436, TBL(1)|437, TBL(1)|438, +-/* ff90 */ TBL(1)|439, TBL(1)|440, TBL(1)|441, TBL(1)|442, TBL(1)|444, TBL(1)|446, TBL(1)|448, TBL(1)|449, +-/* ff98 */ TBL(1)|450, TBL(1)|451, TBL(1)|452, TBL(1)|453, TBL(1)|454, TBL(1)|458, TBL(1)|400, TBL(1)|401, +-/* ffa0 */ TBL(1)|307, TBL(1)|263, TBL(1)|264, TBL(1)|337, TBL(1)|265, TBL(1)|338, TBL(1)|339, TBL(1)|266, +-/* ffa8 */ TBL(1)|267, TBL(1)|268, TBL(1)|340, TBL(1)|341, TBL(1)|342, TBL(1)|343, TBL(1)|344, TBL(1)|345, +-/* ffb0 */ TBL(1)|284, TBL(1)|269, TBL(1)|270, TBL(1)|271, TBL(1)|289, TBL(1)|272, TBL(1)|273, TBL(1)|274, +-/* ffb8 */ TBL(1)|275, TBL(1)|276, TBL(1)|277, TBL(1)|278, TBL(1)|279, TBL(1)|280, TBL(1)|281, 0, +-/* ffc0 */ 0, 0, TBL(1)|308, TBL(1)|309, TBL(1)|310, TBL(1)|311, TBL(1)|312, TBL(1)|313, +-/* ffc8 */ 0, 0, TBL(1)|314, TBL(1)|315, TBL(1)|316, TBL(1)|317, TBL(1)|318, TBL(1)|319, +-/* ffd0 */ 0, 0, TBL(1)|320, TBL(1)|321, TBL(1)|322, TBL(1)|323, TBL(1)|324, TBL(1)|325, +-/* ffd8 */ 0, 0, TBL(1)|326, TBL(1)|327, TBL(1)|328, 0, 0, 0, +-/* ffe0 */ TBL(1)|61, TBL(1)|62, TBL(1)|65, TBL(2)|331, TBL(1)|64, TBL(1)|63, TBL(1)|368, 0, +-/* ffe8 */ TBL(1)|377, TBL(1)|369, TBL(1)|370, TBL(1)|371, TBL(1)|372, TBL(1)|378, TBL(1)|379, 0, ++/* ff38 */ TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|51, TBL(1)|60, TBL(1)|1570, TBL(1)|1571, TBL(1)|1572, ++/* ff40 */ TBL(1)|1573, TBL(1)|1574, TBL(1)|1575, TBL(1)|1576, TBL(1)|1577, TBL(1)|1578, TBL(1)|1579, TBL(1)|1580, ++/* ff48 */ TBL(1)|1581, TBL(1)|1582, TBL(1)|1583, TBL(1)|1584, TBL(1)|1585, TBL(1)|1586, TBL(1)|1587, TBL(1)|1588, ++/* ff50 */ TBL(1)|1589, TBL(1)|1590, TBL(1)|1591, TBL(1)|1592, TBL(1)|1593, TBL(1)|1594, TBL(1)|1595, TBL(1)|1596, ++/* ff58 */ TBL(1)|1597, TBL(1)|1598, TBL(1)|1599, TBL(1)|1600, TBL(1)|1601, TBL(1)|1602, TBL(1)|1603, TBL(1)|424, ++/* ff60 */ TBL(1)|425, TBL(1)|429, TBL(1)|434, TBL(1)|435, TBL(1)|428, TBL(1)|504, TBL(1)|502, TBL(1)|447, ++/* ff68 */ TBL(1)|449, TBL(1)|451, TBL(1)|453, TBL(1)|455, TBL(1)|488, TBL(1)|490, TBL(1)|492, TBL(1)|469, ++/* ff70 */ TBL(1)|505, TBL(1)|448, TBL(1)|450, TBL(1)|452, TBL(1)|454, TBL(1)|456, TBL(1)|457, TBL(1)|458, ++/* ff78 */ TBL(1)|459, TBL(1)|460, TBL(1)|461, TBL(1)|462, TBL(1)|463, TBL(1)|464, TBL(1)|465, TBL(1)|466, ++/* ff80 */ TBL(1)|467, TBL(1)|468, TBL(1)|470, TBL(1)|471, TBL(1)|472, TBL(1)|473, TBL(1)|474, TBL(1)|475, ++/* ff88 */ TBL(1)|476, TBL(1)|477, TBL(1)|478, TBL(1)|479, TBL(1)|480, TBL(1)|481, TBL(1)|482, TBL(1)|483, ++/* ff90 */ TBL(1)|484, TBL(1)|485, TBL(1)|486, TBL(1)|487, TBL(1)|489, TBL(1)|491, TBL(1)|493, TBL(1)|494, ++/* ff98 */ TBL(1)|495, TBL(1)|496, TBL(1)|497, TBL(1)|498, TBL(1)|499, TBL(1)|503, TBL(1)|445, TBL(1)|446, ++/* ffa0 */ TBL(1)|350, TBL(1)|306, TBL(1)|307, TBL(1)|380, TBL(1)|308, TBL(1)|381, TBL(1)|382, TBL(1)|309, ++/* ffa8 */ TBL(1)|310, TBL(1)|311, TBL(1)|383, TBL(1)|384, TBL(1)|385, TBL(1)|386, TBL(1)|387, TBL(1)|388, ++/* ffb0 */ TBL(1)|327, TBL(1)|312, TBL(1)|313, TBL(1)|314, TBL(1)|332, TBL(1)|315, TBL(1)|316, TBL(1)|317, ++/* ffb8 */ TBL(1)|318, TBL(1)|319, TBL(1)|320, TBL(1)|321, TBL(1)|322, TBL(1)|323, TBL(1)|324, 0, ++/* ffc0 */ 0, 0, TBL(1)|351, TBL(1)|352, TBL(1)|353, TBL(1)|354, TBL(1)|355, TBL(1)|356, ++/* ffc8 */ 0, 0, TBL(1)|357, TBL(1)|358, TBL(1)|359, TBL(1)|360, TBL(1)|361, TBL(1)|362, ++/* ffd0 */ 0, 0, TBL(1)|363, TBL(1)|364, TBL(1)|365, TBL(1)|366, TBL(1)|367, TBL(1)|368, ++/* ffd8 */ 0, 0, TBL(1)|369, TBL(1)|370, TBL(1)|371, 0, 0, 0, ++/* ffe0 */ TBL(1)|61, TBL(1)|62, TBL(1)|65, TBL(2)|331, TBL(1)|64, TBL(1)|63, TBL(1)|412, 0, ++/* ffe8 */ TBL(1)|421, TBL(1)|413, TBL(1)|414, TBL(1)|415, TBL(1)|416, TBL(1)|422, TBL(1)|423, 0, + /* fff0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* fff8 */ 0, 0, 0, 0, 0, 0, 0, 0 + }; + ++static const uint16_t UNWIF_compat_01_07 [256] = { ++/* 010700 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010708 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010710 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010718 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010720 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010728 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010730 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010738 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010740 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010748 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010750 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010758 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010760 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010768 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010770 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010778 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010780 */ 0, TBL(1)|163, TBL(1)|164, TBL(1)|68, TBL(1)|146, TBL(1)|87, 0, TBL(1)|153, ++/* 010788 */ TBL(1)|1568, TBL(1)|155, TBL(1)|154, TBL(1)|90, TBL(1)|91, TBL(1)|408, TBL(1)|92, TBL(1)|96, ++/* 010790 */ TBL(1)|159, TBL(1)|102, TBL(1)|100, TBL(1)|98, TBL(1)|147, TBL(1)|72, TBL(1)|148, TBL(1)|105, ++/* 010798 */ TBL(1)|132, TBL(1)|160, TBL(1)|161, TBL(1)|110, TBL(2)|926, TBL(1)|1565, TBL(1)|112, TBL(2)|927, ++/* 0107a0 */ TBL(1)|139, TBL(2)|928, TBL(1)|70, TBL(1)|120, TBL(1)|121, TBL(1)|1590, TBL(1)|124, TBL(2)|929, ++/* 0107a8 */ TBL(1)|126, TBL(1)|127, TBL(1)|128, TBL(1)|158, TBL(1)|156, TBL(1)|1569, TBL(1)|157, TBL(1)|133, ++/* 0107b0 */ TBL(1)|426, 0, TBL(1)|140, TBL(1)|151, TBL(1)|152, TBL(1)|145, TBL(1)|79, TBL(1)|80, ++/* 0107b8 */ TBL(1)|81, TBL(2)|930, TBL(2)|931, 0, 0, 0, 0, 0, ++/* 0107c0 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 0107c8 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 0107d0 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 0107d8 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 0107e0 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 0107e8 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 0107f0 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 0107f8 */ 0, 0, 0, 0, 0, 0, 0, 0 ++}; ++ + static const uint16_t UNWIF_compat_01_10 [256] = { + /* 011000 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 011008 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -2282,134 +2324,134 @@ static const uint16_t UNWIF_compat_01_d4 [256] = { + /* 01d400 */ TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, + /* 01d408 */ TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, + /* 01d410 */ TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, +-/* 01d418 */ TBL(1)|49, TBL(1)|50, TBL(1)|1526, TBL(1)|1527, TBL(1)|1528, TBL(1)|1529, TBL(1)|1530, TBL(1)|1531, +-/* 01d420 */ TBL(1)|1532, TBL(1)|1533, TBL(1)|1534, TBL(1)|1535, TBL(1)|1536, TBL(1)|1537, TBL(1)|1538, TBL(1)|1539, +-/* 01d428 */ TBL(1)|1540, TBL(1)|1541, TBL(1)|1542, TBL(1)|1543, TBL(1)|1544, TBL(1)|1545, TBL(1)|1546, TBL(1)|1547, +-/* 01d430 */ TBL(1)|1548, TBL(1)|1549, TBL(1)|1550, TBL(1)|1551, TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, ++/* 01d418 */ TBL(1)|49, TBL(1)|50, TBL(1)|1574, TBL(1)|1575, TBL(1)|1576, TBL(1)|1577, TBL(1)|1578, TBL(1)|1579, ++/* 01d420 */ TBL(1)|1580, TBL(1)|1581, TBL(1)|1582, TBL(1)|1583, TBL(1)|1584, TBL(1)|1585, TBL(1)|1586, TBL(1)|1587, ++/* 01d428 */ TBL(1)|1588, TBL(1)|1589, TBL(1)|1590, TBL(1)|1591, TBL(1)|1592, TBL(1)|1593, TBL(1)|1594, TBL(1)|1595, ++/* 01d430 */ TBL(1)|1596, TBL(1)|1597, TBL(1)|1598, TBL(1)|1599, TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, + /* 01d438 */ TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, + /* 01d440 */ TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, +-/* 01d448 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|1526, TBL(1)|1527, +-/* 01d450 */ TBL(1)|1528, TBL(1)|1529, TBL(1)|1530, TBL(1)|1531, TBL(1)|1532, 0, TBL(1)|1534, TBL(1)|1535, +-/* 01d458 */ TBL(1)|1536, TBL(1)|1537, TBL(1)|1538, TBL(1)|1539, TBL(1)|1540, TBL(1)|1541, TBL(1)|1542, TBL(1)|1543, +-/* 01d460 */ TBL(1)|1544, TBL(1)|1545, TBL(1)|1546, TBL(1)|1547, TBL(1)|1548, TBL(1)|1549, TBL(1)|1550, TBL(1)|1551, ++/* 01d448 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|1574, TBL(1)|1575, ++/* 01d450 */ TBL(1)|1576, TBL(1)|1577, TBL(1)|1578, TBL(1)|1579, TBL(1)|1580, 0, TBL(1)|1582, TBL(1)|1583, ++/* 01d458 */ TBL(1)|1584, TBL(1)|1585, TBL(1)|1586, TBL(1)|1587, TBL(1)|1588, TBL(1)|1589, TBL(1)|1590, TBL(1)|1591, ++/* 01d460 */ TBL(1)|1592, TBL(1)|1593, TBL(1)|1594, TBL(1)|1595, TBL(1)|1596, TBL(1)|1597, TBL(1)|1598, TBL(1)|1599, + /* 01d468 */ TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, + /* 01d470 */ TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, + /* 01d478 */ TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, +-/* 01d480 */ TBL(1)|49, TBL(1)|50, TBL(1)|1526, TBL(1)|1527, TBL(1)|1528, TBL(1)|1529, TBL(1)|1530, TBL(1)|1531, +-/* 01d488 */ TBL(1)|1532, TBL(1)|1533, TBL(1)|1534, TBL(1)|1535, TBL(1)|1536, TBL(1)|1537, TBL(1)|1538, TBL(1)|1539, +-/* 01d490 */ TBL(1)|1540, TBL(1)|1541, TBL(1)|1542, TBL(1)|1543, TBL(1)|1544, TBL(1)|1545, TBL(1)|1546, TBL(1)|1547, +-/* 01d498 */ TBL(1)|1548, TBL(1)|1549, TBL(1)|1550, TBL(1)|1551, TBL(1)|25, 0, TBL(1)|27, TBL(1)|28, ++/* 01d480 */ TBL(1)|49, TBL(1)|50, TBL(1)|1574, TBL(1)|1575, TBL(1)|1576, TBL(1)|1577, TBL(1)|1578, TBL(1)|1579, ++/* 01d488 */ TBL(1)|1580, TBL(1)|1581, TBL(1)|1582, TBL(1)|1583, TBL(1)|1584, TBL(1)|1585, TBL(1)|1586, TBL(1)|1587, ++/* 01d490 */ TBL(1)|1588, TBL(1)|1589, TBL(1)|1590, TBL(1)|1591, TBL(1)|1592, TBL(1)|1593, TBL(1)|1594, TBL(1)|1595, ++/* 01d498 */ TBL(1)|1596, TBL(1)|1597, TBL(1)|1598, TBL(1)|1599, TBL(1)|25, 0, TBL(1)|27, TBL(1)|28, + /* 01d4a0 */ 0, 0, TBL(1)|31, 0, 0, TBL(1)|34, TBL(1)|35, 0, + /* 01d4a8 */ 0, TBL(1)|38, TBL(1)|39, TBL(1)|40, TBL(1)|41, 0, TBL(1)|43, TBL(1)|44, +-/* 01d4b0 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|1526, TBL(1)|1527, +-/* 01d4b8 */ TBL(1)|1528, TBL(1)|1529, 0, TBL(1)|1531, 0, TBL(1)|1533, TBL(1)|1534, TBL(1)|1535, +-/* 01d4c0 */ TBL(1)|1536, TBL(1)|1537, TBL(1)|1538, TBL(1)|1539, 0, TBL(1)|1541, TBL(1)|1542, TBL(1)|1543, +-/* 01d4c8 */ TBL(1)|1544, TBL(1)|1545, TBL(1)|1546, TBL(1)|1547, TBL(1)|1548, TBL(1)|1549, TBL(1)|1550, TBL(1)|1551, ++/* 01d4b0 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|1574, TBL(1)|1575, ++/* 01d4b8 */ TBL(1)|1576, TBL(1)|1577, 0, TBL(1)|1579, 0, TBL(1)|1581, TBL(1)|1582, TBL(1)|1583, ++/* 01d4c0 */ TBL(1)|1584, TBL(1)|1585, TBL(1)|1586, TBL(1)|1587, 0, TBL(1)|1589, TBL(1)|1590, TBL(1)|1591, ++/* 01d4c8 */ TBL(1)|1592, TBL(1)|1593, TBL(1)|1594, TBL(1)|1595, TBL(1)|1596, TBL(1)|1597, TBL(1)|1598, TBL(1)|1599, + /* 01d4d0 */ TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, + /* 01d4d8 */ TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, + /* 01d4e0 */ TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, +-/* 01d4e8 */ TBL(1)|49, TBL(1)|50, TBL(1)|1526, TBL(1)|1527, TBL(1)|1528, TBL(1)|1529, TBL(1)|1530, TBL(1)|1531, +-/* 01d4f0 */ TBL(1)|1532, TBL(1)|1533, TBL(1)|1534, TBL(1)|1535, TBL(1)|1536, TBL(1)|1537, TBL(1)|1538, TBL(1)|1539, +-/* 01d4f8 */ TBL(1)|1540, TBL(1)|1541, TBL(1)|1542, TBL(1)|1543, TBL(1)|1544, TBL(1)|1545, TBL(1)|1546, TBL(1)|1547 ++/* 01d4e8 */ TBL(1)|49, TBL(1)|50, TBL(1)|1574, TBL(1)|1575, TBL(1)|1576, TBL(1)|1577, TBL(1)|1578, TBL(1)|1579, ++/* 01d4f0 */ TBL(1)|1580, TBL(1)|1581, TBL(1)|1582, TBL(1)|1583, TBL(1)|1584, TBL(1)|1585, TBL(1)|1586, TBL(1)|1587, ++/* 01d4f8 */ TBL(1)|1588, TBL(1)|1589, TBL(1)|1590, TBL(1)|1591, TBL(1)|1592, TBL(1)|1593, TBL(1)|1594, TBL(1)|1595 + }; + + static const uint16_t UNWIF_compat_01_d5 [256] = { +-/* 01d500 */ TBL(1)|1548, TBL(1)|1549, TBL(1)|1550, TBL(1)|1551, TBL(1)|25, TBL(1)|26, 0, TBL(1)|28, ++/* 01d500 */ TBL(1)|1596, TBL(1)|1597, TBL(1)|1598, TBL(1)|1599, TBL(1)|25, TBL(1)|26, 0, TBL(1)|28, + /* 01d508 */ TBL(1)|29, TBL(1)|30, TBL(1)|31, 0, 0, TBL(1)|34, TBL(1)|35, TBL(1)|36, + /* 01d510 */ TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, TBL(1)|41, 0, TBL(1)|43, TBL(1)|44, +-/* 01d518 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, 0, TBL(1)|1526, TBL(1)|1527, +-/* 01d520 */ TBL(1)|1528, TBL(1)|1529, TBL(1)|1530, TBL(1)|1531, TBL(1)|1532, TBL(1)|1533, TBL(1)|1534, TBL(1)|1535, +-/* 01d528 */ TBL(1)|1536, TBL(1)|1537, TBL(1)|1538, TBL(1)|1539, TBL(1)|1540, TBL(1)|1541, TBL(1)|1542, TBL(1)|1543, +-/* 01d530 */ TBL(1)|1544, TBL(1)|1545, TBL(1)|1546, TBL(1)|1547, TBL(1)|1548, TBL(1)|1549, TBL(1)|1550, TBL(1)|1551, ++/* 01d518 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, 0, TBL(1)|1574, TBL(1)|1575, ++/* 01d520 */ TBL(1)|1576, TBL(1)|1577, TBL(1)|1578, TBL(1)|1579, TBL(1)|1580, TBL(1)|1581, TBL(1)|1582, TBL(1)|1583, ++/* 01d528 */ TBL(1)|1584, TBL(1)|1585, TBL(1)|1586, TBL(1)|1587, TBL(1)|1588, TBL(1)|1589, TBL(1)|1590, TBL(1)|1591, ++/* 01d530 */ TBL(1)|1592, TBL(1)|1593, TBL(1)|1594, TBL(1)|1595, TBL(1)|1596, TBL(1)|1597, TBL(1)|1598, TBL(1)|1599, + /* 01d538 */ TBL(1)|25, TBL(1)|26, 0, TBL(1)|28, TBL(1)|29, TBL(1)|30, TBL(1)|31, 0, + /* 01d540 */ TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, TBL(1)|37, 0, TBL(1)|39, 0, + /* 01d548 */ 0, 0, TBL(1)|43, TBL(1)|44, TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, +-/* 01d550 */ TBL(1)|49, 0, TBL(1)|1526, TBL(1)|1527, TBL(1)|1528, TBL(1)|1529, TBL(1)|1530, TBL(1)|1531, +-/* 01d558 */ TBL(1)|1532, TBL(1)|1533, TBL(1)|1534, TBL(1)|1535, TBL(1)|1536, TBL(1)|1537, TBL(1)|1538, TBL(1)|1539, +-/* 01d560 */ TBL(1)|1540, TBL(1)|1541, TBL(1)|1542, TBL(1)|1543, TBL(1)|1544, TBL(1)|1545, TBL(1)|1546, TBL(1)|1547, +-/* 01d568 */ TBL(1)|1548, TBL(1)|1549, TBL(1)|1550, TBL(1)|1551, TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, ++/* 01d550 */ TBL(1)|49, 0, TBL(1)|1574, TBL(1)|1575, TBL(1)|1576, TBL(1)|1577, TBL(1)|1578, TBL(1)|1579, ++/* 01d558 */ TBL(1)|1580, TBL(1)|1581, TBL(1)|1582, TBL(1)|1583, TBL(1)|1584, TBL(1)|1585, TBL(1)|1586, TBL(1)|1587, ++/* 01d560 */ TBL(1)|1588, TBL(1)|1589, TBL(1)|1590, TBL(1)|1591, TBL(1)|1592, TBL(1)|1593, TBL(1)|1594, TBL(1)|1595, ++/* 01d568 */ TBL(1)|1596, TBL(1)|1597, TBL(1)|1598, TBL(1)|1599, TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, + /* 01d570 */ TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, + /* 01d578 */ TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, +-/* 01d580 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|1526, TBL(1)|1527, +-/* 01d588 */ TBL(1)|1528, TBL(1)|1529, TBL(1)|1530, TBL(1)|1531, TBL(1)|1532, TBL(1)|1533, TBL(1)|1534, TBL(1)|1535, +-/* 01d590 */ TBL(1)|1536, TBL(1)|1537, TBL(1)|1538, TBL(1)|1539, TBL(1)|1540, TBL(1)|1541, TBL(1)|1542, TBL(1)|1543, +-/* 01d598 */ TBL(1)|1544, TBL(1)|1545, TBL(1)|1546, TBL(1)|1547, TBL(1)|1548, TBL(1)|1549, TBL(1)|1550, TBL(1)|1551, ++/* 01d580 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|1574, TBL(1)|1575, ++/* 01d588 */ TBL(1)|1576, TBL(1)|1577, TBL(1)|1578, TBL(1)|1579, TBL(1)|1580, TBL(1)|1581, TBL(1)|1582, TBL(1)|1583, ++/* 01d590 */ TBL(1)|1584, TBL(1)|1585, TBL(1)|1586, TBL(1)|1587, TBL(1)|1588, TBL(1)|1589, TBL(1)|1590, TBL(1)|1591, ++/* 01d598 */ TBL(1)|1592, TBL(1)|1593, TBL(1)|1594, TBL(1)|1595, TBL(1)|1596, TBL(1)|1597, TBL(1)|1598, TBL(1)|1599, + /* 01d5a0 */ TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, + /* 01d5a8 */ TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, + /* 01d5b0 */ TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, +-/* 01d5b8 */ TBL(1)|49, TBL(1)|50, TBL(1)|1526, TBL(1)|1527, TBL(1)|1528, TBL(1)|1529, TBL(1)|1530, TBL(1)|1531, +-/* 01d5c0 */ TBL(1)|1532, TBL(1)|1533, TBL(1)|1534, TBL(1)|1535, TBL(1)|1536, TBL(1)|1537, TBL(1)|1538, TBL(1)|1539, +-/* 01d5c8 */ TBL(1)|1540, TBL(1)|1541, TBL(1)|1542, TBL(1)|1543, TBL(1)|1544, TBL(1)|1545, TBL(1)|1546, TBL(1)|1547, +-/* 01d5d0 */ TBL(1)|1548, TBL(1)|1549, TBL(1)|1550, TBL(1)|1551, TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, ++/* 01d5b8 */ TBL(1)|49, TBL(1)|50, TBL(1)|1574, TBL(1)|1575, TBL(1)|1576, TBL(1)|1577, TBL(1)|1578, TBL(1)|1579, ++/* 01d5c0 */ TBL(1)|1580, TBL(1)|1581, TBL(1)|1582, TBL(1)|1583, TBL(1)|1584, TBL(1)|1585, TBL(1)|1586, TBL(1)|1587, ++/* 01d5c8 */ TBL(1)|1588, TBL(1)|1589, TBL(1)|1590, TBL(1)|1591, TBL(1)|1592, TBL(1)|1593, TBL(1)|1594, TBL(1)|1595, ++/* 01d5d0 */ TBL(1)|1596, TBL(1)|1597, TBL(1)|1598, TBL(1)|1599, TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, + /* 01d5d8 */ TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, + /* 01d5e0 */ TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, +-/* 01d5e8 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|1526, TBL(1)|1527, +-/* 01d5f0 */ TBL(1)|1528, TBL(1)|1529, TBL(1)|1530, TBL(1)|1531, TBL(1)|1532, TBL(1)|1533, TBL(1)|1534, TBL(1)|1535, +-/* 01d5f8 */ TBL(1)|1536, TBL(1)|1537, TBL(1)|1538, TBL(1)|1539, TBL(1)|1540, TBL(1)|1541, TBL(1)|1542, TBL(1)|1543 ++/* 01d5e8 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|1574, TBL(1)|1575, ++/* 01d5f0 */ TBL(1)|1576, TBL(1)|1577, TBL(1)|1578, TBL(1)|1579, TBL(1)|1580, TBL(1)|1581, TBL(1)|1582, TBL(1)|1583, ++/* 01d5f8 */ TBL(1)|1584, TBL(1)|1585, TBL(1)|1586, TBL(1)|1587, TBL(1)|1588, TBL(1)|1589, TBL(1)|1590, TBL(1)|1591 + }; + + static const uint16_t UNWIF_compat_01_d6 [256] = { +-/* 01d600 */ TBL(1)|1544, TBL(1)|1545, TBL(1)|1546, TBL(1)|1547, TBL(1)|1548, TBL(1)|1549, TBL(1)|1550, TBL(1)|1551, ++/* 01d600 */ TBL(1)|1592, TBL(1)|1593, TBL(1)|1594, TBL(1)|1595, TBL(1)|1596, TBL(1)|1597, TBL(1)|1598, TBL(1)|1599, + /* 01d608 */ TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, + /* 01d610 */ TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, + /* 01d618 */ TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, +-/* 01d620 */ TBL(1)|49, TBL(1)|50, TBL(1)|1526, TBL(1)|1527, TBL(1)|1528, TBL(1)|1529, TBL(1)|1530, TBL(1)|1531, +-/* 01d628 */ TBL(1)|1532, TBL(1)|1533, TBL(1)|1534, TBL(1)|1535, TBL(1)|1536, TBL(1)|1537, TBL(1)|1538, TBL(1)|1539, +-/* 01d630 */ TBL(1)|1540, TBL(1)|1541, TBL(1)|1542, TBL(1)|1543, TBL(1)|1544, TBL(1)|1545, TBL(1)|1546, TBL(1)|1547, +-/* 01d638 */ TBL(1)|1548, TBL(1)|1549, TBL(1)|1550, TBL(1)|1551, TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, ++/* 01d620 */ TBL(1)|49, TBL(1)|50, TBL(1)|1574, TBL(1)|1575, TBL(1)|1576, TBL(1)|1577, TBL(1)|1578, TBL(1)|1579, ++/* 01d628 */ TBL(1)|1580, TBL(1)|1581, TBL(1)|1582, TBL(1)|1583, TBL(1)|1584, TBL(1)|1585, TBL(1)|1586, TBL(1)|1587, ++/* 01d630 */ TBL(1)|1588, TBL(1)|1589, TBL(1)|1590, TBL(1)|1591, TBL(1)|1592, TBL(1)|1593, TBL(1)|1594, TBL(1)|1595, ++/* 01d638 */ TBL(1)|1596, TBL(1)|1597, TBL(1)|1598, TBL(1)|1599, TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, + /* 01d640 */ TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, + /* 01d648 */ TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, +-/* 01d650 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|1526, TBL(1)|1527, +-/* 01d658 */ TBL(1)|1528, TBL(1)|1529, TBL(1)|1530, TBL(1)|1531, TBL(1)|1532, TBL(1)|1533, TBL(1)|1534, TBL(1)|1535, +-/* 01d660 */ TBL(1)|1536, TBL(1)|1537, TBL(1)|1538, TBL(1)|1539, TBL(1)|1540, TBL(1)|1541, TBL(1)|1542, TBL(1)|1543, +-/* 01d668 */ TBL(1)|1544, TBL(1)|1545, TBL(1)|1546, TBL(1)|1547, TBL(1)|1548, TBL(1)|1549, TBL(1)|1550, TBL(1)|1551, ++/* 01d650 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|1574, TBL(1)|1575, ++/* 01d658 */ TBL(1)|1576, TBL(1)|1577, TBL(1)|1578, TBL(1)|1579, TBL(1)|1580, TBL(1)|1581, TBL(1)|1582, TBL(1)|1583, ++/* 01d660 */ TBL(1)|1584, TBL(1)|1585, TBL(1)|1586, TBL(1)|1587, TBL(1)|1588, TBL(1)|1589, TBL(1)|1590, TBL(1)|1591, ++/* 01d668 */ TBL(1)|1592, TBL(1)|1593, TBL(1)|1594, TBL(1)|1595, TBL(1)|1596, TBL(1)|1597, TBL(1)|1598, TBL(1)|1599, + /* 01d670 */ TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, + /* 01d678 */ TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, + /* 01d680 */ TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, +-/* 01d688 */ TBL(1)|49, TBL(1)|50, TBL(1)|1526, TBL(1)|1527, TBL(1)|1528, TBL(1)|1529, TBL(1)|1530, TBL(1)|1531, +-/* 01d690 */ TBL(1)|1532, TBL(1)|1533, TBL(1)|1534, TBL(1)|1535, TBL(1)|1536, TBL(1)|1537, TBL(1)|1538, TBL(1)|1539, +-/* 01d698 */ TBL(1)|1540, TBL(1)|1541, TBL(1)|1542, TBL(1)|1543, TBL(1)|1544, TBL(1)|1545, TBL(1)|1546, TBL(1)|1547, +-/* 01d6a0 */ TBL(1)|1548, TBL(1)|1549, TBL(1)|1550, TBL(1)|1551, TBL(1)|71, TBL(1)|78, 0, 0, +-/* 01d6a8 */ TBL(1)|125, TBL(1)|126, TBL(1)|127, TBL(1)|128, TBL(1)|129, TBL(1)|130, TBL(1)|131, TBL(1)|132, +-/* 01d6b0 */ TBL(1)|133, TBL(1)|134, TBL(1)|135, TBL(1)|136, TBL(1)|137, TBL(1)|138, TBL(1)|139, TBL(1)|140, +-/* 01d6b8 */ TBL(1)|141, TBL(1)|132, TBL(1)|142, TBL(1)|143, TBL(1)|144, TBL(1)|145, TBL(1)|146, TBL(1)|147, +-/* 01d6c0 */ TBL(1)|148, TBL(1)|374, TBL(1)|149, TBL(1)|150, TBL(1)|151, TBL(1)|152, TBL(1)|153, TBL(1)|154, +-/* 01d6c8 */ TBL(1)|155, TBL(1)|156, TBL(1)|157, TBL(1)|158, TBL(1)|159, TBL(1)|160, TBL(1)|161, TBL(1)|162, +-/* 01d6d0 */ TBL(1)|163, TBL(1)|164, TBL(1)|165, TBL(1)|166, TBL(1)|167, TBL(1)|168, TBL(1)|169, TBL(1)|170, +-/* 01d6d8 */ TBL(1)|171, TBL(1)|172, TBL(1)|173, TBL(1)|373, TBL(1)|153, TBL(1)|156, TBL(1)|158, TBL(1)|170, +-/* 01d6e0 */ TBL(1)|165, TBL(1)|164, TBL(1)|125, TBL(1)|126, TBL(1)|127, TBL(1)|128, TBL(1)|129, TBL(1)|130, +-/* 01d6e8 */ TBL(1)|131, TBL(1)|132, TBL(1)|133, TBL(1)|134, TBL(1)|135, TBL(1)|136, TBL(1)|137, TBL(1)|138, +-/* 01d6f0 */ TBL(1)|139, TBL(1)|140, TBL(1)|141, TBL(1)|132, TBL(1)|142, TBL(1)|143, TBL(1)|144, TBL(1)|145, +-/* 01d6f8 */ TBL(1)|146, TBL(1)|147, TBL(1)|148, TBL(1)|374, TBL(1)|149, TBL(1)|150, TBL(1)|151, TBL(1)|152 ++/* 01d688 */ TBL(1)|49, TBL(1)|50, TBL(1)|1574, TBL(1)|1575, TBL(1)|1576, TBL(1)|1577, TBL(1)|1578, TBL(1)|1579, ++/* 01d690 */ TBL(1)|1580, TBL(1)|1581, TBL(1)|1582, TBL(1)|1583, TBL(1)|1584, TBL(1)|1585, TBL(1)|1586, TBL(1)|1587, ++/* 01d698 */ TBL(1)|1588, TBL(1)|1589, TBL(1)|1590, TBL(1)|1591, TBL(1)|1592, TBL(1)|1593, TBL(1)|1594, TBL(1)|1595, ++/* 01d6a0 */ TBL(1)|1596, TBL(1)|1597, TBL(1)|1598, TBL(1)|1599, TBL(1)|73, TBL(1)|83, 0, 0, ++/* 01d6a8 */ TBL(1)|168, TBL(1)|169, TBL(1)|170, TBL(1)|171, TBL(1)|172, TBL(1)|173, TBL(1)|174, TBL(1)|175, ++/* 01d6b0 */ TBL(1)|176, TBL(1)|177, TBL(1)|178, TBL(1)|179, TBL(1)|180, TBL(1)|181, TBL(1)|182, TBL(1)|183, ++/* 01d6b8 */ TBL(1)|184, TBL(1)|175, TBL(1)|185, TBL(1)|186, TBL(1)|187, TBL(1)|188, TBL(1)|189, TBL(1)|190, ++/* 01d6c0 */ TBL(1)|191, TBL(1)|418, TBL(1)|192, TBL(1)|193, TBL(1)|194, TBL(1)|195, TBL(1)|196, TBL(1)|197, ++/* 01d6c8 */ TBL(1)|198, TBL(1)|199, TBL(1)|200, TBL(1)|201, TBL(1)|202, TBL(1)|203, TBL(1)|204, TBL(1)|205, ++/* 01d6d0 */ TBL(1)|206, TBL(1)|207, TBL(1)|208, TBL(1)|209, TBL(1)|210, TBL(1)|211, TBL(1)|212, TBL(1)|213, ++/* 01d6d8 */ TBL(1)|214, TBL(1)|215, TBL(1)|216, TBL(1)|417, TBL(1)|196, TBL(1)|199, TBL(1)|201, TBL(1)|213, ++/* 01d6e0 */ TBL(1)|208, TBL(1)|207, TBL(1)|168, TBL(1)|169, TBL(1)|170, TBL(1)|171, TBL(1)|172, TBL(1)|173, ++/* 01d6e8 */ TBL(1)|174, TBL(1)|175, TBL(1)|176, TBL(1)|177, TBL(1)|178, TBL(1)|179, TBL(1)|180, TBL(1)|181, ++/* 01d6f0 */ TBL(1)|182, TBL(1)|183, TBL(1)|184, TBL(1)|175, TBL(1)|185, TBL(1)|186, TBL(1)|187, TBL(1)|188, ++/* 01d6f8 */ TBL(1)|189, TBL(1)|190, TBL(1)|191, TBL(1)|418, TBL(1)|192, TBL(1)|193, TBL(1)|194, TBL(1)|195 + }; + + static const uint16_t UNWIF_compat_01_d7 [256] = { +-/* 01d700 */ TBL(1)|153, TBL(1)|154, TBL(1)|155, TBL(1)|156, TBL(1)|157, TBL(1)|158, TBL(1)|159, TBL(1)|160, +-/* 01d708 */ TBL(1)|161, TBL(1)|162, TBL(1)|163, TBL(1)|164, TBL(1)|165, TBL(1)|166, TBL(1)|167, TBL(1)|168, +-/* 01d710 */ TBL(1)|169, TBL(1)|170, TBL(1)|171, TBL(1)|172, TBL(1)|173, TBL(1)|373, TBL(1)|153, TBL(1)|156, +-/* 01d718 */ TBL(1)|158, TBL(1)|170, TBL(1)|165, TBL(1)|164, TBL(1)|125, TBL(1)|126, TBL(1)|127, TBL(1)|128, +-/* 01d720 */ TBL(1)|129, TBL(1)|130, TBL(1)|131, TBL(1)|132, TBL(1)|133, TBL(1)|134, TBL(1)|135, TBL(1)|136, +-/* 01d728 */ TBL(1)|137, TBL(1)|138, TBL(1)|139, TBL(1)|140, TBL(1)|141, TBL(1)|132, TBL(1)|142, TBL(1)|143, +-/* 01d730 */ TBL(1)|144, TBL(1)|145, TBL(1)|146, TBL(1)|147, TBL(1)|148, TBL(1)|374, TBL(1)|149, TBL(1)|150, +-/* 01d738 */ TBL(1)|151, TBL(1)|152, TBL(1)|153, TBL(1)|154, TBL(1)|155, TBL(1)|156, TBL(1)|157, TBL(1)|158, +-/* 01d740 */ TBL(1)|159, TBL(1)|160, TBL(1)|161, TBL(1)|162, TBL(1)|163, TBL(1)|164, TBL(1)|165, TBL(1)|166, +-/* 01d748 */ TBL(1)|167, TBL(1)|168, TBL(1)|169, TBL(1)|170, TBL(1)|171, TBL(1)|172, TBL(1)|173, TBL(1)|373, +-/* 01d750 */ TBL(1)|153, TBL(1)|156, TBL(1)|158, TBL(1)|170, TBL(1)|165, TBL(1)|164, TBL(1)|125, TBL(1)|126, +-/* 01d758 */ TBL(1)|127, TBL(1)|128, TBL(1)|129, TBL(1)|130, TBL(1)|131, TBL(1)|132, TBL(1)|133, TBL(1)|134, +-/* 01d760 */ TBL(1)|135, TBL(1)|136, TBL(1)|137, TBL(1)|138, TBL(1)|139, TBL(1)|140, TBL(1)|141, TBL(1)|132, +-/* 01d768 */ TBL(1)|142, TBL(1)|143, TBL(1)|144, TBL(1)|145, TBL(1)|146, TBL(1)|147, TBL(1)|148, TBL(1)|374, +-/* 01d770 */ TBL(1)|149, TBL(1)|150, TBL(1)|151, TBL(1)|152, TBL(1)|153, TBL(1)|154, TBL(1)|155, TBL(1)|156, +-/* 01d778 */ TBL(1)|157, TBL(1)|158, TBL(1)|159, TBL(1)|160, TBL(1)|161, TBL(1)|162, TBL(1)|163, TBL(1)|164, +-/* 01d780 */ TBL(1)|165, TBL(1)|166, TBL(1)|167, TBL(1)|168, TBL(1)|169, TBL(1)|170, TBL(1)|171, TBL(1)|172, +-/* 01d788 */ TBL(1)|173, TBL(1)|373, TBL(1)|153, TBL(1)|156, TBL(1)|158, TBL(1)|170, TBL(1)|165, TBL(1)|164, +-/* 01d790 */ TBL(1)|125, TBL(1)|126, TBL(1)|127, TBL(1)|128, TBL(1)|129, TBL(1)|130, TBL(1)|131, TBL(1)|132, +-/* 01d798 */ TBL(1)|133, TBL(1)|134, TBL(1)|135, TBL(1)|136, TBL(1)|137, TBL(1)|138, TBL(1)|139, TBL(1)|140, +-/* 01d7a0 */ TBL(1)|141, TBL(1)|132, TBL(1)|142, TBL(1)|143, TBL(1)|144, TBL(1)|145, TBL(1)|146, TBL(1)|147, +-/* 01d7a8 */ TBL(1)|148, TBL(1)|374, TBL(1)|149, TBL(1)|150, TBL(1)|151, TBL(1)|152, TBL(1)|153, TBL(1)|154, +-/* 01d7b0 */ TBL(1)|155, TBL(1)|156, TBL(1)|157, TBL(1)|158, TBL(1)|159, TBL(1)|160, TBL(1)|161, TBL(1)|162, +-/* 01d7b8 */ TBL(1)|163, TBL(1)|164, TBL(1)|165, TBL(1)|166, TBL(1)|167, TBL(1)|168, TBL(1)|169, TBL(1)|170, +-/* 01d7c0 */ TBL(1)|171, TBL(1)|172, TBL(1)|173, TBL(1)|373, TBL(1)|153, TBL(1)|156, TBL(1)|158, TBL(1)|170, +-/* 01d7c8 */ TBL(1)|165, TBL(1)|164, TBL(1)|174, TBL(1)|175, 0, 0, TBL(1)|8, TBL(1)|9, ++/* 01d700 */ TBL(1)|196, TBL(1)|197, TBL(1)|198, TBL(1)|199, TBL(1)|200, TBL(1)|201, TBL(1)|202, TBL(1)|203, ++/* 01d708 */ TBL(1)|204, TBL(1)|205, TBL(1)|206, TBL(1)|207, TBL(1)|208, TBL(1)|209, TBL(1)|210, TBL(1)|211, ++/* 01d710 */ TBL(1)|212, TBL(1)|213, TBL(1)|214, TBL(1)|215, TBL(1)|216, TBL(1)|417, TBL(1)|196, TBL(1)|199, ++/* 01d718 */ TBL(1)|201, TBL(1)|213, TBL(1)|208, TBL(1)|207, TBL(1)|168, TBL(1)|169, TBL(1)|170, TBL(1)|171, ++/* 01d720 */ TBL(1)|172, TBL(1)|173, TBL(1)|174, TBL(1)|175, TBL(1)|176, TBL(1)|177, TBL(1)|178, TBL(1)|179, ++/* 01d728 */ TBL(1)|180, TBL(1)|181, TBL(1)|182, TBL(1)|183, TBL(1)|184, TBL(1)|175, TBL(1)|185, TBL(1)|186, ++/* 01d730 */ TBL(1)|187, TBL(1)|188, TBL(1)|189, TBL(1)|190, TBL(1)|191, TBL(1)|418, TBL(1)|192, TBL(1)|193, ++/* 01d738 */ TBL(1)|194, TBL(1)|195, TBL(1)|196, TBL(1)|197, TBL(1)|198, TBL(1)|199, TBL(1)|200, TBL(1)|201, ++/* 01d740 */ TBL(1)|202, TBL(1)|203, TBL(1)|204, TBL(1)|205, TBL(1)|206, TBL(1)|207, TBL(1)|208, TBL(1)|209, ++/* 01d748 */ TBL(1)|210, TBL(1)|211, TBL(1)|212, TBL(1)|213, TBL(1)|214, TBL(1)|215, TBL(1)|216, TBL(1)|417, ++/* 01d750 */ TBL(1)|196, TBL(1)|199, TBL(1)|201, TBL(1)|213, TBL(1)|208, TBL(1)|207, TBL(1)|168, TBL(1)|169, ++/* 01d758 */ TBL(1)|170, TBL(1)|171, TBL(1)|172, TBL(1)|173, TBL(1)|174, TBL(1)|175, TBL(1)|176, TBL(1)|177, ++/* 01d760 */ TBL(1)|178, TBL(1)|179, TBL(1)|180, TBL(1)|181, TBL(1)|182, TBL(1)|183, TBL(1)|184, TBL(1)|175, ++/* 01d768 */ TBL(1)|185, TBL(1)|186, TBL(1)|187, TBL(1)|188, TBL(1)|189, TBL(1)|190, TBL(1)|191, TBL(1)|418, ++/* 01d770 */ TBL(1)|192, TBL(1)|193, TBL(1)|194, TBL(1)|195, TBL(1)|196, TBL(1)|197, TBL(1)|198, TBL(1)|199, ++/* 01d778 */ TBL(1)|200, TBL(1)|201, TBL(1)|202, TBL(1)|203, TBL(1)|204, TBL(1)|205, TBL(1)|206, TBL(1)|207, ++/* 01d780 */ TBL(1)|208, TBL(1)|209, TBL(1)|210, TBL(1)|211, TBL(1)|212, TBL(1)|213, TBL(1)|214, TBL(1)|215, ++/* 01d788 */ TBL(1)|216, TBL(1)|417, TBL(1)|196, TBL(1)|199, TBL(1)|201, TBL(1)|213, TBL(1)|208, TBL(1)|207, ++/* 01d790 */ TBL(1)|168, TBL(1)|169, TBL(1)|170, TBL(1)|171, TBL(1)|172, TBL(1)|173, TBL(1)|174, TBL(1)|175, ++/* 01d798 */ TBL(1)|176, TBL(1)|177, TBL(1)|178, TBL(1)|179, TBL(1)|180, TBL(1)|181, TBL(1)|182, TBL(1)|183, ++/* 01d7a0 */ TBL(1)|184, TBL(1)|175, TBL(1)|185, TBL(1)|186, TBL(1)|187, TBL(1)|188, TBL(1)|189, TBL(1)|190, ++/* 01d7a8 */ TBL(1)|191, TBL(1)|418, TBL(1)|192, TBL(1)|193, TBL(1)|194, TBL(1)|195, TBL(1)|196, TBL(1)|197, ++/* 01d7b0 */ TBL(1)|198, TBL(1)|199, TBL(1)|200, TBL(1)|201, TBL(1)|202, TBL(1)|203, TBL(1)|204, TBL(1)|205, ++/* 01d7b8 */ TBL(1)|206, TBL(1)|207, TBL(1)|208, TBL(1)|209, TBL(1)|210, TBL(1)|211, TBL(1)|212, TBL(1)|213, ++/* 01d7c0 */ TBL(1)|214, TBL(1)|215, TBL(1)|216, TBL(1)|417, TBL(1)|196, TBL(1)|199, TBL(1)|201, TBL(1)|213, ++/* 01d7c8 */ TBL(1)|208, TBL(1)|207, TBL(1)|217, TBL(1)|218, 0, 0, TBL(1)|8, TBL(1)|9, + /* 01d7d0 */ TBL(1)|10, TBL(1)|11, TBL(1)|12, TBL(1)|13, TBL(1)|14, TBL(1)|15, TBL(1)|16, TBL(1)|17, + /* 01d7d8 */ TBL(1)|8, TBL(1)|9, TBL(1)|10, TBL(1)|11, TBL(1)|12, TBL(1)|13, TBL(1)|14, TBL(1)|15, + /* 01d7e0 */ TBL(1)|16, TBL(1)|17, TBL(1)|8, TBL(1)|9, TBL(1)|10, TBL(1)|11, TBL(1)|12, TBL(1)|13, +@@ -2419,30 +2461,30 @@ static const uint16_t UNWIF_compat_01_d7 [256] = { + }; + + static const uint16_t UNWIF_compat_01_ee [256] = { +-/* 01ee00 */ TBL(1)|191, TBL(1)|192, TBL(1)|196, TBL(1)|199, 0, TBL(1)|218, TBL(1)|202, TBL(1)|197, +-/* 01ee08 */ TBL(1)|207, TBL(1)|220, TBL(1)|213, TBL(1)|214, TBL(1)|215, TBL(1)|216, TBL(1)|203, TBL(1)|209, +-/* 01ee10 */ TBL(1)|211, TBL(1)|205, TBL(1)|212, TBL(1)|201, TBL(1)|204, TBL(1)|194, TBL(1)|195, TBL(1)|198, +-/* 01ee18 */ TBL(1)|200, TBL(1)|206, TBL(1)|208, TBL(1)|210, TBL(1)|221, TBL(1)|248, TBL(1)|240, TBL(1)|222, +-/* 01ee20 */ 0, TBL(1)|192, TBL(1)|196, 0, TBL(1)|217, 0, 0, TBL(1)|197, +-/* 01ee28 */ 0, TBL(1)|220, TBL(1)|213, TBL(1)|214, TBL(1)|215, TBL(1)|216, TBL(1)|203, TBL(1)|209, +-/* 01ee30 */ TBL(1)|211, TBL(1)|205, TBL(1)|212, 0, TBL(1)|204, TBL(1)|194, TBL(1)|195, TBL(1)|198, +-/* 01ee38 */ 0, TBL(1)|206, 0, TBL(1)|210, 0, 0, 0, 0, +-/* 01ee40 */ 0, 0, TBL(1)|196, 0, 0, 0, 0, TBL(1)|197, +-/* 01ee48 */ 0, TBL(1)|220, 0, TBL(1)|214, 0, TBL(1)|216, TBL(1)|203, TBL(1)|209, +-/* 01ee50 */ 0, TBL(1)|205, TBL(1)|212, 0, TBL(1)|204, 0, 0, TBL(1)|198, +-/* 01ee58 */ 0, TBL(1)|206, 0, TBL(1)|210, 0, TBL(1)|248, 0, TBL(1)|222, +-/* 01ee60 */ 0, TBL(1)|192, TBL(1)|196, 0, TBL(1)|217, 0, 0, TBL(1)|197, +-/* 01ee68 */ TBL(1)|207, TBL(1)|220, TBL(1)|213, 0, TBL(1)|215, TBL(1)|216, TBL(1)|203, TBL(1)|209, +-/* 01ee70 */ TBL(1)|211, TBL(1)|205, TBL(1)|212, 0, TBL(1)|204, TBL(1)|194, TBL(1)|195, TBL(1)|198, +-/* 01ee78 */ 0, TBL(1)|206, TBL(1)|208, TBL(1)|210, TBL(1)|221, 0, TBL(1)|240, 0, +-/* 01ee80 */ TBL(1)|191, TBL(1)|192, TBL(1)|196, TBL(1)|199, TBL(1)|217, TBL(1)|218, TBL(1)|202, TBL(1)|197, +-/* 01ee88 */ TBL(1)|207, TBL(1)|220, 0, TBL(1)|214, TBL(1)|215, TBL(1)|216, TBL(1)|203, TBL(1)|209, +-/* 01ee90 */ TBL(1)|211, TBL(1)|205, TBL(1)|212, TBL(1)|201, TBL(1)|204, TBL(1)|194, TBL(1)|195, TBL(1)|198, +-/* 01ee98 */ TBL(1)|200, TBL(1)|206, TBL(1)|208, TBL(1)|210, 0, 0, 0, 0, +-/* 01eea0 */ 0, TBL(1)|192, TBL(1)|196, TBL(1)|199, 0, TBL(1)|218, TBL(1)|202, TBL(1)|197, +-/* 01eea8 */ TBL(1)|207, TBL(1)|220, 0, TBL(1)|214, TBL(1)|215, TBL(1)|216, TBL(1)|203, TBL(1)|209, +-/* 01eeb0 */ TBL(1)|211, TBL(1)|205, TBL(1)|212, TBL(1)|201, TBL(1)|204, TBL(1)|194, TBL(1)|195, TBL(1)|198, +-/* 01eeb8 */ TBL(1)|200, TBL(1)|206, TBL(1)|208, TBL(1)|210, 0, 0, 0, 0, ++/* 01ee00 */ TBL(1)|234, TBL(1)|235, TBL(1)|239, TBL(1)|242, 0, TBL(1)|261, TBL(1)|245, TBL(1)|240, ++/* 01ee08 */ TBL(1)|250, TBL(1)|263, TBL(1)|256, TBL(1)|257, TBL(1)|258, TBL(1)|259, TBL(1)|246, TBL(1)|252, ++/* 01ee10 */ TBL(1)|254, TBL(1)|248, TBL(1)|255, TBL(1)|244, TBL(1)|247, TBL(1)|237, TBL(1)|238, TBL(1)|241, ++/* 01ee18 */ TBL(1)|243, TBL(1)|249, TBL(1)|251, TBL(1)|253, TBL(1)|264, TBL(1)|291, TBL(1)|283, TBL(1)|265, ++/* 01ee20 */ 0, TBL(1)|235, TBL(1)|239, 0, TBL(1)|260, 0, 0, TBL(1)|240, ++/* 01ee28 */ 0, TBL(1)|263, TBL(1)|256, TBL(1)|257, TBL(1)|258, TBL(1)|259, TBL(1)|246, TBL(1)|252, ++/* 01ee30 */ TBL(1)|254, TBL(1)|248, TBL(1)|255, 0, TBL(1)|247, TBL(1)|237, TBL(1)|238, TBL(1)|241, ++/* 01ee38 */ 0, TBL(1)|249, 0, TBL(1)|253, 0, 0, 0, 0, ++/* 01ee40 */ 0, 0, TBL(1)|239, 0, 0, 0, 0, TBL(1)|240, ++/* 01ee48 */ 0, TBL(1)|263, 0, TBL(1)|257, 0, TBL(1)|259, TBL(1)|246, TBL(1)|252, ++/* 01ee50 */ 0, TBL(1)|248, TBL(1)|255, 0, TBL(1)|247, 0, 0, TBL(1)|241, ++/* 01ee58 */ 0, TBL(1)|249, 0, TBL(1)|253, 0, TBL(1)|291, 0, TBL(1)|265, ++/* 01ee60 */ 0, TBL(1)|235, TBL(1)|239, 0, TBL(1)|260, 0, 0, TBL(1)|240, ++/* 01ee68 */ TBL(1)|250, TBL(1)|263, TBL(1)|256, 0, TBL(1)|258, TBL(1)|259, TBL(1)|246, TBL(1)|252, ++/* 01ee70 */ TBL(1)|254, TBL(1)|248, TBL(1)|255, 0, TBL(1)|247, TBL(1)|237, TBL(1)|238, TBL(1)|241, ++/* 01ee78 */ 0, TBL(1)|249, TBL(1)|251, TBL(1)|253, TBL(1)|264, 0, TBL(1)|283, 0, ++/* 01ee80 */ TBL(1)|234, TBL(1)|235, TBL(1)|239, TBL(1)|242, TBL(1)|260, TBL(1)|261, TBL(1)|245, TBL(1)|240, ++/* 01ee88 */ TBL(1)|250, TBL(1)|263, 0, TBL(1)|257, TBL(1)|258, TBL(1)|259, TBL(1)|246, TBL(1)|252, ++/* 01ee90 */ TBL(1)|254, TBL(1)|248, TBL(1)|255, TBL(1)|244, TBL(1)|247, TBL(1)|237, TBL(1)|238, TBL(1)|241, ++/* 01ee98 */ TBL(1)|243, TBL(1)|249, TBL(1)|251, TBL(1)|253, 0, 0, 0, 0, ++/* 01eea0 */ 0, TBL(1)|235, TBL(1)|239, TBL(1)|242, 0, TBL(1)|261, TBL(1)|245, TBL(1)|240, ++/* 01eea8 */ TBL(1)|250, TBL(1)|263, 0, TBL(1)|257, TBL(1)|258, TBL(1)|259, TBL(1)|246, TBL(1)|252, ++/* 01eeb0 */ TBL(1)|254, TBL(1)|248, TBL(1)|255, TBL(1)|244, TBL(1)|247, TBL(1)|237, TBL(1)|238, TBL(1)|241, ++/* 01eeb8 */ TBL(1)|243, TBL(1)|249, TBL(1)|251, TBL(1)|253, 0, 0, 0, 0, + /* 01eec0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 01eec8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 01eed0 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -2489,17 +2531,17 @@ static const uint16_t UNWIF_compat_01_f1 [256] = { + }; + + static const uint16_t UNWIF_compat_01_f2 [256] = { +-/* 01f200 */ TBL(2)|876, TBL(2)|888, TBL(1)|417, 0, 0, 0, 0, 0, ++/* 01f200 */ TBL(2)|876, TBL(2)|888, TBL(1)|462, 0, 0, 0, 0, 0, + /* 01f208 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 01f210 */ TBL(1)|868, TBL(1)|754, TBL(1)|661, TBL(2)|898, TBL(1)|551, TBL(1)|732, TBL(1)|1324, TBL(1)|736, +-/* 01f218 */ TBL(1)|554, TBL(1)|918, TBL(1)|1036, TBL(1)|908, TBL(1)|618, TBL(1)|827, TBL(1)|592, TBL(1)|910, +-/* 01f220 */ TBL(1)|613, TBL(1)|1190, TBL(1)|1089, TBL(1)|1347, TBL(1)|725, TBL(1)|675, TBL(1)|1017, TBL(1)|871, +-/* 01f228 */ TBL(1)|882, TBL(1)|528, TBL(1)|531, TBL(1)|1379, TBL(1)|791, TBL(1)|538, TBL(1)|668, TBL(1)|879, +-/* 01f230 */ TBL(1)|1357, TBL(1)|869, TBL(1)|1148, TBL(1)|1163, TBL(1)|670, TBL(1)|1009, TBL(1)|931, TBL(1)|930, +-/* 01f238 */ TBL(1)|1094, TBL(1)|619, TBL(1)|694, TBL(1)|1393, 0, 0, 0, 0, ++/* 01f210 */ TBL(1)|913, TBL(1)|799, TBL(1)|706, TBL(2)|898, TBL(1)|596, TBL(1)|777, TBL(1)|1369, TBL(1)|781, ++/* 01f218 */ TBL(1)|599, TBL(1)|963, TBL(1)|1081, TBL(1)|953, TBL(1)|663, TBL(1)|872, TBL(1)|637, TBL(1)|955, ++/* 01f220 */ TBL(1)|658, TBL(1)|1235, TBL(1)|1134, TBL(1)|1392, TBL(1)|770, TBL(1)|720, TBL(1)|1062, TBL(1)|916, ++/* 01f228 */ TBL(1)|927, TBL(1)|573, TBL(1)|576, TBL(1)|1424, TBL(1)|836, TBL(1)|583, TBL(1)|713, TBL(1)|924, ++/* 01f230 */ TBL(1)|1402, TBL(1)|914, TBL(1)|1193, TBL(1)|1208, TBL(1)|715, TBL(1)|1054, TBL(1)|976, TBL(1)|975, ++/* 01f238 */ TBL(1)|1139, TBL(1)|664, TBL(1)|739, TBL(1)|1438, 0, 0, 0, 0, + /* 01f240 */ TBL(3)|511, TBL(3)|505, TBL(3)|506, TBL(3)|508, TBL(3)|512, TBL(3)|509, TBL(3)|513, TBL(3)|507, + /* 01f248 */ TBL(3)|510, 0, 0, 0, 0, 0, 0, 0, +-/* 01f250 */ TBL(1)|828, TBL(1)|666, 0, 0, 0, 0, 0, 0, ++/* 01f250 */ TBL(1)|873, TBL(1)|711, 0, 0, 0, 0, 0, 0, + /* 01f258 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 01f260 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 01f268 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -2559,80 +2601,80 @@ static const uint16_t UNWIF_compat_01_fb [256] = { + }; + + static const uint16_t UNWIF_compat_02_f8 [256] = { +-/* 02f800 */ TBL(1)|543, TBL(1)|541, TBL(1)|545, TBL(2)|926, TBL(1)|562, TBL(1)|566, TBL(1)|567, TBL(1)|569, +-/* 02f808 */ TBL(1)|571, TBL(1)|572, TBL(1)|575, TBL(1)|573, TBL(1)|461, TBL(2)|930, TBL(1)|580, TBL(1)|581, +-/* 02f810 */ TBL(1)|582, TBL(1)|589, TBL(2)|927, TBL(1)|462, TBL(1)|584, TBL(1)|592, TBL(2)|929, TBL(1)|596, +-/* 02f818 */ TBL(1)|598, TBL(1)|558, TBL(1)|600, TBL(1)|601, TBL(2)|1024, TBL(1)|608, TBL(1)|610, TBL(1)|464, +-/* 02f820 */ TBL(1)|616, TBL(1)|617, TBL(1)|619, TBL(1)|620, TBL(1)|465, TBL(1)|626, TBL(1)|627, TBL(1)|630, +-/* 02f828 */ TBL(1)|633, TBL(1)|634, TBL(1)|635, TBL(1)|637, TBL(1)|645, TBL(1)|646, TBL(1)|648, TBL(1)|652, +-/* 02f830 */ TBL(1)|654, TBL(1)|655, TBL(1)|655, TBL(1)|655, TBL(2)|933, TBL(1)|1029, TBL(1)|660, TBL(1)|662, +-/* 02f838 */ TBL(2)|934, TBL(1)|665, TBL(1)|667, TBL(1)|669, TBL(1)|679, TBL(1)|674, TBL(1)|677, TBL(1)|678, +-/* 02f840 */ TBL(1)|680, TBL(1)|682, TBL(1)|683, TBL(1)|685, TBL(1)|687, TBL(1)|688, TBL(1)|688, TBL(1)|690, +-/* 02f848 */ TBL(1)|692, TBL(1)|693, TBL(1)|696, TBL(1)|705, TBL(1)|698, TBL(1)|706, TBL(1)|699, TBL(1)|701, +-/* 02f850 */ TBL(1)|611, TBL(1)|724, TBL(1)|710, TBL(1)|711, TBL(1)|712, TBL(1)|709, TBL(1)|714, TBL(1)|713, +-/* 02f858 */ TBL(1)|719, TBL(2)|935, TBL(1)|726, TBL(1)|727, TBL(1)|729, TBL(1)|732, TBL(1)|734, TBL(1)|741, +-/* 02f860 */ TBL(2)|936, TBL(2)|937, TBL(1)|744, TBL(1)|745, TBL(1)|746, TBL(1)|743, TBL(1)|748, TBL(1)|466, +-/* 02f868 */ TBL(1)|467, TBL(1)|750, TBL(1)|752, TBL(1)|752, TBL(2)|938, TBL(1)|759, TBL(1)|760, TBL(1)|761, +-/* 02f870 */ TBL(1)|763, TBL(2)|939, TBL(1)|765, TBL(1)|766, TBL(1)|820, TBL(1)|768, TBL(1)|468, TBL(1)|771, +-/* 02f878 */ TBL(1)|775, TBL(1)|778, TBL(1)|777, TBL(2)|941, TBL(1)|780, TBL(2)|942, TBL(1)|783, TBL(1)|782, +-/* 02f880 */ TBL(1)|784, TBL(1)|788, TBL(1)|789, TBL(1)|469, TBL(1)|793, TBL(1)|795, TBL(1)|796, TBL(1)|797, +-/* 02f888 */ TBL(1)|470, TBL(2)|943, TBL(1)|471, TBL(1)|804, TBL(1)|805, TBL(1)|806, TBL(1)|808, TBL(2)|1034, +-/* 02f890 */ TBL(1)|814, TBL(2)|945, TBL(2)|945, TBL(1)|1238, TBL(1)|818, TBL(1)|818, TBL(1)|472, TBL(2)|952, +-/* 02f898 */ TBL(2)|994, TBL(1)|822, TBL(1)|824, TBL(1)|473, TBL(1)|829, TBL(1)|833, TBL(1)|834, TBL(1)|836, +-/* 02f8a0 */ TBL(1)|840, TBL(1)|475, TBL(1)|474, TBL(1)|841, TBL(2)|946, TBL(1)|842, TBL(1)|847, TBL(1)|848, +-/* 02f8a8 */ TBL(1)|849, TBL(1)|848, TBL(1)|852, TBL(1)|853, TBL(1)|857, TBL(1)|855, TBL(1)|856, TBL(1)|858, +-/* 02f8b0 */ TBL(1)|859, TBL(1)|860, TBL(1)|863, TBL(1)|864, TBL(1)|870, TBL(1)|872, TBL(1)|876, TBL(1)|881, +-/* 02f8b8 */ TBL(2)|949, TBL(1)|880, TBL(1)|877, TBL(1)|883, TBL(1)|885, TBL(1)|890, TBL(2)|950, TBL(1)|892, +-/* 02f8c0 */ TBL(1)|889, TBL(1)|887, TBL(1)|476, TBL(1)|894, TBL(1)|896, TBL(1)|898, TBL(1)|895, TBL(1)|477, +-/* 02f8c8 */ TBL(1)|902, TBL(1)|904, TBL(2)|951, TBL(1)|915, TBL(1)|928, TBL(1)|919, TBL(1)|480, TBL(1)|922, +-/* 02f8d0 */ TBL(1)|479, TBL(1)|478, TBL(1)|593, TBL(1)|594, TBL(1)|929, TBL(1)|923, TBL(1)|1227, TBL(1)|505, +-/* 02f8d8 */ TBL(1)|932, TBL(1)|933, TBL(1)|934, TBL(1)|939, TBL(1)|937, TBL(2)|956, TBL(1)|481, TBL(1)|944, +-/* 02f8e0 */ TBL(1)|941, TBL(1)|948, TBL(1)|950, TBL(2)|958, TBL(1)|951, TBL(1)|946, TBL(1)|953, TBL(1)|482, +-/* 02f8e8 */ TBL(1)|954, TBL(1)|955, TBL(1)|956, TBL(1)|959, TBL(2)|959, TBL(1)|961, TBL(1)|483, TBL(1)|964, +-/* 02f8f0 */ TBL(2)|960, TBL(1)|965, TBL(1)|484, TBL(1)|968, TBL(1)|971, TBL(1)|974, TBL(1)|975, TBL(2)|961, +-/* 02f8f8 */ TBL(2)|940, TBL(2)|962, TBL(1)|983, TBL(2)|963, TBL(1)|986, TBL(1)|988, TBL(1)|984, TBL(1)|991 ++/* 02f800 */ TBL(1)|588, TBL(1)|586, TBL(1)|590, TBL(2)|932, TBL(1)|607, TBL(1)|611, TBL(1)|612, TBL(1)|614, ++/* 02f808 */ TBL(1)|616, TBL(1)|617, TBL(1)|620, TBL(1)|618, TBL(1)|506, TBL(2)|936, TBL(1)|625, TBL(1)|626, ++/* 02f810 */ TBL(1)|627, TBL(1)|634, TBL(2)|933, TBL(1)|507, TBL(1)|629, TBL(1)|637, TBL(2)|935, TBL(1)|641, ++/* 02f818 */ TBL(1)|643, TBL(1)|603, TBL(1)|645, TBL(1)|646, TBL(2)|1030, TBL(1)|653, TBL(1)|655, TBL(1)|509, ++/* 02f820 */ TBL(1)|661, TBL(1)|662, TBL(1)|664, TBL(1)|665, TBL(1)|510, TBL(1)|671, TBL(1)|672, TBL(1)|675, ++/* 02f828 */ TBL(1)|678, TBL(1)|679, TBL(1)|680, TBL(1)|682, TBL(1)|690, TBL(1)|691, TBL(1)|693, TBL(1)|697, ++/* 02f830 */ TBL(1)|699, TBL(1)|700, TBL(1)|700, TBL(1)|700, TBL(2)|939, TBL(1)|1074, TBL(1)|705, TBL(1)|707, ++/* 02f838 */ TBL(2)|940, TBL(1)|710, TBL(1)|712, TBL(1)|714, TBL(1)|724, TBL(1)|719, TBL(1)|722, TBL(1)|723, ++/* 02f840 */ TBL(1)|725, TBL(1)|727, TBL(1)|728, TBL(1)|730, TBL(1)|732, TBL(1)|733, TBL(1)|733, TBL(1)|735, ++/* 02f848 */ TBL(1)|737, TBL(1)|738, TBL(1)|741, TBL(1)|750, TBL(1)|743, TBL(1)|751, TBL(1)|744, TBL(1)|746, ++/* 02f850 */ TBL(1)|656, TBL(1)|769, TBL(1)|755, TBL(1)|756, TBL(1)|757, TBL(1)|754, TBL(1)|759, TBL(1)|758, ++/* 02f858 */ TBL(1)|764, TBL(2)|941, TBL(1)|771, TBL(1)|772, TBL(1)|774, TBL(1)|777, TBL(1)|779, TBL(1)|786, ++/* 02f860 */ TBL(2)|942, TBL(2)|943, TBL(1)|789, TBL(1)|790, TBL(1)|791, TBL(1)|788, TBL(1)|793, TBL(1)|511, ++/* 02f868 */ TBL(1)|512, TBL(1)|795, TBL(1)|797, TBL(1)|797, TBL(2)|944, TBL(1)|804, TBL(1)|805, TBL(1)|806, ++/* 02f870 */ TBL(1)|808, TBL(2)|945, TBL(1)|810, TBL(1)|811, TBL(1)|865, TBL(1)|813, TBL(1)|513, TBL(1)|816, ++/* 02f878 */ TBL(1)|820, TBL(1)|823, TBL(1)|822, TBL(2)|947, TBL(1)|825, TBL(2)|948, TBL(1)|828, TBL(1)|827, ++/* 02f880 */ TBL(1)|829, TBL(1)|833, TBL(1)|834, TBL(1)|514, TBL(1)|838, TBL(1)|840, TBL(1)|841, TBL(1)|842, ++/* 02f888 */ TBL(1)|515, TBL(2)|949, TBL(1)|516, TBL(1)|849, TBL(1)|850, TBL(1)|851, TBL(1)|853, TBL(2)|1040, ++/* 02f890 */ TBL(1)|859, TBL(2)|951, TBL(2)|951, TBL(1)|1283, TBL(1)|863, TBL(1)|863, TBL(1)|517, TBL(2)|958, ++/* 02f898 */ TBL(2)|1000, TBL(1)|867, TBL(1)|869, TBL(1)|518, TBL(1)|874, TBL(1)|878, TBL(1)|879, TBL(1)|881, ++/* 02f8a0 */ TBL(1)|885, TBL(1)|520, TBL(1)|519, TBL(1)|886, TBL(2)|952, TBL(1)|887, TBL(1)|892, TBL(1)|893, ++/* 02f8a8 */ TBL(1)|894, TBL(1)|893, TBL(1)|897, TBL(1)|898, TBL(1)|902, TBL(1)|900, TBL(1)|901, TBL(1)|903, ++/* 02f8b0 */ TBL(1)|904, TBL(1)|905, TBL(1)|908, TBL(1)|909, TBL(1)|915, TBL(1)|917, TBL(1)|921, TBL(1)|926, ++/* 02f8b8 */ TBL(2)|955, TBL(1)|925, TBL(1)|922, TBL(1)|928, TBL(1)|930, TBL(1)|935, TBL(2)|956, TBL(1)|937, ++/* 02f8c0 */ TBL(1)|934, TBL(1)|932, TBL(1)|521, TBL(1)|939, TBL(1)|941, TBL(1)|943, TBL(1)|940, TBL(1)|522, ++/* 02f8c8 */ TBL(1)|947, TBL(1)|949, TBL(2)|957, TBL(1)|960, TBL(1)|973, TBL(1)|964, TBL(1)|525, TBL(1)|967, ++/* 02f8d0 */ TBL(1)|524, TBL(1)|523, TBL(1)|638, TBL(1)|639, TBL(1)|974, TBL(1)|968, TBL(1)|1272, TBL(1)|550, ++/* 02f8d8 */ TBL(1)|977, TBL(1)|978, TBL(1)|979, TBL(1)|984, TBL(1)|982, TBL(2)|962, TBL(1)|526, TBL(1)|989, ++/* 02f8e0 */ TBL(1)|986, TBL(1)|993, TBL(1)|995, TBL(2)|964, TBL(1)|996, TBL(1)|991, TBL(1)|998, TBL(1)|527, ++/* 02f8e8 */ TBL(1)|999, TBL(1)|1000, TBL(1)|1001, TBL(1)|1004, TBL(2)|965, TBL(1)|1006, TBL(1)|528, TBL(1)|1009, ++/* 02f8f0 */ TBL(2)|966, TBL(1)|1010, TBL(1)|529, TBL(1)|1013, TBL(1)|1016, TBL(1)|1019, TBL(1)|1020, TBL(2)|967, ++/* 02f8f8 */ TBL(2)|946, TBL(2)|968, TBL(1)|1028, TBL(2)|969, TBL(1)|1031, TBL(1)|1033, TBL(1)|1029, TBL(1)|1036 + }; + + static const uint16_t UNWIF_compat_02_f9 [256] = { +-/* 02f900 */ TBL(1)|995, TBL(1)|999, TBL(1)|996, TBL(1)|997, TBL(1)|1000, TBL(1)|1001, TBL(2)|964, TBL(1)|994, +-/* 02f908 */ TBL(1)|1007, TBL(1)|1008, TBL(1)|485, TBL(1)|1013, TBL(1)|1012, TBL(2)|965, TBL(1)|1005, TBL(1)|1020, +-/* 02f910 */ TBL(2)|966, TBL(2)|967, TBL(1)|1021, TBL(1)|1026, TBL(1)|1025, TBL(1)|1024, TBL(1)|486, TBL(1)|1027, +-/* 02f918 */ TBL(1)|1031, TBL(1)|1030, TBL(1)|1033, TBL(2)|928, TBL(1)|1037, TBL(2)|968, TBL(1)|1040, TBL(2)|970, +-/* 02f920 */ TBL(1)|1045, TBL(1)|1048, TBL(1)|1053, TBL(2)|971, TBL(1)|1058, TBL(1)|1059, TBL(2)|972, TBL(2)|973, +-/* 02f928 */ TBL(1)|1066, TBL(1)|1070, TBL(1)|487, TBL(1)|1071, TBL(1)|488, TBL(1)|488, TBL(1)|1077, TBL(1)|1078, +-/* 02f930 */ TBL(1)|1080, TBL(1)|1081, TBL(1)|1084, TBL(1)|489, TBL(1)|1090, TBL(2)|974, TBL(1)|1097, TBL(2)|975, +-/* 02f938 */ TBL(1)|1100, TBL(2)|944, TBL(1)|1104, TBL(2)|976, TBL(2)|977, TBL(2)|978, TBL(1)|490, TBL(1)|491, +-/* 02f940 */ TBL(1)|1118, TBL(2)|980, TBL(2)|979, TBL(2)|981, TBL(2)|982, TBL(1)|1120, TBL(1)|1121, TBL(1)|1121, +-/* 02f948 */ TBL(1)|1123, TBL(1)|493, TBL(1)|1124, TBL(1)|494, TBL(1)|495, TBL(2)|984, TBL(1)|1129, TBL(1)|1131, +-/* 02f950 */ TBL(1)|1134, TBL(1)|496, TBL(2)|985, TBL(1)|1143, TBL(2)|986, TBL(2)|987, TBL(1)|1151, TBL(1)|1157, +-/* 02f958 */ TBL(1)|497, TBL(1)|1159, TBL(1)|1160, TBL(1)|1161, TBL(2)|988, TBL(2)|989, TBL(2)|989, TBL(1)|1167, +-/* 02f960 */ TBL(1)|498, TBL(2)|990, TBL(1)|1172, TBL(1)|1173, TBL(1)|499, TBL(2)|991, TBL(1)|1180, TBL(1)|500, +-/* 02f968 */ TBL(1)|1184, TBL(1)|1182, TBL(1)|1186, TBL(2)|993, TBL(1)|1192, TBL(1)|501, TBL(1)|1195, TBL(1)|1197, +-/* 02f970 */ TBL(1)|1201, TBL(1)|502, TBL(2)|995, TBL(2)|996, TBL(1)|503, TBL(2)|997, TBL(1)|1207, TBL(2)|998, +-/* 02f978 */ TBL(1)|1210, TBL(1)|1213, TBL(1)|1215, TBL(2)|999, TBL(2)|1000, TBL(1)|1220, TBL(2)|1001, TBL(1)|1222, +-/* 02f980 */ TBL(2)|953, TBL(1)|504, TBL(1)|1228, TBL(1)|1229, TBL(1)|506, TBL(1)|1230, TBL(1)|749, TBL(2)|1002, +-/* 02f988 */ TBL(2)|1003, TBL(2)|954, TBL(2)|955, TBL(1)|1238, TBL(1)|1239, TBL(1)|1373, TBL(1)|507, TBL(1)|1250, +-/* 02f990 */ TBL(1)|1249, TBL(1)|1251, TBL(1)|624, TBL(1)|1252, TBL(1)|1253, TBL(1)|1254, TBL(1)|1256, TBL(2)|1004, +-/* 02f998 */ TBL(1)|1255, TBL(1)|1257, TBL(1)|1262, TBL(1)|1263, TBL(1)|1258, TBL(1)|1264, TBL(1)|1269, TBL(1)|1274, +-/* 02f9a0 */ TBL(1)|1261, TBL(1)|1266, TBL(1)|1267, TBL(1)|1268, TBL(2)|1005, TBL(2)|1007, TBL(2)|1006, TBL(1)|508, +-/* 02f9a8 */ TBL(1)|1276, TBL(1)|1277, TBL(1)|1279, TBL(2)|1011, TBL(1)|1280, TBL(2)|1008, TBL(1)|509, TBL(1)|510, +-/* 02f9b0 */ TBL(2)|1009, TBL(2)|1010, TBL(1)|511, TBL(1)|1288, TBL(1)|1289, TBL(1)|1290, TBL(1)|1291, TBL(1)|1294, +-/* 02f9b8 */ TBL(1)|1293, TBL(1)|1296, TBL(1)|1295, TBL(1)|1299, TBL(1)|1297, TBL(1)|1298, TBL(1)|1300, TBL(1)|512, +-/* 02f9c0 */ TBL(1)|1302, TBL(1)|1303, TBL(1)|513, TBL(1)|1307, TBL(1)|1308, TBL(2)|1012, TBL(1)|1311, TBL(1)|1312, +-/* 02f9c8 */ TBL(1)|514, TBL(1)|1315, TBL(1)|463, TBL(2)|1013, TBL(2)|1014, TBL(1)|515, TBL(1)|516, TBL(1)|1326, +-/* 02f9d0 */ TBL(1)|1332, TBL(1)|1339, TBL(1)|1343, TBL(2)|1015, TBL(1)|1348, TBL(1)|1349, TBL(1)|1355, TBL(1)|1358, +-/* 02f9d8 */ TBL(2)|1017, TBL(2)|931, TBL(1)|1361, TBL(1)|1360, TBL(1)|1363, TBL(2)|932, TBL(1)|1366, TBL(1)|1369, +-/* 02f9e0 */ TBL(2)|1018, TBL(2)|1019, TBL(1)|1385, TBL(1)|1388, TBL(1)|1390, TBL(2)|1020, TBL(1)|1391, TBL(1)|1402, +-/* 02f9e8 */ TBL(1)|1405, TBL(1)|1406, TBL(1)|1404, TBL(1)|1409, TBL(1)|1410, TBL(2)|1021, TBL(1)|1413, TBL(1)|517, +-/* 02f9f0 */ TBL(1)|1415, TBL(2)|1022, TBL(1)|518, TBL(1)|1429, TBL(1)|785, TBL(1)|1435, TBL(2)|1023, TBL(2)|1025, +-/* 02f9f8 */ TBL(1)|519, TBL(1)|520, TBL(1)|1445, TBL(2)|1026, TBL(1)|521, TBL(2)|1027, TBL(1)|1451, TBL(1)|1451 ++/* 02f900 */ TBL(1)|1040, TBL(1)|1044, TBL(1)|1041, TBL(1)|1042, TBL(1)|1045, TBL(1)|1046, TBL(2)|970, TBL(1)|1039, ++/* 02f908 */ TBL(1)|1052, TBL(1)|1053, TBL(1)|530, TBL(1)|1058, TBL(1)|1057, TBL(2)|971, TBL(1)|1050, TBL(1)|1065, ++/* 02f910 */ TBL(2)|972, TBL(2)|973, TBL(1)|1066, TBL(1)|1071, TBL(1)|1070, TBL(1)|1069, TBL(1)|531, TBL(1)|1072, ++/* 02f918 */ TBL(1)|1076, TBL(1)|1075, TBL(1)|1078, TBL(2)|934, TBL(1)|1082, TBL(2)|974, TBL(1)|1085, TBL(2)|976, ++/* 02f920 */ TBL(1)|1090, TBL(1)|1093, TBL(1)|1098, TBL(2)|977, TBL(1)|1103, TBL(1)|1104, TBL(2)|978, TBL(2)|979, ++/* 02f928 */ TBL(1)|1111, TBL(1)|1115, TBL(1)|532, TBL(1)|1116, TBL(1)|533, TBL(1)|533, TBL(1)|1122, TBL(1)|1123, ++/* 02f930 */ TBL(1)|1125, TBL(1)|1126, TBL(1)|1129, TBL(1)|534, TBL(1)|1135, TBL(2)|980, TBL(1)|1142, TBL(2)|981, ++/* 02f938 */ TBL(1)|1145, TBL(2)|950, TBL(1)|1149, TBL(2)|982, TBL(2)|983, TBL(2)|984, TBL(1)|535, TBL(1)|536, ++/* 02f940 */ TBL(1)|1163, TBL(2)|986, TBL(2)|985, TBL(2)|987, TBL(2)|988, TBL(1)|1165, TBL(1)|1166, TBL(1)|1166, ++/* 02f948 */ TBL(1)|1168, TBL(1)|538, TBL(1)|1169, TBL(1)|539, TBL(1)|540, TBL(2)|990, TBL(1)|1174, TBL(1)|1176, ++/* 02f950 */ TBL(1)|1179, TBL(1)|541, TBL(2)|991, TBL(1)|1188, TBL(2)|992, TBL(2)|993, TBL(1)|1196, TBL(1)|1202, ++/* 02f958 */ TBL(1)|542, TBL(1)|1204, TBL(1)|1205, TBL(1)|1206, TBL(2)|994, TBL(2)|995, TBL(2)|995, TBL(1)|1212, ++/* 02f960 */ TBL(1)|543, TBL(2)|996, TBL(1)|1217, TBL(1)|1218, TBL(1)|544, TBL(2)|997, TBL(1)|1225, TBL(1)|545, ++/* 02f968 */ TBL(1)|1229, TBL(1)|1227, TBL(1)|1231, TBL(2)|999, TBL(1)|1237, TBL(1)|546, TBL(1)|1240, TBL(1)|1242, ++/* 02f970 */ TBL(1)|1246, TBL(1)|547, TBL(2)|1001, TBL(2)|1002, TBL(1)|548, TBL(2)|1003, TBL(1)|1252, TBL(2)|1004, ++/* 02f978 */ TBL(1)|1255, TBL(1)|1258, TBL(1)|1260, TBL(2)|1005, TBL(2)|1006, TBL(1)|1265, TBL(2)|1007, TBL(1)|1267, ++/* 02f980 */ TBL(2)|959, TBL(1)|549, TBL(1)|1273, TBL(1)|1274, TBL(1)|551, TBL(1)|1275, TBL(1)|794, TBL(2)|1008, ++/* 02f988 */ TBL(2)|1009, TBL(2)|960, TBL(2)|961, TBL(1)|1283, TBL(1)|1284, TBL(1)|1418, TBL(1)|552, TBL(1)|1295, ++/* 02f990 */ TBL(1)|1294, TBL(1)|1296, TBL(1)|669, TBL(1)|1297, TBL(1)|1298, TBL(1)|1299, TBL(1)|1301, TBL(2)|1010, ++/* 02f998 */ TBL(1)|1300, TBL(1)|1302, TBL(1)|1307, TBL(1)|1308, TBL(1)|1303, TBL(1)|1309, TBL(1)|1314, TBL(1)|1319, ++/* 02f9a0 */ TBL(1)|1306, TBL(1)|1311, TBL(1)|1312, TBL(1)|1313, TBL(2)|1011, TBL(2)|1013, TBL(2)|1012, TBL(1)|553, ++/* 02f9a8 */ TBL(1)|1321, TBL(1)|1322, TBL(1)|1324, TBL(2)|1017, TBL(1)|1325, TBL(2)|1014, TBL(1)|554, TBL(1)|555, ++/* 02f9b0 */ TBL(2)|1015, TBL(2)|1016, TBL(1)|556, TBL(1)|1333, TBL(1)|1334, TBL(1)|1335, TBL(1)|1336, TBL(1)|1339, ++/* 02f9b8 */ TBL(1)|1338, TBL(1)|1341, TBL(1)|1340, TBL(1)|1344, TBL(1)|1342, TBL(1)|1343, TBL(1)|1345, TBL(1)|557, ++/* 02f9c0 */ TBL(1)|1347, TBL(1)|1348, TBL(1)|558, TBL(1)|1352, TBL(1)|1353, TBL(2)|1018, TBL(1)|1356, TBL(1)|1357, ++/* 02f9c8 */ TBL(1)|559, TBL(1)|1360, TBL(1)|508, TBL(2)|1019, TBL(2)|1020, TBL(1)|560, TBL(1)|561, TBL(1)|1371, ++/* 02f9d0 */ TBL(1)|1377, TBL(1)|1384, TBL(1)|1388, TBL(2)|1021, TBL(1)|1393, TBL(1)|1394, TBL(1)|1400, TBL(1)|1403, ++/* 02f9d8 */ TBL(2)|1023, TBL(2)|937, TBL(1)|1406, TBL(1)|1405, TBL(1)|1408, TBL(2)|938, TBL(1)|1411, TBL(1)|1414, ++/* 02f9e0 */ TBL(2)|1024, TBL(2)|1025, TBL(1)|1430, TBL(1)|1433, TBL(1)|1435, TBL(2)|1026, TBL(1)|1436, TBL(1)|1447, ++/* 02f9e8 */ TBL(1)|1450, TBL(1)|1451, TBL(1)|1449, TBL(1)|1454, TBL(1)|1455, TBL(2)|1027, TBL(1)|1458, TBL(1)|562, ++/* 02f9f0 */ TBL(1)|1460, TBL(2)|1028, TBL(1)|563, TBL(1)|1474, TBL(1)|830, TBL(1)|1480, TBL(2)|1029, TBL(2)|1031, ++/* 02f9f8 */ TBL(1)|564, TBL(1)|565, TBL(1)|1490, TBL(2)|1032, TBL(1)|566, TBL(2)|1033, TBL(1)|1496, TBL(1)|1496 + }; + + static const uint16_t UNWIF_compat_02_fa [256] = { +-/* 02fa00 */ TBL(1)|1453, TBL(2)|1028, TBL(1)|1459, TBL(1)|522, TBL(1)|1463, TBL(1)|1466, TBL(1)|1468, TBL(1)|1470, +-/* 02fa08 */ TBL(1)|523, TBL(2)|1029, TBL(1)|1475, TBL(1)|1482, TBL(1)|1485, TBL(1)|524, TBL(1)|525, TBL(1)|1486, +-/* 02fa10 */ TBL(2)|1030, TBL(1)|526, TBL(2)|1031, TBL(2)|1032, TBL(2)|1033, TBL(1)|1495, TBL(1)|527, TBL(1)|1500, +-/* 02fa18 */ TBL(1)|1502, TBL(1)|1503, TBL(1)|1505, TBL(1)|1507, TBL(1)|1509, TBL(2)|1035, 0, 0, ++/* 02fa00 */ TBL(1)|1498, TBL(2)|1034, TBL(1)|1504, TBL(1)|567, TBL(1)|1508, TBL(1)|1511, TBL(1)|1513, TBL(1)|1515, ++/* 02fa08 */ TBL(1)|568, TBL(2)|1035, TBL(1)|1520, TBL(1)|1527, TBL(1)|1530, TBL(1)|569, TBL(1)|570, TBL(1)|1531, ++/* 02fa10 */ TBL(2)|1036, TBL(1)|571, TBL(2)|1037, TBL(2)|1038, TBL(2)|1039, TBL(1)|1540, TBL(1)|572, TBL(1)|1545, ++/* 02fa18 */ TBL(1)|1547, TBL(1)|1548, TBL(1)|1550, TBL(1)|1552, TBL(1)|1554, TBL(2)|1041, 0, 0, + /* 02fa20 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 02fa28 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 02fa30 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -2738,7 +2780,7 @@ UNWIF_compat_00_ff + }; + + static const uint16_t* UNWIF_compat_01 [256] = { +-NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, ++NULL,NULL,NULL,NULL,NULL,NULL,NULL,UNWIF_compat_01_07, + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + UNWIF_compat_01_10, + UNWIF_compat_01_11, +diff --git a/src/extwchar/unw16ifexc.h b/src/extwchar/unw16ifexc.h +index c85d9c8a..c756a2ab 100644 +--- a/src/extwchar/unw16ifexc.h ++++ b/src/extwchar/unw16ifexc.h +@@ -3,7 +3,7 @@ + * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! + * This file is auto-generated by Unicode-Normalize 1.27 + * mkheader -uni -ind -std +- * for Unicode 13.0.0 UTF-16 ++ * for Unicode 14.0.0 UTF-16 + * Any changes here will be lost! + */ + /* Composite exclusions */ +diff --git a/src/extwchar/unwifcan.h b/src/extwchar/unwifcan.h +index 035c261c..198b618d 100644 +--- a/src/extwchar/unwifcan.h ++++ b/src/extwchar/unwifcan.h +@@ -2,7 +2,7 @@ + * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! + * This file is auto-generated by Unicode-Normalize 1.27 + * mkheader -uni -ind -std +- * for Unicode 13.0.0 UTF-32 ++ * for Unicode 14.0.0 UTF-32 + * Any changes here will be lost! + */ + /* Canonical Decomposition */ +diff --git a/src/extwchar/unwifcmb.h b/src/extwchar/unwifcmb.h +index 40684c3f..9795f23f 100644 +--- a/src/extwchar/unwifcmb.h ++++ b/src/extwchar/unwifcmb.h +@@ -2,7 +2,7 @@ + * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! + * This file is auto-generated by Unicode-Normalize 1.27 + * mkheader -uni -ind -std +- * for Unicode 13.0.0 UTF-32 ++ * for Unicode 14.0.0 UTF-32 + * Any changes here will be lost! + */ + /* CombiningClass */ +@@ -202,14 +202,14 @@ static const uint8_t UNWIF_combin_00_08 [256] = { + /* 0880 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0888 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0890 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 0898 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 0898 */ 230, 220, 220, 220, 230, 230, 230, 230, + /* 08a0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 08a8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 08b0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 08b8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 08c0 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 08c8 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 08d0 */ 0, 0, 0, 220, 230, 230, 230, 230, ++/* 08c8 */ 0, 0, 230, 230, 230, 230, 230, 220, ++/* 08d0 */ 220, 220, 220, 220, 230, 230, 230, 230, + /* 08d8 */ 230, 230, 230, 230, 230, 230, 230, 230, + /* 08e0 */ 230, 230, 0, 220, 230, 230, 220, 230, + /* 08e8 */ 230, 220, 230, 230, 230, 220, 220, 220, +@@ -330,7 +330,7 @@ static const uint8_t UNWIF_combin_00_0c [256] = { + /* 0c20 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0c28 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0c30 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 0c38 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 0c38 */ 0, 0, 0, 0, 7, 0, 0, 0, + /* 0c40 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0c48 */ 0, 0, 0, 0, 0, 9, 0, 0, + /* 0c50 */ 0, 0, 0, 0, 0, 84, 91, 0, +@@ -535,7 +535,7 @@ static const uint8_t UNWIF_combin_00_13 [256] = { + static const uint8_t UNWIF_combin_00_17 [256] = { + /* 1700 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1708 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 1710 */ 0, 0, 0, 0, 9, 0, 0, 0, ++/* 1710 */ 0, 0, 0, 0, 9, 9, 0, 0, + /* 1718 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1720 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1728 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -662,8 +662,8 @@ static const uint8_t UNWIF_combin_00_1a [256] = { + /* 1aa8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1ab0 */ 230, 230, 230, 230, 230, 220, 220, 220, + /* 1ab8 */ 220, 220, 220, 230, 230, 220, 0, 220, +-/* 1ac0 */ 220, 0, 0, 0, 0, 0, 0, 0, +-/* 1ac8 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 1ac0 */ 220, 230, 230, 220, 220, 230, 230, 230, ++/* 1ac8 */ 230, 230, 220, 230, 230, 230, 230, 0, + /* 1ad0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1ad8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1ae0 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -774,7 +774,7 @@ static const uint8_t UNWIF_combin_00_1d [256] = { + /* 1de0 */ 230, 230, 230, 230, 230, 230, 230, 230, + /* 1de8 */ 230, 230, 230, 230, 230, 230, 230, 230, + /* 1df0 */ 230, 230, 230, 230, 230, 230, 232, 228, +-/* 1df8 */ 228, 220, 0, 230, 233, 220, 230, 220 ++/* 1df8 */ 228, 220, 218, 230, 233, 220, 230, 220 + }; + + static const uint8_t UNWIF_combin_00_20 [256] = { +@@ -1389,7 +1389,7 @@ static const uint8_t UNWIF_combin_01_0f [256] = { + /* 010f68 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 010f70 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 010f78 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 010f80 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010f80 */ 0, 0, 230, 220, 230, 220, 0, 0, + /* 010f88 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 010f90 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 010f98 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1422,7 +1422,7 @@ static const uint8_t UNWIF_combin_01_10 [256] = { + /* 011058 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 011060 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 011068 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 011070 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 011070 */ 9, 0, 0, 0, 0, 0, 0, 0, + /* 011078 */ 0, 0, 0, 0, 0, 0, 0, 9, + /* 011080 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 011088 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -2164,7 +2164,7 @@ static const uint8_t UNWIF_combin_01_e2 [256] = { + /* 01e290 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 01e298 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 01e2a0 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 01e2a8 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 01e2a8 */ 0, 0, 0, 0, 0, 0, 230, 0, + /* 01e2b0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 01e2b8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 01e2c0 */ 0, 0, 0, 0, 0, 0, 0, 0, +diff --git a/src/extwchar/unwifcmp.h b/src/extwchar/unwifcmp.h +index e0d4ca84..bd372f3e 100644 +--- a/src/extwchar/unwifcmp.h ++++ b/src/extwchar/unwifcmp.h +@@ -2,7 +2,7 @@ + * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! + * This file is auto-generated by Unicode-Normalize 1.27 + * mkheader -uni -ind -std +- * for Unicode 13.0.0 UTF-32 ++ * for Unicode 14.0.0 UTF-32 + * Any changes here will be lost! + */ + /* Composition */ +diff --git a/src/extwchar/unwifcpt.h b/src/extwchar/unwifcpt.h +index 477617ec..e3649308 100644 +--- a/src/extwchar/unwifcpt.h ++++ b/src/extwchar/unwifcpt.h +@@ -2,7 +2,7 @@ + * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! + * This file is auto-generated by Unicode-Normalize 1.27 + * mkheader -uni -ind -std +- * for Unicode 13.0.0 UTF-32 ++ * for Unicode 14.0.0 UTF-32 + * Any changes here will be lost! + */ + /* Compat. Decomposition */ +@@ -12,9 +12,9 @@ + + #undef NORMALIZE_IND_TBL + #define NORMALIZE_IND_TBL +-/* tbl sizes: (1666,1193,638,109,16,14,1,1,,,,,,,,,,1) */ ++/* tbl sizes: (1720,1193,638,109,16,14,1,1,,,,,,,,,,1) */ + /* l: 1-18 */ +-/* max size: 1666 0x682 */ ++/* max size: 1720 0x6b8 */ + #define UNWIF_compat_MAXLEN 5 + #define TBL(i) ((i-1) << 11) + /* value = (const wchar_t*)&UNWIF_compat_tbl[LEN-1][IDX] */ +@@ -23,7 +23,7 @@ + #define UNWIF_compat_PLANE_T uint16_t + + /* the values */ +-static const wchar_t UNWIF_compat_tbl_1 [1666][1] = { ++static const wchar_t UNWIF_compat_tbl_1 [1720][1] = { + /* 0 */ {L'('}, {L')'}, {L'*'}, {L'+'}, {L','}, {L'-'}, {L'.'}, {L'/'}, + /* 8 */ {L'0'}, {L'1'}, {L'2'}, {L'3'}, {L'4'}, {L'5'}, {L'6'}, {L'7'}, + /* 16 */ {L'8'}, {L'9'}, {L':'}, {L';'}, {L'<'}, {L'='}, {L'>'}, {L'?'}, +@@ -32,207 +32,213 @@ static const wchar_t UNWIF_compat_tbl_1 [1666][1] = { + /* 40 */ {L'P'}, {L'Q'}, {L'R'}, {L'S'}, {L'T'}, {L'U'}, {L'V'}, {L'W'}, + /* 48 */ {L'X'}, {L'Y'}, {L'Z'}, {L'['}, {L'\x0020'}, {L'\x0021'}, {L'\x0022'}, {L'\x0023'}, + /* 56 */ {L'\x0024'}, {L'\x0025'}, {L'\x0026'}, {L'\x0027'}, {L'\x005c'}, {L'\x00a2'}, {L'\x00a3'}, {L'\x00a5'}, +- /* 64 */ {L'\x00a6'}, {L'\x00ac'}, {L'\x00b7'}, {L'\x00c6'}, {L'\x00f0'}, {L'\x0126'}, {L'\x0127'}, {L'\x0131'}, +- /* 72 */ {L'\x014b'}, {L'\x0153'}, {L'\x018e'}, {L'\x0190'}, {L'\x01ab'}, {L'\x0222'}, {L'\x0237'}, {L'\x0250'}, +- /* 80 */ {L'\x0251'}, {L'\x0252'}, {L'\x0254'}, {L'\x0255'}, {L'\x0259'}, {L'\x025b'}, {L'\x025c'}, {L'\x025f'}, +- /* 88 */ {L'\x0261'}, {L'\x0263'}, {L'\x0265'}, {L'\x0266'}, {L'\x0268'}, {L'\x0269'}, {L'\x026a'}, {L'\x026b'}, +- /* 96 */ {L'\x026d'}, {L'\x026f'}, {L'\x0270'}, {L'\x0271'}, {L'\x0272'}, {L'\x0273'}, {L'\x0274'}, {L'\x0275'}, +- /* 104 */ {L'\x0278'}, {L'\x0279'}, {L'\x027b'}, {L'\x0281'}, {L'\x0282'}, {L'\x0283'}, {L'\x0289'}, {L'\x028a'}, +- /* 112 */ {L'\x028b'}, {L'\x028c'}, {L'\x028d'}, {L'\x0290'}, {L'\x0291'}, {L'\x0292'}, {L'\x0295'}, {L'\x029d'}, +- /* 120 */ {L'\x029f'}, {L'\x02b9'}, {L'\x0300'}, {L'\x0301'}, {L'\x0313'}, {L'\x0391'}, {L'\x0392'}, {L'\x0393'}, +- /* 128 */ {L'\x0394'}, {L'\x0395'}, {L'\x0396'}, {L'\x0397'}, {L'\x0398'}, {L'\x0399'}, {L'\x039a'}, {L'\x039b'}, +- /* 136 */ {L'\x039c'}, {L'\x039d'}, {L'\x039e'}, {L'\x039f'}, {L'\x03a0'}, {L'\x03a1'}, {L'\x03a3'}, {L'\x03a4'}, +- /* 144 */ {L'\x03a5'}, {L'\x03a6'}, {L'\x03a7'}, {L'\x03a8'}, {L'\x03a9'}, {L'\x03b1'}, {L'\x03b2'}, {L'\x03b3'}, +- /* 152 */ {L'\x03b4'}, {L'\x03b5'}, {L'\x03b6'}, {L'\x03b7'}, {L'\x03b8'}, {L'\x03b9'}, {L'\x03ba'}, {L'\x03bb'}, +- /* 160 */ {L'\x03bc'}, {L'\x03bd'}, {L'\x03be'}, {L'\x03bf'}, {L'\x03c0'}, {L'\x03c1'}, {L'\x03c2'}, {L'\x03c3'}, +- /* 168 */ {L'\x03c4'}, {L'\x03c5'}, {L'\x03c6'}, {L'\x03c7'}, {L'\x03c8'}, {L'\x03c9'}, {L'\x03dc'}, {L'\x03dd'}, +- /* 176 */ {L'\x043d'}, {L'\x044a'}, {L'\x044c'}, {L'\x05d0'}, {L'\x05d1'}, {L'\x05d2'}, {L'\x05d3'}, {L'\x05d4'}, +- /* 184 */ {L'\x05db'}, {L'\x05dc'}, {L'\x05dd'}, {L'\x05e2'}, {L'\x05e8'}, {L'\x05ea'}, {L'\x0621'}, {L'\x0627'}, +- /* 192 */ {L'\x0628'}, {L'\x0629'}, {L'\x062a'}, {L'\x062b'}, {L'\x062c'}, {L'\x062d'}, {L'\x062e'}, {L'\x062f'}, +- /* 200 */ {L'\x0630'}, {L'\x0631'}, {L'\x0632'}, {L'\x0633'}, {L'\x0634'}, {L'\x0635'}, {L'\x0636'}, {L'\x0637'}, +- /* 208 */ {L'\x0638'}, {L'\x0639'}, {L'\x063a'}, {L'\x0641'}, {L'\x0642'}, {L'\x0643'}, {L'\x0644'}, {L'\x0645'}, +- /* 216 */ {L'\x0646'}, {L'\x0647'}, {L'\x0648'}, {L'\x0649'}, {L'\x064a'}, {L'\x066e'}, {L'\x066f'}, {L'\x0671'}, +- /* 224 */ {L'\x0679'}, {L'\x067a'}, {L'\x067b'}, {L'\x067e'}, {L'\x067f'}, {L'\x0680'}, {L'\x0683'}, {L'\x0684'}, +- /* 232 */ {L'\x0686'}, {L'\x0687'}, {L'\x0688'}, {L'\x068c'}, {L'\x068d'}, {L'\x068e'}, {L'\x0691'}, {L'\x0698'}, +- /* 240 */ {L'\x06a1'}, {L'\x06a4'}, {L'\x06a6'}, {L'\x06a9'}, {L'\x06ad'}, {L'\x06af'}, {L'\x06b1'}, {L'\x06b3'}, +- /* 248 */ {L'\x06ba'}, {L'\x06bb'}, {L'\x06be'}, {L'\x06c1'}, {L'\x06c5'}, {L'\x06c6'}, {L'\x06c7'}, {L'\x06c8'}, +- /* 256 */ {L'\x06c9'}, {L'\x06cb'}, {L'\x06cc'}, {L'\x06d0'}, {L'\x06d2'}, {L'\x0f0b'}, {L'\x10dc'}, {L'\x1100'}, +- /* 264 */ {L'\x1101'}, {L'\x1102'}, {L'\x1103'}, {L'\x1104'}, {L'\x1105'}, {L'\x1106'}, {L'\x1107'}, {L'\x1108'}, +- /* 272 */ {L'\x1109'}, {L'\x110a'}, {L'\x110b'}, {L'\x110c'}, {L'\x110d'}, {L'\x110e'}, {L'\x110f'}, {L'\x1110'}, +- /* 280 */ {L'\x1111'}, {L'\x1112'}, {L'\x1114'}, {L'\x1115'}, {L'\x111a'}, {L'\x111c'}, {L'\x111d'}, {L'\x111e'}, +- /* 288 */ {L'\x1120'}, {L'\x1121'}, {L'\x1122'}, {L'\x1123'}, {L'\x1127'}, {L'\x1129'}, {L'\x112b'}, {L'\x112c'}, +- /* 296 */ {L'\x112d'}, {L'\x112e'}, {L'\x112f'}, {L'\x1132'}, {L'\x1136'}, {L'\x1140'}, {L'\x1147'}, {L'\x114c'}, +- /* 304 */ {L'\x1157'}, {L'\x1158'}, {L'\x1159'}, {L'\x1160'}, {L'\x1161'}, {L'\x1162'}, {L'\x1163'}, {L'\x1164'}, +- /* 312 */ {L'\x1165'}, {L'\x1166'}, {L'\x1167'}, {L'\x1168'}, {L'\x1169'}, {L'\x116a'}, {L'\x116b'}, {L'\x116c'}, +- /* 320 */ {L'\x116d'}, {L'\x116e'}, {L'\x116f'}, {L'\x1170'}, {L'\x1171'}, {L'\x1172'}, {L'\x1173'}, {L'\x1174'}, +- /* 328 */ {L'\x1175'}, {L'\x1184'}, {L'\x1185'}, {L'\x1188'}, {L'\x1191'}, {L'\x1192'}, {L'\x1194'}, {L'\x119e'}, +- /* 336 */ {L'\x11a1'}, {L'\x11aa'}, {L'\x11ac'}, {L'\x11ad'}, {L'\x11b0'}, {L'\x11b1'}, {L'\x11b2'}, {L'\x11b3'}, +- /* 344 */ {L'\x11b4'}, {L'\x11b5'}, {L'\x11c7'}, {L'\x11c8'}, {L'\x11cc'}, {L'\x11ce'}, {L'\x11d3'}, {L'\x11d7'}, +- /* 352 */ {L'\x11d9'}, {L'\x11dd'}, {L'\x11df'}, {L'\x11f1'}, {L'\x11f2'}, {L'\x1d02'}, {L'\x1d16'}, {L'\x1d17'}, +- /* 360 */ {L'\x1d1c'}, {L'\x1d1d'}, {L'\x1d25'}, {L'\x1d7b'}, {L'\x1d85'}, {L'\x2010'}, {L'\x20122'}, {L'\x2013'}, +- /* 368 */ {L'\x2014'}, {L'\x2051c'}, {L'\x20525'}, {L'\x2054b'}, {L'\x2063a'}, {L'\x20804'}, {L'\x208de'}, {L'\x20a2c'}, +- /* 376 */ {L'\x20a9'}, {L'\x20b63'}, {L'\x214e4'}, {L'\x216a8'}, {L'\x216ea'}, {L'\x2190'}, {L'\x2191'}, {L'\x2192'}, +- /* 384 */ {L'\x2193'}, {L'\x219c8'}, {L'\x21b18'}, {L'\x21d0b'}, {L'\x21de4'}, {L'\x21de6'}, {L'\x2202'}, {L'\x2207'}, +- /* 392 */ {L'\x2211'}, {L'\x2212'}, {L'\x22183'}, {L'\x2219f'}, {L'\x22331'}, {L'\x226d4'}, {L'\x22844'}, {L'\x2284a'}, +- /* 400 */ {L'\x22b0c'}, {L'\x22bf1'}, {L'\x2300a'}, {L'\x232b8'}, {L'\x2335f'}, {L'\x23393'}, {L'\x2339c'}, {L'\x233c3'}, +- /* 408 */ {L'\x233d5'}, {L'\x2346d'}, {L'\x236a3'}, {L'\x238a7'}, {L'\x23a8d'}, {L'\x23afa'}, {L'\x23cbc'}, {L'\x23d1e'}, +- /* 416 */ {L'\x23ed1'}, {L'\x23f5e'}, {L'\x23f8e'}, {L'\x24263'}, {L'\x242ee'}, {L'\x243ab'}, {L'\x24608'}, {L'\x24735'}, +- /* 424 */ {L'\x24814'}, {L'\x24c36'}, {L'\x24c92'}, {L'\x24fa1'}, {L'\x24fb8'}, {L'\x2502'}, {L'\x25044'}, {L'\x250f2'}, +- /* 432 */ {L'\x250f3'}, {L'\x25119'}, {L'\x25133'}, {L'\x25249'}, {L'\x2541d'}, {L'\x25626'}, {L'\x2569a'}, {L'\x256c5'}, +- /* 440 */ {L'\x2597c'}, {L'\x25a0'}, {L'\x25aa7'}, {L'\x25bab'}, {L'\x25c80'}, {L'\x25cb'}, {L'\x25cd0'}, {L'\x25f86'}, +- /* 448 */ {L'\x261da'}, {L'\x26228'}, {L'\x26247'}, {L'\x262d9'}, {L'\x2633e'}, {L'\x264da'}, {L'\x26523'}, {L'\x265a8'}, +- /* 456 */ {L'\x267a7'}, {L'\x267b5'}, {L'\x26b3c'}, {L'\x26c36'}, {L'\x26cd5'}, {L'\x26d6b'}, {L'\x26f2c'}, {L'\x26fb1'}, +- /* 464 */ {L'\x270d2'}, {L'\x273ca'}, {L'\x27667'}, {L'\x278ae'}, {L'\x27966'}, {L'\x27ca8'}, {L'\x27ed3'}, {L'\x27f2f'}, +- /* 472 */ {L'\x285d2'}, {L'\x285ed'}, {L'\x2872e'}, {L'\x28bfa'}, {L'\x28d77'}, {L'\x29145'}, {L'\x291df'}, {L'\x2921a'}, +- /* 480 */ {L'\x2940a'}, {L'\x29496'}, {L'\x295b6'}, {L'\x2985'}, {L'\x2986'}, {L'\x29b30'}, {L'\x2a0ce'}, {L'\x2a105'}, +- /* 488 */ {L'\x2a20e'}, {L'\x2a291'}, {L'\x2a392'}, {L'\x2a600'}, {L'\x2d61'}, {L'\x3001'}, {L'\x3002'}, {L'\x3008'}, +- /* 496 */ {L'\x3009'}, {L'\x300a'}, {L'\x300b'}, {L'\x300c'}, {L'\x300d'}, {L'\x300e'}, {L'\x300f'}, {L'\x3010'}, +- /* 504 */ {L'\x3011'}, {L'\x3012'}, {L'\x3014'}, {L'\x3015'}, {L'\x3016'}, {L'\x3017'}, {L'\x3099'}, {L'\x309a'}, +- /* 512 */ {L'\x30a1'}, {L'\x30a2'}, {L'\x30a3'}, {L'\x30a4'}, {L'\x30a5'}, {L'\x30a6'}, {L'\x30a7'}, {L'\x30a8'}, +- /* 520 */ {L'\x30a9'}, {L'\x30aa'}, {L'\x30ab'}, {L'\x30ad'}, {L'\x30af'}, {L'\x30b1'}, {L'\x30b3'}, {L'\x30b5'}, +- /* 528 */ {L'\x30b7'}, {L'\x30b9'}, {L'\x30bb'}, {L'\x30bd'}, {L'\x30bf'}, {L'\x30c1'}, {L'\x30c3'}, {L'\x30c4'}, +- /* 536 */ {L'\x30c6'}, {L'\x30c8'}, {L'\x30ca'}, {L'\x30cb'}, {L'\x30cc'}, {L'\x30cd'}, {L'\x30ce'}, {L'\x30cf'}, +- /* 544 */ {L'\x30d2'}, {L'\x30d5'}, {L'\x30d8'}, {L'\x30db'}, {L'\x30de'}, {L'\x30df'}, {L'\x30e0'}, {L'\x30e1'}, +- /* 552 */ {L'\x30e2'}, {L'\x30e3'}, {L'\x30e4'}, {L'\x30e5'}, {L'\x30e6'}, {L'\x30e7'}, {L'\x30e8'}, {L'\x30e9'}, +- /* 560 */ {L'\x30ea'}, {L'\x30eb'}, {L'\x30ec'}, {L'\x30ed'}, {L'\x30ef'}, {L'\x30f0'}, {L'\x30f1'}, {L'\x30f2'}, +- /* 568 */ {L'\x30f3'}, {L'\x30fb'}, {L'\x30fc'}, {L'\x349e'}, {L'\x34b9'}, {L'\x34bb'}, {L'\x34df'}, {L'\x3515'}, +- /* 576 */ {L'\x36ee'}, {L'\x36fc'}, {L'\x3781'}, {L'\x382f'}, {L'\x3862'}, {L'\x387c'}, {L'\x38c7'}, {L'\x38e3'}, +- /* 584 */ {L'\x391c'}, {L'\x393a'}, {L'\x3a2e'}, {L'\x3a6c'}, {L'\x3ae4'}, {L'\x3b08'}, {L'\x3b19'}, {L'\x3b49'}, +- /* 592 */ {L'\x3b9d'}, {L'\x3c18'}, {L'\x3c4e'}, {L'\x3d33'}, {L'\x3d96'}, {L'\x3eac'}, {L'\x3eb8'}, {L'\x3f1b'}, +- /* 600 */ {L'\x3ffc'}, {L'\x4008'}, {L'\x4018'}, {L'\x4039'}, {L'\x4046'}, {L'\x4096'}, {L'\x40e3'}, {L'\x412f'}, +- /* 608 */ {L'\x4202'}, {L'\x4227'}, {L'\x42a0'}, {L'\x4301'}, {L'\x4334'}, {L'\x4359'}, {L'\x43d5'}, {L'\x43d9'}, +- /* 616 */ {L'\x440b'}, {L'\x446b'}, {L'\x452b'}, {L'\x455d'}, {L'\x4561'}, {L'\x456b'}, {L'\x45d7'}, {L'\x45f9'}, +- /* 624 */ {L'\x4635'}, {L'\x46be'}, {L'\x46c7'}, {L'\x4995'}, {L'\x49e6'}, {L'\x4a6e'}, {L'\x4a76'}, {L'\x4ab2'}, +- /* 632 */ {L'\x4b33'}, {L'\x4bce'}, {L'\x4cce'}, {L'\x4ced'}, {L'\x4cf8'}, {L'\x4d56'}, {L'\x4e00'}, {L'\x4e01'}, +- /* 640 */ {L'\x4e03'}, {L'\x4e09'}, {L'\x4e0a'}, {L'\x4e0b'}, {L'\x4e0d'}, {L'\x4e19'}, {L'\x4e26'}, {L'\x4e28'}, +- /* 648 */ {L'\x4e2d'}, {L'\x4e32'}, {L'\x4e36'}, {L'\x4e38'}, {L'\x4e39'}, {L'\x4e3d'}, {L'\x4e3f'}, {L'\x4e41'}, +- /* 656 */ {L'\x4e59'}, {L'\x4e5d'}, {L'\x4e82'}, {L'\x4e85'}, {L'\x4e86'}, {L'\x4e8c'}, {L'\x4e94'}, {L'\x4ea0'}, +- /* 664 */ {L'\x4ea4'}, {L'\x4eae'}, {L'\x4eba'}, {L'\x4ec0'}, {L'\x4ecc'}, {L'\x4ee4'}, {L'\x4f01'}, {L'\x4f11'}, +- /* 672 */ {L'\x4f60'}, {L'\x4f80'}, {L'\x4f86'}, {L'\x4f8b'}, {L'\x4fae'}, {L'\x4fbb'}, {L'\x4fbf'}, {L'\x5002'}, +- /* 680 */ {L'\x502b'}, {L'\x507a'}, {L'\x5099'}, {L'\x50cf'}, {L'\x50da'}, {L'\x50e7'}, {L'\x512a'}, {L'\x513f'}, +- /* 688 */ {L'\x5140'}, {L'\x5145'}, {L'\x514d'}, {L'\x5154'}, {L'\x5164'}, {L'\x5165'}, {L'\x5167'}, {L'\x5168'}, +- /* 696 */ {L'\x5169'}, {L'\x516b'}, {L'\x516d'}, {L'\x5177'}, {L'\x5180'}, {L'\x5182'}, {L'\x518d'}, {L'\x5192'}, +- /* 704 */ {L'\x5195'}, {L'\x5196'}, {L'\x5197'}, {L'\x5199'}, {L'\x51a4'}, {L'\x51ab'}, {L'\x51ac'}, {L'\x51b5'}, +- /* 712 */ {L'\x51b7'}, {L'\x51c9'}, {L'\x51cc'}, {L'\x51dc'}, {L'\x51de'}, {L'\x51e0'}, {L'\x51f5'}, {L'\x5200'}, +- /* 720 */ {L'\x5203'}, {L'\x5207'}, {L'\x5217'}, {L'\x521d'}, {L'\x5229'}, {L'\x523a'}, {L'\x523b'}, {L'\x5246'}, +- /* 728 */ {L'\x524d'}, {L'\x5272'}, {L'\x5277'}, {L'\x5289'}, {L'\x529b'}, {L'\x52a3'}, {L'\x52b3'}, {L'\x52b4'}, +- /* 736 */ {L'\x52c7'}, {L'\x52c9'}, {L'\x52d2'}, {L'\x52de'}, {L'\x52e4'}, {L'\x52f5'}, {L'\x52f9'}, {L'\x52fa'}, +- /* 744 */ {L'\x5305'}, {L'\x5306'}, {L'\x5315'}, {L'\x5317'}, {L'\x531a'}, {L'\x5338'}, {L'\x533b'}, {L'\x533f'}, +- /* 752 */ {L'\x5341'}, {L'\x5344'}, {L'\x5345'}, {L'\x5349'}, {L'\x5351'}, {L'\x5354'}, {L'\x535a'}, {L'\x535c'}, +- /* 760 */ {L'\x5369'}, {L'\x5370'}, {L'\x5373'}, {L'\x5375'}, {L'\x537d'}, {L'\x537f'}, {L'\x5382'}, {L'\x53b6'}, +- /* 768 */ {L'\x53c3'}, {L'\x53c8'}, {L'\x53ca'}, {L'\x53cc'}, {L'\x53df'}, {L'\x53e3'}, {L'\x53e5'}, {L'\x53eb'}, +- /* 776 */ {L'\x53ef'}, {L'\x53f1'}, {L'\x53f3'}, {L'\x5406'}, {L'\x5408'}, {L'\x540d'}, {L'\x540f'}, {L'\x541d'}, +- /* 784 */ {L'\x5438'}, {L'\x5439'}, {L'\x5442'}, {L'\x5448'}, {L'\x5468'}, {L'\x549e'}, {L'\x54a2'}, {L'\x54bd'}, +- /* 792 */ {L'\x54f6'}, {L'\x5510'}, {L'\x554f'}, {L'\x5553'}, {L'\x5555'}, {L'\x5563'}, {L'\x5584'}, {L'\x5587'}, +- /* 800 */ {L'\x5599'}, {L'\x559d'}, {L'\x55ab'}, {L'\x55b3'}, {L'\x55b6'}, {L'\x55c0'}, {L'\x55c2'}, {L'\x55e2'}, +- /* 808 */ {L'\x5606'}, {L'\x5651'}, {L'\x5668'}, {L'\x5674'}, {L'\x56d7'}, {L'\x56db'}, {L'\x56f9'}, {L'\x5716'}, +- /* 816 */ {L'\x5717'}, {L'\x571f'}, {L'\x5730'}, {L'\x578b'}, {L'\x57ce'}, {L'\x57f4'}, {L'\x580d'}, {L'\x5831'}, +- /* 824 */ {L'\x5832'}, {L'\x5840'}, {L'\x585a'}, {L'\x585e'}, {L'\x58a8'}, {L'\x58ac'}, {L'\x58b3'}, {L'\x58d8'}, +- /* 832 */ {L'\x58df'}, {L'\x58eb'}, {L'\x58ee'}, {L'\x58f0'}, {L'\x58f2'}, {L'\x58f7'}, {L'\x5902'}, {L'\x5906'}, +- /* 840 */ {L'\x590a'}, {L'\x5915'}, {L'\x591a'}, {L'\x591c'}, {L'\x5922'}, {L'\x5927'}, {L'\x5929'}, {L'\x5944'}, +- /* 848 */ {L'\x5948'}, {L'\x5951'}, {L'\x5954'}, {L'\x5962'}, {L'\x5973'}, {L'\x59d8'}, {L'\x59ec'}, {L'\x5a1b'}, +- /* 856 */ {L'\x5a27'}, {L'\x5a62'}, {L'\x5a66'}, {L'\x5ab5'}, {L'\x5b08'}, {L'\x5b28'}, {L'\x5b3e'}, {L'\x5b50'}, +- /* 864 */ {L'\x5b57'}, {L'\x5b66'}, {L'\x5b80'}, {L'\x5b85'}, {L'\x5b97'}, {L'\x5bc3'}, {L'\x5bd8'}, {L'\x5be7'}, +- /* 872 */ {L'\x5bee'}, {L'\x5bf3'}, {L'\x5bf8'}, {L'\x5bff'}, {L'\x5c06'}, {L'\x5c0f'}, {L'\x5c22'}, {L'\x5c38'}, +- /* 880 */ {L'\x5c3f'}, {L'\x5c60'}, {L'\x5c62'}, {L'\x5c64'}, {L'\x5c65'}, {L'\x5c6e'}, {L'\x5c71'}, {L'\x5c8d'}, +- /* 888 */ {L'\x5cc0'}, {L'\x5d19'}, {L'\x5d43'}, {L'\x5d50'}, {L'\x5d6b'}, {L'\x5d6e'}, {L'\x5d7c'}, {L'\x5db2'}, +- /* 896 */ {L'\x5dba'}, {L'\x5ddb'}, {L'\x5de1'}, {L'\x5de2'}, {L'\x5de5'}, {L'\x5de6'}, {L'\x5df1'}, {L'\x5dfd'}, +- /* 904 */ {L'\x5dfe'}, {L'\x5e28'}, {L'\x5e3d'}, {L'\x5e69'}, {L'\x5e72'}, {L'\x5e74'}, {L'\x5e7a'}, {L'\x5e7c'}, +- /* 912 */ {L'\x5e7f'}, {L'\x5ea6'}, {L'\x5eb0'}, {L'\x5eb3'}, {L'\x5eb6'}, {L'\x5ec9'}, {L'\x5eca'}, {L'\x5ed2'}, +- /* 920 */ {L'\x5ed3'}, {L'\x5ed9'}, {L'\x5eec'}, {L'\x5ef4'}, {L'\x5efe'}, {L'\x5f04'}, {L'\x5f0b'}, {L'\x5f13'}, +- /* 928 */ {L'\x5f22'}, {L'\x5f50'}, {L'\x5f53'}, {L'\x5f61'}, {L'\x5f62'}, {L'\x5f69'}, {L'\x5f6b'}, {L'\x5f73'}, +- /* 936 */ {L'\x5f8b'}, {L'\x5f8c'}, {L'\x5f97'}, {L'\x5f9a'}, {L'\x5fa9'}, {L'\x5fad'}, {L'\x5fc3'}, {L'\x5fcd'}, +- /* 944 */ {L'\x5fd7'}, {L'\x5ff5'}, {L'\x5ff9'}, {L'\x6012'}, {L'\x601c'}, {L'\x6075'}, {L'\x6081'}, {L'\x6094'}, +- /* 952 */ {L'\x60c7'}, {L'\x60d8'}, {L'\x60e1'}, {L'\x6108'}, {L'\x6144'}, {L'\x6148'}, {L'\x614c'}, {L'\x614e'}, +- /* 960 */ {L'\x6160'}, {L'\x6168'}, {L'\x617a'}, {L'\x618e'}, {L'\x6190'}, {L'\x61a4'}, {L'\x61af'}, {L'\x61b2'}, +- /* 968 */ {L'\x61de'}, {L'\x61f2'}, {L'\x61f6'}, {L'\x6200'}, {L'\x6208'}, {L'\x6210'}, {L'\x621b'}, {L'\x622e'}, +- /* 976 */ {L'\x6234'}, {L'\x6236'}, {L'\x624b'}, {L'\x6253'}, {L'\x625d'}, {L'\x6295'}, {L'\x62b1'}, {L'\x62c9'}, +- /* 984 */ {L'\x62cf'}, {L'\x62d3'}, {L'\x62d4'}, {L'\x62fc'}, {L'\x62fe'}, {L'\x6307'}, {L'\x633d'}, {L'\x6350'}, +- /* 992 */ {L'\x6355'}, {L'\x6368'}, {L'\x637b'}, {L'\x6383'}, {L'\x63a0'}, {L'\x63a9'}, {L'\x63c4'}, {L'\x63c5'}, +- /* 1000 */ {L'\x63e4'}, {L'\x641c'}, {L'\x6422'}, {L'\x6452'}, {L'\x6469'}, {L'\x6477'}, {L'\x647e'}, {L'\x649a'}, +- /* 1008 */ {L'\x649d'}, {L'\x64c4'}, {L'\x652f'}, {L'\x6534'}, {L'\x654f'}, {L'\x6556'}, {L'\x656c'}, {L'\x6578'}, +- /* 1016 */ {L'\x6587'}, {L'\x6597'}, {L'\x6599'}, {L'\x65a4'}, {L'\x65b0'}, {L'\x65b9'}, {L'\x65c5'}, {L'\x65e0'}, +- /* 1024 */ {L'\x65e2'}, {L'\x65e3'}, {L'\x65e5'}, {L'\x6613'}, {L'\x6620'}, {L'\x6649'}, {L'\x6674'}, {L'\x6688'}, +- /* 1032 */ {L'\x6691'}, {L'\x669c'}, {L'\x66b4'}, {L'\x66c6'}, {L'\x66f0'}, {L'\x66f4'}, {L'\x66f8'}, {L'\x6700'}, +- /* 1040 */ {L'\x6708'}, {L'\x6709'}, {L'\x6717'}, {L'\x671b'}, {L'\x6721'}, {L'\x6728'}, {L'\x674e'}, {L'\x6753'}, +- /* 1048 */ {L'\x6756'}, {L'\x675e'}, {L'\x677b'}, {L'\x6785'}, {L'\x6797'}, {L'\x67f3'}, {L'\x67fa'}, {L'\x6817'}, +- /* 1056 */ {L'\x681f'}, {L'\x682a'}, {L'\x6852'}, {L'\x6881'}, {L'\x6885'}, {L'\x688e'}, {L'\x68a8'}, {L'\x6914'}, +- /* 1064 */ {L'\x6942'}, {L'\x69a3'}, {L'\x69ea'}, {L'\x6a02'}, {L'\x6a13'}, {L'\x6aa8'}, {L'\x6ad3'}, {L'\x6adb'}, +- /* 1072 */ {L'\x6b04'}, {L'\x6b20'}, {L'\x6b21'}, {L'\x6b54'}, {L'\x6b62'}, {L'\x6b63'}, {L'\x6b72'}, {L'\x6b77'}, +- /* 1080 */ {L'\x6b79'}, {L'\x6b9f'}, {L'\x6bae'}, {L'\x6bb3'}, {L'\x6bba'}, {L'\x6bbb'}, {L'\x6bcb'}, {L'\x6bcd'}, +- /* 1088 */ {L'\x6bd4'}, {L'\x6bdb'}, {L'\x6c0f'}, {L'\x6c14'}, {L'\x6c34'}, {L'\x6c4e'}, {L'\x6c67'}, {L'\x6c88'}, +- /* 1096 */ {L'\x6cbf'}, {L'\x6ccc'}, {L'\x6ccd'}, {L'\x6ce5'}, {L'\x6ce8'}, {L'\x6d16'}, {L'\x6d1b'}, {L'\x6d1e'}, +- /* 1104 */ {L'\x6d34'}, {L'\x6d3e'}, {L'\x6d41'}, {L'\x6d69'}, {L'\x6d6a'}, {L'\x6d77'}, {L'\x6d78'}, {L'\x6d85'}, +- /* 1112 */ {L'\x6dcb'}, {L'\x6dda'}, {L'\x6dea'}, {L'\x6df9'}, {L'\x6e1a'}, {L'\x6e2f'}, {L'\x6e6e'}, {L'\x6e80'}, +- /* 1120 */ {L'\x6e9c'}, {L'\x6eba'}, {L'\x6ec7'}, {L'\x6ecb'}, {L'\x6ed1'}, {L'\x6edb'}, {L'\x6f0f'}, {L'\x6f14'}, +- /* 1128 */ {L'\x6f22'}, {L'\x6f23'}, {L'\x6f6e'}, {L'\x6fc6'}, {L'\x6feb'}, {L'\x6ffe'}, {L'\x701b'}, {L'\x701e'}, +- /* 1136 */ {L'\x7039'}, {L'\x704a'}, {L'\x706b'}, {L'\x7070'}, {L'\x7077'}, {L'\x707d'}, {L'\x7099'}, {L'\x70ad'}, +- /* 1144 */ {L'\x70c8'}, {L'\x70d9'}, {L'\x7121'}, {L'\x7145'}, {L'\x7149'}, {L'\x716e'}, {L'\x719c'}, {L'\x71ce'}, +- /* 1152 */ {L'\x71d0'}, {L'\x7210'}, {L'\x721b'}, {L'\x7228'}, {L'\x722a'}, {L'\x722b'}, {L'\x7235'}, {L'\x7236'}, +- /* 1160 */ {L'\x723b'}, {L'\x723f'}, {L'\x7247'}, {L'\x7250'}, {L'\x7259'}, {L'\x725b'}, {L'\x7262'}, {L'\x7279'}, +- /* 1168 */ {L'\x7280'}, {L'\x7295'}, {L'\x72ac'}, {L'\x72af'}, {L'\x72c0'}, {L'\x72fc'}, {L'\x732a'}, {L'\x7375'}, +- /* 1176 */ {L'\x737a'}, {L'\x7384'}, {L'\x7387'}, {L'\x7389'}, {L'\x738b'}, {L'\x73a5'}, {L'\x73b2'}, {L'\x73de'}, +- /* 1184 */ {L'\x7406'}, {L'\x7409'}, {L'\x7422'}, {L'\x7447'}, {L'\x745c'}, {L'\x7469'}, {L'\x7471'}, {L'\x7485'}, +- /* 1192 */ {L'\x7489'}, {L'\x7498'}, {L'\x74ca'}, {L'\x74dc'}, {L'\x74e6'}, {L'\x7506'}, {L'\x7518'}, {L'\x751f'}, +- /* 1200 */ {L'\x7524'}, {L'\x7528'}, {L'\x7530'}, {L'\x7532'}, {L'\x7533'}, {L'\x7537'}, {L'\x753b'}, {L'\x753e'}, +- /* 1208 */ {L'\x7559'}, {L'\x7565'}, {L'\x7570'}, {L'\x758b'}, {L'\x7592'}, {L'\x75e2'}, {L'\x7610'}, {L'\x761d'}, +- /* 1216 */ {L'\x761f'}, {L'\x7642'}, {L'\x7669'}, {L'\x7676'}, {L'\x767d'}, {L'\x76ae'}, {L'\x76bf'}, {L'\x76ca'}, +- /* 1224 */ {L'\x76db'}, {L'\x76e3'}, {L'\x76e7'}, {L'\x76ee'}, {L'\x76f4'}, {L'\x7701'}, {L'\x771e'}, {L'\x771f'}, +- /* 1232 */ {L'\x7740'}, {L'\x774a'}, {L'\x778b'}, {L'\x77a7'}, {L'\x77db'}, {L'\x77e2'}, {L'\x77f3'}, {L'\x784e'}, +- /* 1240 */ {L'\x786b'}, {L'\x788c'}, {L'\x7891'}, {L'\x78ca'}, {L'\x78cc'}, {L'\x78fb'}, {L'\x792a'}, {L'\x793a'}, +- /* 1248 */ {L'\x793c'}, {L'\x793e'}, {L'\x7948'}, {L'\x7949'}, {L'\x7950'}, {L'\x7956'}, {L'\x795d'}, {L'\x795e'}, +- /* 1256 */ {L'\x7965'}, {L'\x797f'}, {L'\x7981'}, {L'\x798d'}, {L'\x798e'}, {L'\x798f'}, {L'\x79ae'}, {L'\x79b8'}, +- /* 1264 */ {L'\x79be'}, {L'\x79ca'}, {L'\x79d8'}, {L'\x79eb'}, {L'\x7a1c'}, {L'\x7a40'}, {L'\x7a4a'}, {L'\x7a4f'}, +- /* 1272 */ {L'\x7a74'}, {L'\x7a7a'}, {L'\x7a81'}, {L'\x7ab1'}, {L'\x7acb'}, {L'\x7aee'}, {L'\x7af9'}, {L'\x7b20'}, +- /* 1280 */ {L'\x7b8f'}, {L'\x7bc0'}, {L'\x7bc6'}, {L'\x7bc9'}, {L'\x7c3e'}, {L'\x7c60'}, {L'\x7c73'}, {L'\x7c7b'}, +- /* 1288 */ {L'\x7c92'}, {L'\x7cbe'}, {L'\x7cd2'}, {L'\x7cd6'}, {L'\x7ce3'}, {L'\x7ce7'}, {L'\x7ce8'}, {L'\x7cf8'}, +- /* 1296 */ {L'\x7d00'}, {L'\x7d10'}, {L'\x7d22'}, {L'\x7d2f'}, {L'\x7d42'}, {L'\x7d5b'}, {L'\x7d63'}, {L'\x7da0'}, +- /* 1304 */ {L'\x7dbe'}, {L'\x7dc7'}, {L'\x7df4'}, {L'\x7e02'}, {L'\x7e09'}, {L'\x7e37'}, {L'\x7e41'}, {L'\x7e45'}, +- /* 1312 */ {L'\x7f36'}, {L'\x7f3e'}, {L'\x7f51'}, {L'\x7f72'}, {L'\x7f79'}, {L'\x7f7a'}, {L'\x7f85'}, {L'\x7f8a'}, +- /* 1320 */ {L'\x7f95'}, {L'\x7f9a'}, {L'\x7fbd'}, {L'\x7ffa'}, {L'\x8001'}, {L'\x8005'}, {L'\x800c'}, {L'\x8012'}, +- /* 1328 */ {L'\x8033'}, {L'\x8046'}, {L'\x8060'}, {L'\x806f'}, {L'\x8070'}, {L'\x807e'}, {L'\x807f'}, {L'\x8089'}, +- /* 1336 */ {L'\x808b'}, {L'\x80ad'}, {L'\x80b2'}, {L'\x8103'}, {L'\x813e'}, {L'\x81d8'}, {L'\x81e3'}, {L'\x81e8'}, +- /* 1344 */ {L'\x81ea'}, {L'\x81ed'}, {L'\x81f3'}, {L'\x81fc'}, {L'\x8201'}, {L'\x8204'}, {L'\x820c'}, {L'\x8218'}, +- /* 1352 */ {L'\x821b'}, {L'\x821f'}, {L'\x826e'}, {L'\x826f'}, {L'\x8272'}, {L'\x8278'}, {L'\x8279'}, {L'\x828b'}, +- /* 1360 */ {L'\x8291'}, {L'\x829d'}, {L'\x82b1'}, {L'\x82b3'}, {L'\x82bd'}, {L'\x82e5'}, {L'\x82e6'}, {L'\x831d'}, +- /* 1368 */ {L'\x8323'}, {L'\x8336'}, {L'\x8352'}, {L'\x8353'}, {L'\x8363'}, {L'\x83ad'}, {L'\x83bd'}, {L'\x83c9'}, +- /* 1376 */ {L'\x83ca'}, {L'\x83cc'}, {L'\x83dc'}, {L'\x83e7'}, {L'\x83ef'}, {L'\x83f1'}, {L'\x843d'}, {L'\x8449'}, +- /* 1384 */ {L'\x8457'}, {L'\x84ee'}, {L'\x84f1'}, {L'\x84f3'}, {L'\x84fc'}, {L'\x8516'}, {L'\x8564'}, {L'\x85cd'}, +- /* 1392 */ {L'\x85fa'}, {L'\x8606'}, {L'\x8612'}, {L'\x862d'}, {L'\x863f'}, {L'\x864d'}, {L'\x8650'}, {L'\x865c'}, +- /* 1400 */ {L'\x8667'}, {L'\x8669'}, {L'\x866b'}, {L'\x8688'}, {L'\x86a9'}, {L'\x86e2'}, {L'\x870e'}, {L'\x8728'}, +- /* 1408 */ {L'\x876b'}, {L'\x8779'}, {L'\x8786'}, {L'\x87ba'}, {L'\x87e1'}, {L'\x8801'}, {L'\x881f'}, {L'\x8840'}, +- /* 1416 */ {L'\x884c'}, {L'\x8860'}, {L'\x8863'}, {L'\x88c2'}, {L'\x88cf'}, {L'\x88d7'}, {L'\x88de'}, {L'\x88e1'}, +- /* 1424 */ {L'\x88f8'}, {L'\x88fa'}, {L'\x8910'}, {L'\x8941'}, {L'\x8964'}, {L'\x897e'}, {L'\x8986'}, {L'\x898b'}, +- /* 1432 */ {L'\x8996'}, {L'\x89d2'}, {L'\x89e3'}, {L'\x8a00'}, {L'\x8aa0'}, {L'\x8aaa'}, {L'\x8abf'}, {L'\x8acb'}, +- /* 1440 */ {L'\x8ad2'}, {L'\x8ad6'}, {L'\x8aed'}, {L'\x8af8'}, {L'\x8afe'}, {L'\x8b01'}, {L'\x8b39'}, {L'\x8b58'}, +- /* 1448 */ {L'\x8b80'}, {L'\x8b8a'}, {L'\x8c37'}, {L'\x8c46'}, {L'\x8c48'}, {L'\x8c55'}, {L'\x8c78'}, {L'\x8c9d'}, +- /* 1456 */ {L'\x8ca1'}, {L'\x8ca9'}, {L'\x8cab'}, {L'\x8cc1'}, {L'\x8cc2'}, {L'\x8cc7'}, {L'\x8cc8'}, {L'\x8cd3'}, +- /* 1464 */ {L'\x8d08'}, {L'\x8d1b'}, {L'\x8d64'}, {L'\x8d70'}, {L'\x8d77'}, {L'\x8db3'}, {L'\x8dbc'}, {L'\x8dcb'}, +- /* 1472 */ {L'\x8def'}, {L'\x8df0'}, {L'\x8eab'}, {L'\x8eca'}, {L'\x8ed4'}, {L'\x8f26'}, {L'\x8f2a'}, {L'\x8f38'}, +- /* 1480 */ {L'\x8f3b'}, {L'\x8f62'}, {L'\x8f9b'}, {L'\x8f9e'}, {L'\x8fb0'}, {L'\x8fb5'}, {L'\x8fb6'}, {L'\x9023'}, +- /* 1488 */ {L'\x9038'}, {L'\x904a'}, {L'\x9069'}, {L'\x9072'}, {L'\x907c'}, {L'\x908f'}, {L'\x9091'}, {L'\x9094'}, +- /* 1496 */ {L'\x90ce'}, {L'\x90de'}, {L'\x90f1'}, {L'\x90fd'}, {L'\x9111'}, {L'\x911b'}, {L'\x9149'}, {L'\x914d'}, +- /* 1504 */ {L'\x916a'}, {L'\x9199'}, {L'\x91b4'}, {L'\x91c6'}, {L'\x91cc'}, {L'\x91cf'}, {L'\x91d1'}, {L'\x9234'}, +- /* 1512 */ {L'\x9238'}, {L'\x9276'}, {L'\x927c'}, {L'\x92d7'}, {L'\x92d8'}, {L'\x9304'}, {L'\x934a'}, {L'\x93f9'}, +- /* 1520 */ {L'\x9415'}, {L'\x9577'}, {L'\x9580'}, {L'\x958b'}, {L'\x95ad'}, {L'\x95b7'}, {L'\x961c'}, {L'\x962e'}, +- /* 1528 */ {L'\x964b'}, {L'\x964d'}, {L'\x9675'}, {L'\x9678'}, {L'\x967c'}, {L'\x9686'}, {L'\x96a3'}, {L'\x96b6'}, +- /* 1536 */ {L'\x96b7'}, {L'\x96b8'}, {L'\x96b9'}, {L'\x96c3'}, {L'\x96e2'}, {L'\x96e3'}, {L'\x96e8'}, {L'\x96f6'}, +- /* 1544 */ {L'\x96f7'}, {L'\x9723'}, {L'\x9732'}, {L'\x9748'}, {L'\x9751'}, {L'\x9756'}, {L'\x975e'}, {L'\x9762'}, +- /* 1552 */ {L'\x9769'}, {L'\x97cb'}, {L'\x97db'}, {L'\x97e0'}, {L'\x97ed'}, {L'\x97f3'}, {L'\x97ff'}, {L'\x9801'}, +- /* 1560 */ {L'\x9805'}, {L'\x980b'}, {L'\x9818'}, {L'\x9829'}, {L'\x983b'}, {L'\x985e'}, {L'\x98a8'}, {L'\x98db'}, +- /* 1568 */ {L'\x98df'}, {L'\x98e2'}, {L'\x98ef'}, {L'\x98fc'}, {L'\x9928'}, {L'\x9929'}, {L'\x9996'}, {L'\x9999'}, +- /* 1576 */ {L'\x99a7'}, {L'\x99ac'}, {L'\x99c2'}, {L'\x99f1'}, {L'\x99fe'}, {L'\x9a6a'}, {L'\x9aa8'}, {L'\x9ad8'}, +- /* 1584 */ {L'\x9adf'}, {L'\x9b12'}, {L'\x9b25'}, {L'\x9b2f'}, {L'\x9b32'}, {L'\x9b3c'}, {L'\x9b5a'}, {L'\x9b6f'}, +- /* 1592 */ {L'\x9c40'}, {L'\x9c57'}, {L'\x9ce5'}, {L'\x9cfd'}, {L'\x9d67'}, {L'\x9db4'}, {L'\x9dfa'}, {L'\x9e1e'}, +- /* 1600 */ {L'\x9e75'}, {L'\x9e7f'}, {L'\x9e97'}, {L'\x9e9f'}, {L'\x9ea5'}, {L'\x9ebb'}, {L'\x9ec3'}, {L'\x9ecd'}, +- /* 1608 */ {L'\x9ece'}, {L'\x9ed1'}, {L'\x9ef9'}, {L'\x9efd'}, {L'\x9efe'}, {L'\x9f05'}, {L'\x9f0e'}, {L'\x9f0f'}, +- /* 1616 */ {L'\x9f13'}, {L'\x9f16'}, {L'\x9f20'}, {L'\x9f3b'}, {L'\x9f43'}, {L'\x9f4a'}, {L'\x9f52'}, {L'\x9f8d'}, +- /* 1624 */ {L'\x9f8e'}, {L'\x9f9c'}, {L'\x9f9f'}, {L'\x9fa0'}, {L'\xa727'}, {L'\xa76f'}, {L'\xab37'}, {L'\xab52'}, +- /* 1632 */ {L']'}, {L'^'}, {L'_'}, {L'`'}, {L'a'}, {L'b'}, {L'c'}, {L'd'}, +- /* 1640 */ {L'e'}, {L'f'}, {L'g'}, {L'h'}, {L'i'}, {L'j'}, {L'k'}, {L'l'}, +- /* 1648 */ {L'm'}, {L'n'}, {L'o'}, {L'p'}, {L'q'}, {L'r'}, {L's'}, {L't'}, +- /* 1656 */ {L'u'}, {L'v'}, {L'w'}, {L'x'}, {L'y'}, {L'z'}, {L'{'}, {L'|'}, +- /* 1664 */ {L'}'}, {L'~'}}; ++ /* 64 */ {L'\x00a6'}, {L'\x00ac'}, {L'\x00b7'}, {L'\x00c6'}, {L'\x00e6'}, {L'\x00f0'}, {L'\x00f8'}, {L'\x0126'}, ++ /* 72 */ {L'\x0127'}, {L'\x0131'}, {L'\x014b'}, {L'\x0153'}, {L'\x018e'}, {L'\x0190'}, {L'\x01ab'}, {L'\x01c0'}, ++ /* 80 */ {L'\x01c1'}, {L'\x01c2'}, {L'\x0222'}, {L'\x0237'}, {L'\x0250'}, {L'\x0251'}, {L'\x0252'}, {L'\x0253'}, ++ /* 88 */ {L'\x0254'}, {L'\x0255'}, {L'\x0256'}, {L'\x0257'}, {L'\x0258'}, {L'\x0259'}, {L'\x025b'}, {L'\x025c'}, ++ /* 96 */ {L'\x025e'}, {L'\x025f'}, {L'\x0260'}, {L'\x0261'}, {L'\x0262'}, {L'\x0263'}, {L'\x0264'}, {L'\x0265'}, ++ /* 104 */ {L'\x0266'}, {L'\x0267'}, {L'\x0268'}, {L'\x0269'}, {L'\x026a'}, {L'\x026b'}, {L'\x026c'}, {L'\x026d'}, ++ /* 112 */ {L'\x026e'}, {L'\x026f'}, {L'\x0270'}, {L'\x0271'}, {L'\x0272'}, {L'\x0273'}, {L'\x0274'}, {L'\x0275'}, ++ /* 120 */ {L'\x0276'}, {L'\x0277'}, {L'\x0278'}, {L'\x0279'}, {L'\x027a'}, {L'\x027b'}, {L'\x027d'}, {L'\x027e'}, ++ /* 128 */ {L'\x0280'}, {L'\x0281'}, {L'\x0282'}, {L'\x0283'}, {L'\x0284'}, {L'\x0288'}, {L'\x0289'}, {L'\x028a'}, ++ /* 136 */ {L'\x028b'}, {L'\x028c'}, {L'\x028d'}, {L'\x028e'}, {L'\x028f'}, {L'\x0290'}, {L'\x0291'}, {L'\x0292'}, ++ /* 144 */ {L'\x0295'}, {L'\x0298'}, {L'\x0299'}, {L'\x029b'}, {L'\x029c'}, {L'\x029d'}, {L'\x029f'}, {L'\x02a1'}, ++ /* 152 */ {L'\x02a2'}, {L'\x02a3'}, {L'\x02a4'}, {L'\x02a5'}, {L'\x02a6'}, {L'\x02a7'}, {L'\x02a8'}, {L'\x02a9'}, ++ /* 160 */ {L'\x02aa'}, {L'\x02ab'}, {L'\x02b9'}, {L'\x02d0'}, {L'\x02d1'}, {L'\x0300'}, {L'\x0301'}, {L'\x0313'}, ++ /* 168 */ {L'\x0391'}, {L'\x0392'}, {L'\x0393'}, {L'\x0394'}, {L'\x0395'}, {L'\x0396'}, {L'\x0397'}, {L'\x0398'}, ++ /* 176 */ {L'\x0399'}, {L'\x039a'}, {L'\x039b'}, {L'\x039c'}, {L'\x039d'}, {L'\x039e'}, {L'\x039f'}, {L'\x03a0'}, ++ /* 184 */ {L'\x03a1'}, {L'\x03a3'}, {L'\x03a4'}, {L'\x03a5'}, {L'\x03a6'}, {L'\x03a7'}, {L'\x03a8'}, {L'\x03a9'}, ++ /* 192 */ {L'\x03b1'}, {L'\x03b2'}, {L'\x03b3'}, {L'\x03b4'}, {L'\x03b5'}, {L'\x03b6'}, {L'\x03b7'}, {L'\x03b8'}, ++ /* 200 */ {L'\x03b9'}, {L'\x03ba'}, {L'\x03bb'}, {L'\x03bc'}, {L'\x03bd'}, {L'\x03be'}, {L'\x03bf'}, {L'\x03c0'}, ++ /* 208 */ {L'\x03c1'}, {L'\x03c2'}, {L'\x03c3'}, {L'\x03c4'}, {L'\x03c5'}, {L'\x03c6'}, {L'\x03c7'}, {L'\x03c8'}, ++ /* 216 */ {L'\x03c9'}, {L'\x03dc'}, {L'\x03dd'}, {L'\x043d'}, {L'\x044a'}, {L'\x044c'}, {L'\x05d0'}, {L'\x05d1'}, ++ /* 224 */ {L'\x05d2'}, {L'\x05d3'}, {L'\x05d4'}, {L'\x05db'}, {L'\x05dc'}, {L'\x05dd'}, {L'\x05e2'}, {L'\x05e8'}, ++ /* 232 */ {L'\x05ea'}, {L'\x0621'}, {L'\x0627'}, {L'\x0628'}, {L'\x0629'}, {L'\x062a'}, {L'\x062b'}, {L'\x062c'}, ++ /* 240 */ {L'\x062d'}, {L'\x062e'}, {L'\x062f'}, {L'\x0630'}, {L'\x0631'}, {L'\x0632'}, {L'\x0633'}, {L'\x0634'}, ++ /* 248 */ {L'\x0635'}, {L'\x0636'}, {L'\x0637'}, {L'\x0638'}, {L'\x0639'}, {L'\x063a'}, {L'\x0641'}, {L'\x0642'}, ++ /* 256 */ {L'\x0643'}, {L'\x0644'}, {L'\x0645'}, {L'\x0646'}, {L'\x0647'}, {L'\x0648'}, {L'\x0649'}, {L'\x064a'}, ++ /* 264 */ {L'\x066e'}, {L'\x066f'}, {L'\x0671'}, {L'\x0679'}, {L'\x067a'}, {L'\x067b'}, {L'\x067e'}, {L'\x067f'}, ++ /* 272 */ {L'\x0680'}, {L'\x0683'}, {L'\x0684'}, {L'\x0686'}, {L'\x0687'}, {L'\x0688'}, {L'\x068c'}, {L'\x068d'}, ++ /* 280 */ {L'\x068e'}, {L'\x0691'}, {L'\x0698'}, {L'\x06a1'}, {L'\x06a4'}, {L'\x06a6'}, {L'\x06a9'}, {L'\x06ad'}, ++ /* 288 */ {L'\x06af'}, {L'\x06b1'}, {L'\x06b3'}, {L'\x06ba'}, {L'\x06bb'}, {L'\x06be'}, {L'\x06c1'}, {L'\x06c5'}, ++ /* 296 */ {L'\x06c6'}, {L'\x06c7'}, {L'\x06c8'}, {L'\x06c9'}, {L'\x06cb'}, {L'\x06cc'}, {L'\x06d0'}, {L'\x06d2'}, ++ /* 304 */ {L'\x0f0b'}, {L'\x10dc'}, {L'\x1100'}, {L'\x1101'}, {L'\x1102'}, {L'\x1103'}, {L'\x1104'}, {L'\x1105'}, ++ /* 312 */ {L'\x1106'}, {L'\x1107'}, {L'\x1108'}, {L'\x1109'}, {L'\x110a'}, {L'\x110b'}, {L'\x110c'}, {L'\x110d'}, ++ /* 320 */ {L'\x110e'}, {L'\x110f'}, {L'\x1110'}, {L'\x1111'}, {L'\x1112'}, {L'\x1114'}, {L'\x1115'}, {L'\x111a'}, ++ /* 328 */ {L'\x111c'}, {L'\x111d'}, {L'\x111e'}, {L'\x1120'}, {L'\x1121'}, {L'\x1122'}, {L'\x1123'}, {L'\x1127'}, ++ /* 336 */ {L'\x1129'}, {L'\x112b'}, {L'\x112c'}, {L'\x112d'}, {L'\x112e'}, {L'\x112f'}, {L'\x1132'}, {L'\x1136'}, ++ /* 344 */ {L'\x1140'}, {L'\x1147'}, {L'\x114c'}, {L'\x1157'}, {L'\x1158'}, {L'\x1159'}, {L'\x1160'}, {L'\x1161'}, ++ /* 352 */ {L'\x1162'}, {L'\x1163'}, {L'\x1164'}, {L'\x1165'}, {L'\x1166'}, {L'\x1167'}, {L'\x1168'}, {L'\x1169'}, ++ /* 360 */ {L'\x116a'}, {L'\x116b'}, {L'\x116c'}, {L'\x116d'}, {L'\x116e'}, {L'\x116f'}, {L'\x1170'}, {L'\x1171'}, ++ /* 368 */ {L'\x1172'}, {L'\x1173'}, {L'\x1174'}, {L'\x1175'}, {L'\x1184'}, {L'\x1185'}, {L'\x1188'}, {L'\x1191'}, ++ /* 376 */ {L'\x1192'}, {L'\x1194'}, {L'\x119e'}, {L'\x11a1'}, {L'\x11aa'}, {L'\x11ac'}, {L'\x11ad'}, {L'\x11b0'}, ++ /* 384 */ {L'\x11b1'}, {L'\x11b2'}, {L'\x11b3'}, {L'\x11b4'}, {L'\x11b5'}, {L'\x11c7'}, {L'\x11c8'}, {L'\x11cc'}, ++ /* 392 */ {L'\x11ce'}, {L'\x11d3'}, {L'\x11d7'}, {L'\x11d9'}, {L'\x11dd'}, {L'\x11df'}, {L'\x11f1'}, {L'\x11f2'}, ++ /* 400 */ {L'\x1d02'}, {L'\x1d16'}, {L'\x1d17'}, {L'\x1d1c'}, {L'\x1d1d'}, {L'\x1d25'}, {L'\x1d7b'}, {L'\x1d85'}, ++ /* 408 */ {L'\x1d91'}, {L'\x1df04'}, {L'\x1df05'}, {L'\x1df06'}, {L'\x1df08'}, {L'\x1df0a'}, {L'\x1df1e'}, {L'\x2010'}, ++ /* 416 */ {L'\x20122'}, {L'\x2013'}, {L'\x2014'}, {L'\x2051c'}, {L'\x20525'}, {L'\x2054b'}, {L'\x2063a'}, {L'\x20804'}, ++ /* 424 */ {L'\x208de'}, {L'\x20a2c'}, {L'\x20a9'}, {L'\x20b63'}, {L'\x214e4'}, {L'\x216a8'}, {L'\x216ea'}, {L'\x2190'}, ++ /* 432 */ {L'\x2191'}, {L'\x2192'}, {L'\x2193'}, {L'\x219c8'}, {L'\x21b18'}, {L'\x21d0b'}, {L'\x21de4'}, {L'\x21de6'}, ++ /* 440 */ {L'\x2202'}, {L'\x2207'}, {L'\x2211'}, {L'\x2212'}, {L'\x22183'}, {L'\x2219f'}, {L'\x22331'}, {L'\x226d4'}, ++ /* 448 */ {L'\x22844'}, {L'\x2284a'}, {L'\x22b0c'}, {L'\x22bf1'}, {L'\x2300a'}, {L'\x232b8'}, {L'\x2335f'}, {L'\x23393'}, ++ /* 456 */ {L'\x2339c'}, {L'\x233c3'}, {L'\x233d5'}, {L'\x2346d'}, {L'\x236a3'}, {L'\x238a7'}, {L'\x23a8d'}, {L'\x23afa'}, ++ /* 464 */ {L'\x23cbc'}, {L'\x23d1e'}, {L'\x23ed1'}, {L'\x23f5e'}, {L'\x23f8e'}, {L'\x24263'}, {L'\x242ee'}, {L'\x243ab'}, ++ /* 472 */ {L'\x24608'}, {L'\x24735'}, {L'\x24814'}, {L'\x24c36'}, {L'\x24c92'}, {L'\x24fa1'}, {L'\x24fb8'}, {L'\x2502'}, ++ /* 480 */ {L'\x25044'}, {L'\x250f2'}, {L'\x250f3'}, {L'\x25119'}, {L'\x25133'}, {L'\x25249'}, {L'\x2541d'}, {L'\x25626'}, ++ /* 488 */ {L'\x2569a'}, {L'\x256c5'}, {L'\x2597c'}, {L'\x25a0'}, {L'\x25aa7'}, {L'\x25bab'}, {L'\x25c80'}, {L'\x25cb'}, ++ /* 496 */ {L'\x25cd0'}, {L'\x25f86'}, {L'\x261da'}, {L'\x26228'}, {L'\x26247'}, {L'\x262d9'}, {L'\x2633e'}, {L'\x264da'}, ++ /* 504 */ {L'\x26523'}, {L'\x265a8'}, {L'\x267a7'}, {L'\x267b5'}, {L'\x26b3c'}, {L'\x26c36'}, {L'\x26cd5'}, {L'\x26d6b'}, ++ /* 512 */ {L'\x26f2c'}, {L'\x26fb1'}, {L'\x270d2'}, {L'\x273ca'}, {L'\x27667'}, {L'\x278ae'}, {L'\x27966'}, {L'\x27ca8'}, ++ /* 520 */ {L'\x27ed3'}, {L'\x27f2f'}, {L'\x285d2'}, {L'\x285ed'}, {L'\x2872e'}, {L'\x28bfa'}, {L'\x28d77'}, {L'\x29145'}, ++ /* 528 */ {L'\x291df'}, {L'\x2921a'}, {L'\x2940a'}, {L'\x29496'}, {L'\x295b6'}, {L'\x2985'}, {L'\x2986'}, {L'\x29b30'}, ++ /* 536 */ {L'\x2a0ce'}, {L'\x2a105'}, {L'\x2a20e'}, {L'\x2a291'}, {L'\x2a392'}, {L'\x2a600'}, {L'\x2c71'}, {L'\x2d61'}, ++ /* 544 */ {L'\x3001'}, {L'\x3002'}, {L'\x3008'}, {L'\x3009'}, {L'\x300a'}, {L'\x300b'}, {L'\x300c'}, {L'\x300d'}, ++ /* 552 */ {L'\x300e'}, {L'\x300f'}, {L'\x3010'}, {L'\x3011'}, {L'\x3012'}, {L'\x3014'}, {L'\x3015'}, {L'\x3016'}, ++ /* 560 */ {L'\x3017'}, {L'\x3099'}, {L'\x309a'}, {L'\x30a1'}, {L'\x30a2'}, {L'\x30a3'}, {L'\x30a4'}, {L'\x30a5'}, ++ /* 568 */ {L'\x30a6'}, {L'\x30a7'}, {L'\x30a8'}, {L'\x30a9'}, {L'\x30aa'}, {L'\x30ab'}, {L'\x30ad'}, {L'\x30af'}, ++ /* 576 */ {L'\x30b1'}, {L'\x30b3'}, {L'\x30b5'}, {L'\x30b7'}, {L'\x30b9'}, {L'\x30bb'}, {L'\x30bd'}, {L'\x30bf'}, ++ /* 584 */ {L'\x30c1'}, {L'\x30c3'}, {L'\x30c4'}, {L'\x30c6'}, {L'\x30c8'}, {L'\x30ca'}, {L'\x30cb'}, {L'\x30cc'}, ++ /* 592 */ {L'\x30cd'}, {L'\x30ce'}, {L'\x30cf'}, {L'\x30d2'}, {L'\x30d5'}, {L'\x30d8'}, {L'\x30db'}, {L'\x30de'}, ++ /* 600 */ {L'\x30df'}, {L'\x30e0'}, {L'\x30e1'}, {L'\x30e2'}, {L'\x30e3'}, {L'\x30e4'}, {L'\x30e5'}, {L'\x30e6'}, ++ /* 608 */ {L'\x30e7'}, {L'\x30e8'}, {L'\x30e9'}, {L'\x30ea'}, {L'\x30eb'}, {L'\x30ec'}, {L'\x30ed'}, {L'\x30ef'}, ++ /* 616 */ {L'\x30f0'}, {L'\x30f1'}, {L'\x30f2'}, {L'\x30f3'}, {L'\x30fb'}, {L'\x30fc'}, {L'\x349e'}, {L'\x34b9'}, ++ /* 624 */ {L'\x34bb'}, {L'\x34df'}, {L'\x3515'}, {L'\x36ee'}, {L'\x36fc'}, {L'\x3781'}, {L'\x382f'}, {L'\x3862'}, ++ /* 632 */ {L'\x387c'}, {L'\x38c7'}, {L'\x38e3'}, {L'\x391c'}, {L'\x393a'}, {L'\x3a2e'}, {L'\x3a6c'}, {L'\x3ae4'}, ++ /* 640 */ {L'\x3b08'}, {L'\x3b19'}, {L'\x3b49'}, {L'\x3b9d'}, {L'\x3c18'}, {L'\x3c4e'}, {L'\x3d33'}, {L'\x3d96'}, ++ /* 648 */ {L'\x3eac'}, {L'\x3eb8'}, {L'\x3f1b'}, {L'\x3ffc'}, {L'\x4008'}, {L'\x4018'}, {L'\x4039'}, {L'\x4046'}, ++ /* 656 */ {L'\x4096'}, {L'\x40e3'}, {L'\x412f'}, {L'\x4202'}, {L'\x4227'}, {L'\x42a0'}, {L'\x4301'}, {L'\x4334'}, ++ /* 664 */ {L'\x4359'}, {L'\x43d5'}, {L'\x43d9'}, {L'\x440b'}, {L'\x446b'}, {L'\x452b'}, {L'\x455d'}, {L'\x4561'}, ++ /* 672 */ {L'\x456b'}, {L'\x45d7'}, {L'\x45f9'}, {L'\x4635'}, {L'\x46be'}, {L'\x46c7'}, {L'\x4995'}, {L'\x49e6'}, ++ /* 680 */ {L'\x4a6e'}, {L'\x4a76'}, {L'\x4ab2'}, {L'\x4b33'}, {L'\x4bce'}, {L'\x4cce'}, {L'\x4ced'}, {L'\x4cf8'}, ++ /* 688 */ {L'\x4d56'}, {L'\x4e00'}, {L'\x4e01'}, {L'\x4e03'}, {L'\x4e09'}, {L'\x4e0a'}, {L'\x4e0b'}, {L'\x4e0d'}, ++ /* 696 */ {L'\x4e19'}, {L'\x4e26'}, {L'\x4e28'}, {L'\x4e2d'}, {L'\x4e32'}, {L'\x4e36'}, {L'\x4e38'}, {L'\x4e39'}, ++ /* 704 */ {L'\x4e3d'}, {L'\x4e3f'}, {L'\x4e41'}, {L'\x4e59'}, {L'\x4e5d'}, {L'\x4e82'}, {L'\x4e85'}, {L'\x4e86'}, ++ /* 712 */ {L'\x4e8c'}, {L'\x4e94'}, {L'\x4ea0'}, {L'\x4ea4'}, {L'\x4eae'}, {L'\x4eba'}, {L'\x4ec0'}, {L'\x4ecc'}, ++ /* 720 */ {L'\x4ee4'}, {L'\x4f01'}, {L'\x4f11'}, {L'\x4f60'}, {L'\x4f80'}, {L'\x4f86'}, {L'\x4f8b'}, {L'\x4fae'}, ++ /* 728 */ {L'\x4fbb'}, {L'\x4fbf'}, {L'\x5002'}, {L'\x502b'}, {L'\x507a'}, {L'\x5099'}, {L'\x50cf'}, {L'\x50da'}, ++ /* 736 */ {L'\x50e7'}, {L'\x512a'}, {L'\x513f'}, {L'\x5140'}, {L'\x5145'}, {L'\x514d'}, {L'\x5154'}, {L'\x5164'}, ++ /* 744 */ {L'\x5165'}, {L'\x5167'}, {L'\x5168'}, {L'\x5169'}, {L'\x516b'}, {L'\x516d'}, {L'\x5177'}, {L'\x5180'}, ++ /* 752 */ {L'\x5182'}, {L'\x518d'}, {L'\x5192'}, {L'\x5195'}, {L'\x5196'}, {L'\x5197'}, {L'\x5199'}, {L'\x51a4'}, ++ /* 760 */ {L'\x51ab'}, {L'\x51ac'}, {L'\x51b5'}, {L'\x51b7'}, {L'\x51c9'}, {L'\x51cc'}, {L'\x51dc'}, {L'\x51de'}, ++ /* 768 */ {L'\x51e0'}, {L'\x51f5'}, {L'\x5200'}, {L'\x5203'}, {L'\x5207'}, {L'\x5217'}, {L'\x521d'}, {L'\x5229'}, ++ /* 776 */ {L'\x523a'}, {L'\x523b'}, {L'\x5246'}, {L'\x524d'}, {L'\x5272'}, {L'\x5277'}, {L'\x5289'}, {L'\x529b'}, ++ /* 784 */ {L'\x52a3'}, {L'\x52b3'}, {L'\x52b4'}, {L'\x52c7'}, {L'\x52c9'}, {L'\x52d2'}, {L'\x52de'}, {L'\x52e4'}, ++ /* 792 */ {L'\x52f5'}, {L'\x52f9'}, {L'\x52fa'}, {L'\x5305'}, {L'\x5306'}, {L'\x5315'}, {L'\x5317'}, {L'\x531a'}, ++ /* 800 */ {L'\x5338'}, {L'\x533b'}, {L'\x533f'}, {L'\x5341'}, {L'\x5344'}, {L'\x5345'}, {L'\x5349'}, {L'\x5351'}, ++ /* 808 */ {L'\x5354'}, {L'\x535a'}, {L'\x535c'}, {L'\x5369'}, {L'\x5370'}, {L'\x5373'}, {L'\x5375'}, {L'\x537d'}, ++ /* 816 */ {L'\x537f'}, {L'\x5382'}, {L'\x53b6'}, {L'\x53c3'}, {L'\x53c8'}, {L'\x53ca'}, {L'\x53cc'}, {L'\x53df'}, ++ /* 824 */ {L'\x53e3'}, {L'\x53e5'}, {L'\x53eb'}, {L'\x53ef'}, {L'\x53f1'}, {L'\x53f3'}, {L'\x5406'}, {L'\x5408'}, ++ /* 832 */ {L'\x540d'}, {L'\x540f'}, {L'\x541d'}, {L'\x5438'}, {L'\x5439'}, {L'\x5442'}, {L'\x5448'}, {L'\x5468'}, ++ /* 840 */ {L'\x549e'}, {L'\x54a2'}, {L'\x54bd'}, {L'\x54f6'}, {L'\x5510'}, {L'\x554f'}, {L'\x5553'}, {L'\x5555'}, ++ /* 848 */ {L'\x5563'}, {L'\x5584'}, {L'\x5587'}, {L'\x5599'}, {L'\x559d'}, {L'\x55ab'}, {L'\x55b3'}, {L'\x55b6'}, ++ /* 856 */ {L'\x55c0'}, {L'\x55c2'}, {L'\x55e2'}, {L'\x5606'}, {L'\x5651'}, {L'\x5668'}, {L'\x5674'}, {L'\x56d7'}, ++ /* 864 */ {L'\x56db'}, {L'\x56f9'}, {L'\x5716'}, {L'\x5717'}, {L'\x571f'}, {L'\x5730'}, {L'\x578b'}, {L'\x57ce'}, ++ /* 872 */ {L'\x57f4'}, {L'\x580d'}, {L'\x5831'}, {L'\x5832'}, {L'\x5840'}, {L'\x585a'}, {L'\x585e'}, {L'\x58a8'}, ++ /* 880 */ {L'\x58ac'}, {L'\x58b3'}, {L'\x58d8'}, {L'\x58df'}, {L'\x58eb'}, {L'\x58ee'}, {L'\x58f0'}, {L'\x58f2'}, ++ /* 888 */ {L'\x58f7'}, {L'\x5902'}, {L'\x5906'}, {L'\x590a'}, {L'\x5915'}, {L'\x591a'}, {L'\x591c'}, {L'\x5922'}, ++ /* 896 */ {L'\x5927'}, {L'\x5929'}, {L'\x5944'}, {L'\x5948'}, {L'\x5951'}, {L'\x5954'}, {L'\x5962'}, {L'\x5973'}, ++ /* 904 */ {L'\x59d8'}, {L'\x59ec'}, {L'\x5a1b'}, {L'\x5a27'}, {L'\x5a62'}, {L'\x5a66'}, {L'\x5ab5'}, {L'\x5b08'}, ++ /* 912 */ {L'\x5b28'}, {L'\x5b3e'}, {L'\x5b50'}, {L'\x5b57'}, {L'\x5b66'}, {L'\x5b80'}, {L'\x5b85'}, {L'\x5b97'}, ++ /* 920 */ {L'\x5bc3'}, {L'\x5bd8'}, {L'\x5be7'}, {L'\x5bee'}, {L'\x5bf3'}, {L'\x5bf8'}, {L'\x5bff'}, {L'\x5c06'}, ++ /* 928 */ {L'\x5c0f'}, {L'\x5c22'}, {L'\x5c38'}, {L'\x5c3f'}, {L'\x5c60'}, {L'\x5c62'}, {L'\x5c64'}, {L'\x5c65'}, ++ /* 936 */ {L'\x5c6e'}, {L'\x5c71'}, {L'\x5c8d'}, {L'\x5cc0'}, {L'\x5d19'}, {L'\x5d43'}, {L'\x5d50'}, {L'\x5d6b'}, ++ /* 944 */ {L'\x5d6e'}, {L'\x5d7c'}, {L'\x5db2'}, {L'\x5dba'}, {L'\x5ddb'}, {L'\x5de1'}, {L'\x5de2'}, {L'\x5de5'}, ++ /* 952 */ {L'\x5de6'}, {L'\x5df1'}, {L'\x5dfd'}, {L'\x5dfe'}, {L'\x5e28'}, {L'\x5e3d'}, {L'\x5e69'}, {L'\x5e72'}, ++ /* 960 */ {L'\x5e74'}, {L'\x5e7a'}, {L'\x5e7c'}, {L'\x5e7f'}, {L'\x5ea6'}, {L'\x5eb0'}, {L'\x5eb3'}, {L'\x5eb6'}, ++ /* 968 */ {L'\x5ec9'}, {L'\x5eca'}, {L'\x5ed2'}, {L'\x5ed3'}, {L'\x5ed9'}, {L'\x5eec'}, {L'\x5ef4'}, {L'\x5efe'}, ++ /* 976 */ {L'\x5f04'}, {L'\x5f0b'}, {L'\x5f13'}, {L'\x5f22'}, {L'\x5f50'}, {L'\x5f53'}, {L'\x5f61'}, {L'\x5f62'}, ++ /* 984 */ {L'\x5f69'}, {L'\x5f6b'}, {L'\x5f73'}, {L'\x5f8b'}, {L'\x5f8c'}, {L'\x5f97'}, {L'\x5f9a'}, {L'\x5fa9'}, ++ /* 992 */ {L'\x5fad'}, {L'\x5fc3'}, {L'\x5fcd'}, {L'\x5fd7'}, {L'\x5ff5'}, {L'\x5ff9'}, {L'\x6012'}, {L'\x601c'}, ++ /* 1000 */ {L'\x6075'}, {L'\x6081'}, {L'\x6094'}, {L'\x60c7'}, {L'\x60d8'}, {L'\x60e1'}, {L'\x6108'}, {L'\x6144'}, ++ /* 1008 */ {L'\x6148'}, {L'\x614c'}, {L'\x614e'}, {L'\x6160'}, {L'\x6168'}, {L'\x617a'}, {L'\x618e'}, {L'\x6190'}, ++ /* 1016 */ {L'\x61a4'}, {L'\x61af'}, {L'\x61b2'}, {L'\x61de'}, {L'\x61f2'}, {L'\x61f6'}, {L'\x6200'}, {L'\x6208'}, ++ /* 1024 */ {L'\x6210'}, {L'\x621b'}, {L'\x622e'}, {L'\x6234'}, {L'\x6236'}, {L'\x624b'}, {L'\x6253'}, {L'\x625d'}, ++ /* 1032 */ {L'\x6295'}, {L'\x62b1'}, {L'\x62c9'}, {L'\x62cf'}, {L'\x62d3'}, {L'\x62d4'}, {L'\x62fc'}, {L'\x62fe'}, ++ /* 1040 */ {L'\x6307'}, {L'\x633d'}, {L'\x6350'}, {L'\x6355'}, {L'\x6368'}, {L'\x637b'}, {L'\x6383'}, {L'\x63a0'}, ++ /* 1048 */ {L'\x63a9'}, {L'\x63c4'}, {L'\x63c5'}, {L'\x63e4'}, {L'\x641c'}, {L'\x6422'}, {L'\x6452'}, {L'\x6469'}, ++ /* 1056 */ {L'\x6477'}, {L'\x647e'}, {L'\x649a'}, {L'\x649d'}, {L'\x64c4'}, {L'\x652f'}, {L'\x6534'}, {L'\x654f'}, ++ /* 1064 */ {L'\x6556'}, {L'\x656c'}, {L'\x6578'}, {L'\x6587'}, {L'\x6597'}, {L'\x6599'}, {L'\x65a4'}, {L'\x65b0'}, ++ /* 1072 */ {L'\x65b9'}, {L'\x65c5'}, {L'\x65e0'}, {L'\x65e2'}, {L'\x65e3'}, {L'\x65e5'}, {L'\x6613'}, {L'\x6620'}, ++ /* 1080 */ {L'\x6649'}, {L'\x6674'}, {L'\x6688'}, {L'\x6691'}, {L'\x669c'}, {L'\x66b4'}, {L'\x66c6'}, {L'\x66f0'}, ++ /* 1088 */ {L'\x66f4'}, {L'\x66f8'}, {L'\x6700'}, {L'\x6708'}, {L'\x6709'}, {L'\x6717'}, {L'\x671b'}, {L'\x6721'}, ++ /* 1096 */ {L'\x6728'}, {L'\x674e'}, {L'\x6753'}, {L'\x6756'}, {L'\x675e'}, {L'\x677b'}, {L'\x6785'}, {L'\x6797'}, ++ /* 1104 */ {L'\x67f3'}, {L'\x67fa'}, {L'\x6817'}, {L'\x681f'}, {L'\x682a'}, {L'\x6852'}, {L'\x6881'}, {L'\x6885'}, ++ /* 1112 */ {L'\x688e'}, {L'\x68a8'}, {L'\x6914'}, {L'\x6942'}, {L'\x69a3'}, {L'\x69ea'}, {L'\x6a02'}, {L'\x6a13'}, ++ /* 1120 */ {L'\x6aa8'}, {L'\x6ad3'}, {L'\x6adb'}, {L'\x6b04'}, {L'\x6b20'}, {L'\x6b21'}, {L'\x6b54'}, {L'\x6b62'}, ++ /* 1128 */ {L'\x6b63'}, {L'\x6b72'}, {L'\x6b77'}, {L'\x6b79'}, {L'\x6b9f'}, {L'\x6bae'}, {L'\x6bb3'}, {L'\x6bba'}, ++ /* 1136 */ {L'\x6bbb'}, {L'\x6bcb'}, {L'\x6bcd'}, {L'\x6bd4'}, {L'\x6bdb'}, {L'\x6c0f'}, {L'\x6c14'}, {L'\x6c34'}, ++ /* 1144 */ {L'\x6c4e'}, {L'\x6c67'}, {L'\x6c88'}, {L'\x6cbf'}, {L'\x6ccc'}, {L'\x6ccd'}, {L'\x6ce5'}, {L'\x6ce8'}, ++ /* 1152 */ {L'\x6d16'}, {L'\x6d1b'}, {L'\x6d1e'}, {L'\x6d34'}, {L'\x6d3e'}, {L'\x6d41'}, {L'\x6d69'}, {L'\x6d6a'}, ++ /* 1160 */ {L'\x6d77'}, {L'\x6d78'}, {L'\x6d85'}, {L'\x6dcb'}, {L'\x6dda'}, {L'\x6dea'}, {L'\x6df9'}, {L'\x6e1a'}, ++ /* 1168 */ {L'\x6e2f'}, {L'\x6e6e'}, {L'\x6e80'}, {L'\x6e9c'}, {L'\x6eba'}, {L'\x6ec7'}, {L'\x6ecb'}, {L'\x6ed1'}, ++ /* 1176 */ {L'\x6edb'}, {L'\x6f0f'}, {L'\x6f14'}, {L'\x6f22'}, {L'\x6f23'}, {L'\x6f6e'}, {L'\x6fc6'}, {L'\x6feb'}, ++ /* 1184 */ {L'\x6ffe'}, {L'\x701b'}, {L'\x701e'}, {L'\x7039'}, {L'\x704a'}, {L'\x706b'}, {L'\x7070'}, {L'\x7077'}, ++ /* 1192 */ {L'\x707d'}, {L'\x7099'}, {L'\x70ad'}, {L'\x70c8'}, {L'\x70d9'}, {L'\x7121'}, {L'\x7145'}, {L'\x7149'}, ++ /* 1200 */ {L'\x716e'}, {L'\x719c'}, {L'\x71ce'}, {L'\x71d0'}, {L'\x7210'}, {L'\x721b'}, {L'\x7228'}, {L'\x722a'}, ++ /* 1208 */ {L'\x722b'}, {L'\x7235'}, {L'\x7236'}, {L'\x723b'}, {L'\x723f'}, {L'\x7247'}, {L'\x7250'}, {L'\x7259'}, ++ /* 1216 */ {L'\x725b'}, {L'\x7262'}, {L'\x7279'}, {L'\x7280'}, {L'\x7295'}, {L'\x72ac'}, {L'\x72af'}, {L'\x72c0'}, ++ /* 1224 */ {L'\x72fc'}, {L'\x732a'}, {L'\x7375'}, {L'\x737a'}, {L'\x7384'}, {L'\x7387'}, {L'\x7389'}, {L'\x738b'}, ++ /* 1232 */ {L'\x73a5'}, {L'\x73b2'}, {L'\x73de'}, {L'\x7406'}, {L'\x7409'}, {L'\x7422'}, {L'\x7447'}, {L'\x745c'}, ++ /* 1240 */ {L'\x7469'}, {L'\x7471'}, {L'\x7485'}, {L'\x7489'}, {L'\x7498'}, {L'\x74ca'}, {L'\x74dc'}, {L'\x74e6'}, ++ /* 1248 */ {L'\x7506'}, {L'\x7518'}, {L'\x751f'}, {L'\x7524'}, {L'\x7528'}, {L'\x7530'}, {L'\x7532'}, {L'\x7533'}, ++ /* 1256 */ {L'\x7537'}, {L'\x753b'}, {L'\x753e'}, {L'\x7559'}, {L'\x7565'}, {L'\x7570'}, {L'\x758b'}, {L'\x7592'}, ++ /* 1264 */ {L'\x75e2'}, {L'\x7610'}, {L'\x761d'}, {L'\x761f'}, {L'\x7642'}, {L'\x7669'}, {L'\x7676'}, {L'\x767d'}, ++ /* 1272 */ {L'\x76ae'}, {L'\x76bf'}, {L'\x76ca'}, {L'\x76db'}, {L'\x76e3'}, {L'\x76e7'}, {L'\x76ee'}, {L'\x76f4'}, ++ /* 1280 */ {L'\x7701'}, {L'\x771e'}, {L'\x771f'}, {L'\x7740'}, {L'\x774a'}, {L'\x778b'}, {L'\x77a7'}, {L'\x77db'}, ++ /* 1288 */ {L'\x77e2'}, {L'\x77f3'}, {L'\x784e'}, {L'\x786b'}, {L'\x788c'}, {L'\x7891'}, {L'\x78ca'}, {L'\x78cc'}, ++ /* 1296 */ {L'\x78fb'}, {L'\x792a'}, {L'\x793a'}, {L'\x793c'}, {L'\x793e'}, {L'\x7948'}, {L'\x7949'}, {L'\x7950'}, ++ /* 1304 */ {L'\x7956'}, {L'\x795d'}, {L'\x795e'}, {L'\x7965'}, {L'\x797f'}, {L'\x7981'}, {L'\x798d'}, {L'\x798e'}, ++ /* 1312 */ {L'\x798f'}, {L'\x79ae'}, {L'\x79b8'}, {L'\x79be'}, {L'\x79ca'}, {L'\x79d8'}, {L'\x79eb'}, {L'\x7a1c'}, ++ /* 1320 */ {L'\x7a40'}, {L'\x7a4a'}, {L'\x7a4f'}, {L'\x7a74'}, {L'\x7a7a'}, {L'\x7a81'}, {L'\x7ab1'}, {L'\x7acb'}, ++ /* 1328 */ {L'\x7aee'}, {L'\x7af9'}, {L'\x7b20'}, {L'\x7b8f'}, {L'\x7bc0'}, {L'\x7bc6'}, {L'\x7bc9'}, {L'\x7c3e'}, ++ /* 1336 */ {L'\x7c60'}, {L'\x7c73'}, {L'\x7c7b'}, {L'\x7c92'}, {L'\x7cbe'}, {L'\x7cd2'}, {L'\x7cd6'}, {L'\x7ce3'}, ++ /* 1344 */ {L'\x7ce7'}, {L'\x7ce8'}, {L'\x7cf8'}, {L'\x7d00'}, {L'\x7d10'}, {L'\x7d22'}, {L'\x7d2f'}, {L'\x7d42'}, ++ /* 1352 */ {L'\x7d5b'}, {L'\x7d63'}, {L'\x7da0'}, {L'\x7dbe'}, {L'\x7dc7'}, {L'\x7df4'}, {L'\x7e02'}, {L'\x7e09'}, ++ /* 1360 */ {L'\x7e37'}, {L'\x7e41'}, {L'\x7e45'}, {L'\x7f36'}, {L'\x7f3e'}, {L'\x7f51'}, {L'\x7f72'}, {L'\x7f79'}, ++ /* 1368 */ {L'\x7f7a'}, {L'\x7f85'}, {L'\x7f8a'}, {L'\x7f95'}, {L'\x7f9a'}, {L'\x7fbd'}, {L'\x7ffa'}, {L'\x8001'}, ++ /* 1376 */ {L'\x8005'}, {L'\x800c'}, {L'\x8012'}, {L'\x8033'}, {L'\x8046'}, {L'\x8060'}, {L'\x806f'}, {L'\x8070'}, ++ /* 1384 */ {L'\x807e'}, {L'\x807f'}, {L'\x8089'}, {L'\x808b'}, {L'\x80ad'}, {L'\x80b2'}, {L'\x8103'}, {L'\x813e'}, ++ /* 1392 */ {L'\x81d8'}, {L'\x81e3'}, {L'\x81e8'}, {L'\x81ea'}, {L'\x81ed'}, {L'\x81f3'}, {L'\x81fc'}, {L'\x8201'}, ++ /* 1400 */ {L'\x8204'}, {L'\x820c'}, {L'\x8218'}, {L'\x821b'}, {L'\x821f'}, {L'\x826e'}, {L'\x826f'}, {L'\x8272'}, ++ /* 1408 */ {L'\x8278'}, {L'\x8279'}, {L'\x828b'}, {L'\x8291'}, {L'\x829d'}, {L'\x82b1'}, {L'\x82b3'}, {L'\x82bd'}, ++ /* 1416 */ {L'\x82e5'}, {L'\x82e6'}, {L'\x831d'}, {L'\x8323'}, {L'\x8336'}, {L'\x8352'}, {L'\x8353'}, {L'\x8363'}, ++ /* 1424 */ {L'\x83ad'}, {L'\x83bd'}, {L'\x83c9'}, {L'\x83ca'}, {L'\x83cc'}, {L'\x83dc'}, {L'\x83e7'}, {L'\x83ef'}, ++ /* 1432 */ {L'\x83f1'}, {L'\x843d'}, {L'\x8449'}, {L'\x8457'}, {L'\x84ee'}, {L'\x84f1'}, {L'\x84f3'}, {L'\x84fc'}, ++ /* 1440 */ {L'\x8516'}, {L'\x8564'}, {L'\x85cd'}, {L'\x85fa'}, {L'\x8606'}, {L'\x8612'}, {L'\x862d'}, {L'\x863f'}, ++ /* 1448 */ {L'\x864d'}, {L'\x8650'}, {L'\x865c'}, {L'\x8667'}, {L'\x8669'}, {L'\x866b'}, {L'\x8688'}, {L'\x86a9'}, ++ /* 1456 */ {L'\x86e2'}, {L'\x870e'}, {L'\x8728'}, {L'\x876b'}, {L'\x8779'}, {L'\x8786'}, {L'\x87ba'}, {L'\x87e1'}, ++ /* 1464 */ {L'\x8801'}, {L'\x881f'}, {L'\x8840'}, {L'\x884c'}, {L'\x8860'}, {L'\x8863'}, {L'\x88c2'}, {L'\x88cf'}, ++ /* 1472 */ {L'\x88d7'}, {L'\x88de'}, {L'\x88e1'}, {L'\x88f8'}, {L'\x88fa'}, {L'\x8910'}, {L'\x8941'}, {L'\x8964'}, ++ /* 1480 */ {L'\x897e'}, {L'\x8986'}, {L'\x898b'}, {L'\x8996'}, {L'\x89d2'}, {L'\x89e3'}, {L'\x8a00'}, {L'\x8aa0'}, ++ /* 1488 */ {L'\x8aaa'}, {L'\x8abf'}, {L'\x8acb'}, {L'\x8ad2'}, {L'\x8ad6'}, {L'\x8aed'}, {L'\x8af8'}, {L'\x8afe'}, ++ /* 1496 */ {L'\x8b01'}, {L'\x8b39'}, {L'\x8b58'}, {L'\x8b80'}, {L'\x8b8a'}, {L'\x8c37'}, {L'\x8c46'}, {L'\x8c48'}, ++ /* 1504 */ {L'\x8c55'}, {L'\x8c78'}, {L'\x8c9d'}, {L'\x8ca1'}, {L'\x8ca9'}, {L'\x8cab'}, {L'\x8cc1'}, {L'\x8cc2'}, ++ /* 1512 */ {L'\x8cc7'}, {L'\x8cc8'}, {L'\x8cd3'}, {L'\x8d08'}, {L'\x8d1b'}, {L'\x8d64'}, {L'\x8d70'}, {L'\x8d77'}, ++ /* 1520 */ {L'\x8db3'}, {L'\x8dbc'}, {L'\x8dcb'}, {L'\x8def'}, {L'\x8df0'}, {L'\x8eab'}, {L'\x8eca'}, {L'\x8ed4'}, ++ /* 1528 */ {L'\x8f26'}, {L'\x8f2a'}, {L'\x8f38'}, {L'\x8f3b'}, {L'\x8f62'}, {L'\x8f9b'}, {L'\x8f9e'}, {L'\x8fb0'}, ++ /* 1536 */ {L'\x8fb5'}, {L'\x8fb6'}, {L'\x9023'}, {L'\x9038'}, {L'\x904a'}, {L'\x9069'}, {L'\x9072'}, {L'\x907c'}, ++ /* 1544 */ {L'\x908f'}, {L'\x9091'}, {L'\x9094'}, {L'\x90ce'}, {L'\x90de'}, {L'\x90f1'}, {L'\x90fd'}, {L'\x9111'}, ++ /* 1552 */ {L'\x911b'}, {L'\x9149'}, {L'\x914d'}, {L'\x916a'}, {L'\x9199'}, {L'\x91b4'}, {L'\x91c6'}, {L'\x91cc'}, ++ /* 1560 */ {L'\x91cf'}, {L'\x91d1'}, {L'\x9234'}, {L'\x9238'}, {L'\x9276'}, {L'\x927c'}, {L'\x92d7'}, {L'\x92d8'}, ++ /* 1568 */ {L'\x9304'}, {L'\x934a'}, {L'\x93f9'}, {L'\x9415'}, {L'\x9577'}, {L'\x9580'}, {L'\x958b'}, {L'\x95ad'}, ++ /* 1576 */ {L'\x95b7'}, {L'\x961c'}, {L'\x962e'}, {L'\x964b'}, {L'\x964d'}, {L'\x9675'}, {L'\x9678'}, {L'\x967c'}, ++ /* 1584 */ {L'\x9686'}, {L'\x96a3'}, {L'\x96b6'}, {L'\x96b7'}, {L'\x96b8'}, {L'\x96b9'}, {L'\x96c3'}, {L'\x96e2'}, ++ /* 1592 */ {L'\x96e3'}, {L'\x96e8'}, {L'\x96f6'}, {L'\x96f7'}, {L'\x9723'}, {L'\x9732'}, {L'\x9748'}, {L'\x9751'}, ++ /* 1600 */ {L'\x9756'}, {L'\x975e'}, {L'\x9762'}, {L'\x9769'}, {L'\x97cb'}, {L'\x97db'}, {L'\x97e0'}, {L'\x97ed'}, ++ /* 1608 */ {L'\x97f3'}, {L'\x97ff'}, {L'\x9801'}, {L'\x9805'}, {L'\x980b'}, {L'\x9818'}, {L'\x9829'}, {L'\x983b'}, ++ /* 1616 */ {L'\x985e'}, {L'\x98a8'}, {L'\x98db'}, {L'\x98df'}, {L'\x98e2'}, {L'\x98ef'}, {L'\x98fc'}, {L'\x9928'}, ++ /* 1624 */ {L'\x9929'}, {L'\x9996'}, {L'\x9999'}, {L'\x99a7'}, {L'\x99ac'}, {L'\x99c2'}, {L'\x99f1'}, {L'\x99fe'}, ++ /* 1632 */ {L'\x9a6a'}, {L'\x9aa8'}, {L'\x9ad8'}, {L'\x9adf'}, {L'\x9b12'}, {L'\x9b25'}, {L'\x9b2f'}, {L'\x9b32'}, ++ /* 1640 */ {L'\x9b3c'}, {L'\x9b5a'}, {L'\x9b6f'}, {L'\x9c40'}, {L'\x9c57'}, {L'\x9ce5'}, {L'\x9cfd'}, {L'\x9d67'}, ++ /* 1648 */ {L'\x9db4'}, {L'\x9dfa'}, {L'\x9e1e'}, {L'\x9e75'}, {L'\x9e7f'}, {L'\x9e97'}, {L'\x9e9f'}, {L'\x9ea5'}, ++ /* 1656 */ {L'\x9ebb'}, {L'\x9ec3'}, {L'\x9ecd'}, {L'\x9ece'}, {L'\x9ed1'}, {L'\x9ef9'}, {L'\x9efd'}, {L'\x9efe'}, ++ /* 1664 */ {L'\x9f05'}, {L'\x9f0e'}, {L'\x9f0f'}, {L'\x9f13'}, {L'\x9f16'}, {L'\x9f20'}, {L'\x9f3b'}, {L'\x9f43'}, ++ /* 1672 */ {L'\x9f4a'}, {L'\x9f52'}, {L'\x9f8d'}, {L'\x9f8e'}, {L'\x9f9c'}, {L'\x9f9f'}, {L'\x9fa0'}, {L'\xa727'}, ++ /* 1680 */ {L'\xa76f'}, {L'\xa78e'}, {L'\xab37'}, {L'\xab52'}, {L'\xab66'}, {L'\xab67'}, {L']'}, {L'^'}, ++ /* 1688 */ {L'_'}, {L'`'}, {L'a'}, {L'b'}, {L'c'}, {L'd'}, {L'e'}, {L'f'}, ++ /* 1696 */ {L'g'}, {L'h'}, {L'i'}, {L'j'}, {L'k'}, {L'l'}, {L'm'}, {L'n'}, ++ /* 1704 */ {L'o'}, {L'p'}, {L'q'}, {L'r'}, {L's'}, {L't'}, {L'u'}, {L'v'}, ++ /* 1712 */ {L'w'}, {L'x'}, {L'y'}, {L'z'}, {L'{'}, {L'|'}, {L'}'}, {L'~'}}; + + static const wchar_t UNWIF_compat_tbl_2 [1193][2] = { + /* 0 */ {L'.',L'.'}, {L'0',L','}, {L'0',L'.'}, {L'0',L'\x70b9'}, {L'1',L','}, {L'1',L'.'}, {L'1',L'0'}, {L'1',L'1'}, +@@ -543,9 +549,9 @@ static const uint16_t UNWIF_compat_00_00 [256] = { + /* 0090 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0098 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 00a0 */ TBL(1)|52, 0, 0, 0, 0, 0, 0, 0, +-/* 00a8 */ TBL(2)|335, 0, TBL(1)|1636, 0, 0, 0, 0, TBL(2)|331, +-/* 00b0 */ 0, 0, TBL(1)|10, TBL(1)|11, TBL(2)|329, TBL(1)|160, 0, 0, +-/* 00b8 */ TBL(2)|340, TBL(1)|9, TBL(1)|1650, 0, TBL(3)|148, TBL(3)|146, TBL(3)|174, 0, ++/* 00a8 */ TBL(2)|335, 0, TBL(1)|1690, 0, 0, 0, 0, TBL(2)|331, ++/* 00b0 */ 0, 0, TBL(1)|10, TBL(1)|11, TBL(2)|329, TBL(1)|203, 0, 0, ++/* 00b8 */ TBL(2)|340, TBL(1)|9, TBL(1)|1704, 0, TBL(3)|148, TBL(3)|146, TBL(3)|174, 0, + /* 00c0 */ TBL(2)|98, TBL(2)|99, TBL(2)|100, TBL(2)|101, TBL(2)|105, TBL(2)|107, 0, TBL(2)|123, + /* 00c8 */ TBL(2)|133, TBL(2)|134, TBL(2)|135, TBL(2)|140, TBL(2)|176, TBL(2)|177, TBL(2)|178, TBL(2)|183, + /* 00d0 */ 0, TBL(2)|222, TBL(2)|231, TBL(2)|232, TBL(2)|233, TBL(2)|234, TBL(2)|238, 0, +@@ -572,7 +578,7 @@ static const uint16_t UNWIF_compat_00_01 [256] = { + /* 0160 */ TBL(2)|267, TBL(2)|1131, TBL(2)|277, TBL(2)|1142, TBL(2)|274, TBL(2)|1139, 0, 0, + /* 0168 */ TBL(2)|283, TBL(2)|1148, TBL(2)|284, TBL(2)|1149, TBL(2)|285, TBL(2)|1150, TBL(2)|288, TBL(2)|1153, + /* 0170 */ TBL(2)|289, TBL(2)|1154, TBL(2)|296, TBL(2)|1161, TBL(2)|306, TBL(2)|1169, TBL(2)|316, TBL(2)|1179, +-/* 0178 */ TBL(2)|320, TBL(2)|323, TBL(2)|1187, TBL(2)|325, TBL(2)|1189, TBL(2)|326, TBL(2)|1190, TBL(1)|1654, ++/* 0178 */ TBL(2)|320, TBL(2)|323, TBL(2)|1187, TBL(2)|325, TBL(2)|1189, TBL(2)|326, TBL(2)|1190, TBL(1)|1708, + /* 0180 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0188 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0190 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -614,13 +620,13 @@ static const uint16_t UNWIF_compat_00_02 [256] = { + /* 0298 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 02a0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 02a8 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 02b0 */ TBL(1)|1643, TBL(1)|91, TBL(1)|1645, TBL(1)|1653, TBL(1)|105, TBL(1)|106, TBL(1)|107, TBL(1)|1658, +-/* 02b8 */ TBL(1)|1660, 0, 0, 0, 0, 0, 0, 0, ++/* 02b0 */ TBL(1)|1697, TBL(1)|104, TBL(1)|1699, TBL(1)|1707, TBL(1)|123, TBL(1)|125, TBL(1)|129, TBL(1)|1712, ++/* 02b8 */ TBL(1)|1714, 0, 0, 0, 0, 0, 0, 0, + /* 02c0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 02c8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 02d0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 02d8 */ TBL(2)|333, TBL(2)|334, TBL(2)|336, TBL(2)|341, TBL(2)|330, TBL(2)|337, 0, 0, +-/* 02e0 */ TBL(1)|89, TBL(1)|1647, TBL(1)|1654, TBL(1)|1659, TBL(1)|118, 0, 0, 0, ++/* 02e0 */ TBL(1)|101, TBL(1)|1701, TBL(1)|1708, TBL(1)|1713, TBL(1)|144, 0, 0, 0, + /* 02e8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 02f0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 02f8 */ 0, 0, 0, 0, 0, 0, 0, 0 +@@ -635,13 +641,13 @@ static const uint16_t UNWIF_compat_00_03 [256] = { + /* 0328 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0330 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0338 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 0340 */ TBL(1)|122, TBL(1)|123, 0, TBL(1)|124, TBL(2)|368, 0, 0, 0, ++/* 0340 */ TBL(1)|165, TBL(1)|166, 0, TBL(1)|167, TBL(2)|368, 0, 0, 0, + /* 0348 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0350 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0358 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0360 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0368 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 0370 */ 0, 0, 0, 0, TBL(1)|121, 0, 0, 0, ++/* 0370 */ 0, 0, 0, 0, TBL(1)|162, 0, 0, 0, + /* 0378 */ 0, 0, TBL(2)|344, 0, 0, 0, TBL(1)|19, 0, + /* 0380 */ 0, 0, 0, 0, TBL(2)|329, TBL(3)|260, TBL(2)|370, TBL(1)|66, + /* 0388 */ TBL(2)|377, TBL(2)|381, TBL(2)|386, 0, TBL(2)|393, 0, TBL(2)|398, TBL(2)|404, +@@ -653,12 +659,12 @@ static const uint16_t UNWIF_compat_00_03 [256] = { + /* 03b8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 03c0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 03c8 */ 0, 0, TBL(2)|430, TBL(2)|452, TBL(2)|443, TBL(2)|449, TBL(2)|457, 0, +-/* 03d0 */ TBL(1)|150, TBL(1)|156, TBL(1)|144, TBL(2)|398, TBL(2)|401, TBL(1)|170, TBL(1)|164, 0, ++/* 03d0 */ TBL(1)|193, TBL(1)|199, TBL(1)|187, TBL(2)|398, TBL(2)|401, TBL(1)|213, TBL(1)|207, 0, + /* 03d8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 03e0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 03e8 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 03f0 */ TBL(1)|158, TBL(1)|165, TBL(1)|166, 0, TBL(1)|132, TBL(1)|153, 0, 0, +-/* 03f8 */ 0, TBL(1)|142, 0, 0, 0, 0, 0, 0 ++/* 03f0 */ TBL(1)|201, TBL(1)|208, TBL(1)|209, 0, TBL(1)|175, TBL(1)|196, 0, 0, ++/* 03f8 */ 0, TBL(1)|185, 0, 0, 0, 0, 0, 0 + }; + + static const uint16_t UNWIF_compat_00_04 [256] = { +@@ -978,7 +984,7 @@ static const uint16_t UNWIF_compat_00_0e [256] = { + + static const uint16_t UNWIF_compat_00_0f [256] = { + /* 0f00 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 0f08 */ 0, 0, 0, 0, TBL(1)|261, 0, 0, 0, ++/* 0f08 */ 0, 0, 0, 0, TBL(1)|304, 0, 0, 0, + /* 0f10 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0f18 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0f20 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1043,7 +1049,7 @@ static const uint16_t UNWIF_compat_00_10 [256] = { + /* 10e0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 10e8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 10f0 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 10f8 */ 0, 0, 0, 0, TBL(1)|262, 0, 0, 0 ++/* 10f8 */ 0, 0, 0, 0, TBL(1)|305, 0, 0, 0 + }; + + static const uint16_t UNWIF_compat_00_1b [256] = { +@@ -1088,24 +1094,24 @@ static const uint16_t UNWIF_compat_00_1d [256] = { + /* 1d18 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1d20 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1d28 */ 0, 0, 0, 0, TBL(1)|25, TBL(1)|67, TBL(1)|26, 0, +-/* 1d30 */ TBL(1)|28, TBL(1)|29, TBL(1)|74, TBL(1)|31, TBL(1)|32, TBL(1)|33, TBL(1)|34, TBL(1)|35, +-/* 1d38 */ TBL(1)|36, TBL(1)|37, TBL(1)|38, 0, TBL(1)|39, TBL(1)|77, TBL(1)|40, TBL(1)|42, +-/* 1d40 */ TBL(1)|44, TBL(1)|45, TBL(1)|47, TBL(1)|1636, TBL(1)|79, TBL(1)|80, TBL(1)|357, TBL(1)|1637, +-/* 1d48 */ TBL(1)|1639, TBL(1)|1640, TBL(1)|84, TBL(1)|85, TBL(1)|86, TBL(1)|1642, 0, TBL(1)|1646, +-/* 1d50 */ TBL(1)|1648, TBL(1)|72, TBL(1)|1650, TBL(1)|82, TBL(1)|358, TBL(1)|359, TBL(1)|1651, TBL(1)|1655, +-/* 1d58 */ TBL(1)|1656, TBL(1)|361, TBL(1)|97, TBL(1)|1657, TBL(1)|362, TBL(1)|150, TBL(1)|151, TBL(1)|152, +-/* 1d60 */ TBL(1)|170, TBL(1)|171, TBL(1)|1644, TBL(1)|1653, TBL(1)|1656, TBL(1)|1657, TBL(1)|150, TBL(1)|151, +-/* 1d68 */ TBL(1)|165, TBL(1)|170, TBL(1)|171, 0, 0, 0, 0, 0, ++/* 1d30 */ TBL(1)|28, TBL(1)|29, TBL(1)|76, TBL(1)|31, TBL(1)|32, TBL(1)|33, TBL(1)|34, TBL(1)|35, ++/* 1d38 */ TBL(1)|36, TBL(1)|37, TBL(1)|38, 0, TBL(1)|39, TBL(1)|82, TBL(1)|40, TBL(1)|42, ++/* 1d40 */ TBL(1)|44, TBL(1)|45, TBL(1)|47, TBL(1)|1690, TBL(1)|84, TBL(1)|85, TBL(1)|400, TBL(1)|1691, ++/* 1d48 */ TBL(1)|1693, TBL(1)|1694, TBL(1)|93, TBL(1)|94, TBL(1)|95, TBL(1)|1696, 0, TBL(1)|1700, ++/* 1d50 */ TBL(1)|1702, TBL(1)|74, TBL(1)|1704, TBL(1)|88, TBL(1)|401, TBL(1)|402, TBL(1)|1705, TBL(1)|1709, ++/* 1d58 */ TBL(1)|1710, TBL(1)|404, TBL(1)|113, TBL(1)|1711, TBL(1)|405, TBL(1)|193, TBL(1)|194, TBL(1)|195, ++/* 1d60 */ TBL(1)|213, TBL(1)|214, TBL(1)|1698, TBL(1)|1707, TBL(1)|1710, TBL(1)|1711, TBL(1)|193, TBL(1)|194, ++/* 1d68 */ TBL(1)|208, TBL(1)|213, TBL(1)|214, 0, 0, 0, 0, 0, + /* 1d70 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 1d78 */ TBL(1)|176, 0, 0, 0, 0, 0, 0, 0, ++/* 1d78 */ TBL(1)|219, 0, 0, 0, 0, 0, 0, 0, + /* 1d80 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1d88 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1d90 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 1d98 */ 0, 0, 0, TBL(1)|81, TBL(1)|1638, TBL(1)|83, TBL(1)|68, TBL(1)|86, +-/* 1da0 */ TBL(1)|1641, TBL(1)|87, TBL(1)|88, TBL(1)|90, TBL(1)|92, TBL(1)|93, TBL(1)|94, TBL(1)|363, +-/* 1da8 */ TBL(1)|119, TBL(1)|96, TBL(1)|364, TBL(1)|120, TBL(1)|99, TBL(1)|98, TBL(1)|100, TBL(1)|101, +-/* 1db0 */ TBL(1)|102, TBL(1)|103, TBL(1)|104, TBL(1)|108, TBL(1)|109, TBL(1)|76, TBL(1)|110, TBL(1)|111, +-/* 1db8 */ TBL(1)|360, TBL(1)|112, TBL(1)|113, TBL(1)|1661, TBL(1)|115, TBL(1)|116, TBL(1)|117, TBL(1)|156, ++/* 1d98 */ 0, 0, 0, TBL(1)|86, TBL(1)|1692, TBL(1)|89, TBL(1)|69, TBL(1)|95, ++/* 1da0 */ TBL(1)|1695, TBL(1)|97, TBL(1)|99, TBL(1)|103, TBL(1)|106, TBL(1)|107, TBL(1)|108, TBL(1)|406, ++/* 1da8 */ TBL(1)|149, TBL(1)|111, TBL(1)|407, TBL(1)|150, TBL(1)|115, TBL(1)|114, TBL(1)|116, TBL(1)|117, ++/* 1db0 */ TBL(1)|118, TBL(1)|119, TBL(1)|122, TBL(1)|130, TBL(1)|131, TBL(1)|78, TBL(1)|134, TBL(1)|135, ++/* 1db8 */ TBL(1)|403, TBL(1)|136, TBL(1)|137, TBL(1)|1715, TBL(1)|141, TBL(1)|142, TBL(1)|143, TBL(1)|199, + /* 1dc0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1dc8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 1dd0 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1175,13 +1181,13 @@ static const uint16_t UNWIF_compat_00_1f [256] = { + /* 1fa0 */ TBL(3)|368, TBL(3)|372, TBL(4)|59, TBL(4)|62, TBL(4)|60, TBL(4)|63, TBL(4)|61, TBL(4)|64, + /* 1fa8 */ TBL(3)|310, TBL(3)|314, TBL(4)|41, TBL(4)|44, TBL(4)|42, TBL(4)|45, TBL(4)|43, TBL(4)|46, + /* 1fb0 */ TBL(2)|411, TBL(2)|410, TBL(3)|315, TBL(2)|415, TBL(3)|316, 0, TBL(2)|414, TBL(3)|325, +-/* 1fb8 */ TBL(2)|372, TBL(2)|371, TBL(2)|369, TBL(2)|370, TBL(2)|375, TBL(2)|338, TBL(1)|157, TBL(2)|338, ++/* 1fb8 */ TBL(2)|372, TBL(2)|371, TBL(2)|369, TBL(2)|370, TBL(2)|375, TBL(2)|338, TBL(1)|200, TBL(2)|338, + /* 1fc0 */ TBL(2)|343, TBL(3)|261, TBL(3)|330, TBL(2)|425, TBL(3)|331, 0, TBL(2)|424, TBL(3)|340, + /* 1fc8 */ TBL(2)|376, TBL(2)|377, TBL(2)|380, TBL(2)|381, TBL(2)|384, TBL(3)|262, TBL(3)|263, TBL(3)|264, + /* 1fd0 */ TBL(2)|429, TBL(2)|428, TBL(3)|341, TBL(3)|342, 0, 0, TBL(2)|433, TBL(3)|343, + /* 1fd8 */ TBL(2)|388, TBL(2)|387, TBL(2)|385, TBL(2)|386, 0, TBL(3)|265, TBL(3)|266, TBL(3)|267, + /* 1fe0 */ TBL(2)|451, TBL(2)|450, TBL(3)|354, TBL(3)|355, TBL(2)|446, TBL(2)|447, TBL(2)|455, TBL(3)|356, +-/* 1fe8 */ TBL(2)|400, TBL(2)|399, TBL(2)|397, TBL(2)|398, TBL(2)|396, TBL(3)|259, TBL(3)|260, TBL(1)|1635, ++/* 1fe8 */ TBL(2)|400, TBL(2)|399, TBL(2)|397, TBL(2)|398, TBL(2)|396, TBL(3)|259, TBL(3)|260, TBL(1)|1689, + /* 1ff0 */ 0, 0, TBL(3)|363, TBL(2)|461, TBL(3)|364, 0, TBL(2)|460, TBL(3)|373, + /* 1ff8 */ TBL(2)|392, TBL(2)|393, TBL(2)|403, TBL(2)|404, TBL(2)|407, TBL(2)|329, TBL(2)|339, 0 + }; +@@ -1189,7 +1195,7 @@ static const uint16_t UNWIF_compat_00_1f [256] = { + static const uint16_t UNWIF_compat_00_20 [256] = { + /* 2000 */ TBL(1)|52, TBL(1)|52, TBL(1)|52, TBL(1)|52, TBL(1)|52, TBL(1)|52, TBL(1)|52, TBL(1)|52, + /* 2008 */ TBL(1)|52, TBL(1)|52, TBL(1)|52, 0, 0, 0, 0, 0, +-/* 2010 */ 0, TBL(1)|365, 0, 0, 0, 0, 0, TBL(2)|342, ++/* 2010 */ 0, TBL(1)|415, 0, 0, 0, 0, 0, TBL(2)|342, + /* 2018 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2020 */ 0, 0, 0, 0, TBL(1)|6, TBL(2)|0, TBL(3)|111, 0, + /* 2028 */ 0, 0, 0, 0, 0, 0, 0, TBL(1)|52, +@@ -1201,12 +1207,12 @@ static const uint16_t UNWIF_compat_00_20 [256] = { + /* 2058 */ 0, 0, 0, 0, 0, 0, 0, TBL(1)|52, + /* 2060 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2068 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 2070 */ TBL(1)|8, TBL(1)|1644, 0, 0, TBL(1)|12, TBL(1)|13, TBL(1)|14, TBL(1)|15, +-/* 2078 */ TBL(1)|16, TBL(1)|17, TBL(1)|3, TBL(1)|393, TBL(1)|21, TBL(1)|0, TBL(1)|1, TBL(1)|1649, ++/* 2070 */ TBL(1)|8, TBL(1)|1698, 0, 0, TBL(1)|12, TBL(1)|13, TBL(1)|14, TBL(1)|15, ++/* 2078 */ TBL(1)|16, TBL(1)|17, TBL(1)|3, TBL(1)|443, TBL(1)|21, TBL(1)|0, TBL(1)|1, TBL(1)|1703, + /* 2080 */ TBL(1)|8, TBL(1)|9, TBL(1)|10, TBL(1)|11, TBL(1)|12, TBL(1)|13, TBL(1)|14, TBL(1)|15, +-/* 2088 */ TBL(1)|16, TBL(1)|17, TBL(1)|3, TBL(1)|393, TBL(1)|21, TBL(1)|0, TBL(1)|1, 0, +-/* 2090 */ TBL(1)|1636, TBL(1)|1640, TBL(1)|1650, TBL(1)|1659, TBL(1)|84, TBL(1)|1643, TBL(1)|1646, TBL(1)|1647, +-/* 2098 */ TBL(1)|1648, TBL(1)|1649, TBL(1)|1651, TBL(1)|1654, TBL(1)|1655, 0, 0, 0, ++/* 2088 */ TBL(1)|16, TBL(1)|17, TBL(1)|3, TBL(1)|443, TBL(1)|21, TBL(1)|0, TBL(1)|1, 0, ++/* 2090 */ TBL(1)|1690, TBL(1)|1694, TBL(1)|1704, TBL(1)|1713, TBL(1)|93, TBL(1)|1697, TBL(1)|1700, TBL(1)|1701, ++/* 2098 */ TBL(1)|1702, TBL(1)|1703, TBL(1)|1705, TBL(1)|1708, TBL(1)|1709, 0, 0, 0, + /* 20a0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 20a8 */ TBL(2)|260, 0, 0, 0, 0, 0, 0, 0, + /* 20b0 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1222,22 +1228,22 @@ static const uint16_t UNWIF_compat_00_20 [256] = { + }; + + static const uint16_t UNWIF_compat_00_21 [256] = { +-/* 2100 */ TBL(3)|551, TBL(3)|552, TBL(1)|27, TBL(2)|357, 0, TBL(3)|567, TBL(3)|568, TBL(1)|75, +-/* 2108 */ 0, TBL(2)|358, TBL(1)|1642, TBL(1)|32, TBL(1)|32, TBL(1)|32, TBL(1)|1643, TBL(1)|70, +-/* 2110 */ TBL(1)|33, TBL(1)|33, TBL(1)|36, TBL(1)|1647, 0, TBL(1)|38, TBL(2)|230, 0, ++/* 2100 */ TBL(3)|551, TBL(3)|552, TBL(1)|27, TBL(2)|357, 0, TBL(3)|567, TBL(3)|568, TBL(1)|77, ++/* 2108 */ 0, TBL(2)|358, TBL(1)|1696, TBL(1)|32, TBL(1)|32, TBL(1)|32, TBL(1)|1697, TBL(1)|72, ++/* 2110 */ TBL(1)|33, TBL(1)|33, TBL(1)|36, TBL(1)|1701, 0, TBL(1)|38, TBL(2)|230, 0, + /* 2118 */ 0, TBL(1)|40, TBL(1)|41, TBL(1)|42, TBL(1)|42, TBL(1)|42, 0, 0, +-/* 2120 */ TBL(2)|262, TBL(3)|243, TBL(2)|272, 0, TBL(1)|50, 0, TBL(1)|148, 0, +-/* 2128 */ TBL(1)|50, 0, TBL(1)|35, TBL(2)|107, TBL(1)|26, TBL(1)|27, 0, TBL(1)|1640, +-/* 2130 */ TBL(1)|29, TBL(1)|30, 0, TBL(1)|37, TBL(1)|1650, TBL(1)|179, TBL(1)|180, TBL(1)|181, +-/* 2138 */ TBL(1)|182, TBL(1)|1644, 0, TBL(3)|209, TBL(1)|164, TBL(1)|151, TBL(1)|127, TBL(1)|140, +-/* 2140 */ TBL(1)|392, 0, 0, 0, 0, TBL(1)|28, TBL(1)|1639, TBL(1)|1640, +-/* 2148 */ TBL(1)|1644, TBL(1)|1645, 0, 0, 0, 0, 0, 0, ++/* 2120 */ TBL(2)|262, TBL(3)|243, TBL(2)|272, 0, TBL(1)|50, 0, TBL(1)|191, 0, ++/* 2128 */ TBL(1)|50, 0, TBL(1)|35, TBL(2)|107, TBL(1)|26, TBL(1)|27, 0, TBL(1)|1694, ++/* 2130 */ TBL(1)|29, TBL(1)|30, 0, TBL(1)|37, TBL(1)|1704, TBL(1)|222, TBL(1)|223, TBL(1)|224, ++/* 2138 */ TBL(1)|225, TBL(1)|1698, 0, TBL(3)|209, TBL(1)|207, TBL(1)|194, TBL(1)|170, TBL(1)|183, ++/* 2140 */ TBL(1)|442, 0, 0, 0, 0, TBL(1)|28, TBL(1)|1693, TBL(1)|1694, ++/* 2148 */ TBL(1)|1698, TBL(1)|1699, 0, 0, 0, 0, 0, 0, + /* 2150 */ TBL(3)|151, TBL(3)|153, TBL(4)|26, TBL(3)|147, TBL(3)|170, TBL(3)|149, TBL(3)|171, TBL(3)|175, + /* 2158 */ TBL(3)|177, TBL(3)|150, TBL(3)|178, TBL(3)|152, TBL(3)|176, TBL(3)|179, TBL(3)|180, TBL(2)|16, + /* 2160 */ TBL(1)|33, TBL(2)|171, TBL(3)|212, TBL(2)|174, TBL(1)|46, TBL(2)|299, TBL(3)|256, TBL(4)|28, + /* 2168 */ TBL(2)|175, TBL(1)|48, TBL(2)|311, TBL(3)|258, TBL(1)|36, TBL(1)|27, TBL(1)|28, TBL(1)|37, +-/* 2170 */ TBL(1)|1644, TBL(2)|1035, TBL(3)|590, TBL(2)|1038, TBL(1)|1657, TBL(2)|1166, TBL(3)|636, TBL(4)|108, +-/* 2178 */ TBL(2)|1039, TBL(1)|1659, TBL(2)|1176, TBL(3)|637, TBL(1)|1647, TBL(1)|1638, TBL(1)|1639, TBL(1)|1648, ++/* 2170 */ TBL(1)|1698, TBL(2)|1035, TBL(3)|590, TBL(2)|1038, TBL(1)|1711, TBL(2)|1166, TBL(3)|636, TBL(4)|108, ++/* 2178 */ TBL(2)|1039, TBL(1)|1713, TBL(2)|1176, TBL(3)|637, TBL(1)|1701, TBL(1)|1692, TBL(1)|1693, TBL(1)|1702, + /* 2180 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2188 */ 0, TBL(3)|112, 0, 0, 0, 0, 0, 0, + /* 2190 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1297,7 +1303,7 @@ static const uint16_t UNWIF_compat_00_23 [256] = { + /* 2310 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2318 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2320 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 2328 */ 0, TBL(1)|495, TBL(1)|496, 0, 0, 0, 0, 0, ++/* 2328 */ 0, TBL(1)|546, TBL(1)|547, 0, 0, 0, 0, 0, + /* 2330 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2338 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2340 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1353,10 +1359,10 @@ static const uint16_t UNWIF_compat_00_24 [256] = { + /* 24b8 */ TBL(1)|27, TBL(1)|28, TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, TBL(1)|33, TBL(1)|34, + /* 24c0 */ TBL(1)|35, TBL(1)|36, TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, TBL(1)|41, TBL(1)|42, + /* 24c8 */ TBL(1)|43, TBL(1)|44, TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, +-/* 24d0 */ TBL(1)|1636, TBL(1)|1637, TBL(1)|1638, TBL(1)|1639, TBL(1)|1640, TBL(1)|1641, TBL(1)|1642, TBL(1)|1643, +-/* 24d8 */ TBL(1)|1644, TBL(1)|1645, TBL(1)|1646, TBL(1)|1647, TBL(1)|1648, TBL(1)|1649, TBL(1)|1650, TBL(1)|1651, +-/* 24e0 */ TBL(1)|1652, TBL(1)|1653, TBL(1)|1654, TBL(1)|1655, TBL(1)|1656, TBL(1)|1657, TBL(1)|1658, TBL(1)|1659, +-/* 24e8 */ TBL(1)|1660, TBL(1)|1661, TBL(1)|8, 0, 0, 0, 0, 0, ++/* 24d0 */ TBL(1)|1690, TBL(1)|1691, TBL(1)|1692, TBL(1)|1693, TBL(1)|1694, TBL(1)|1695, TBL(1)|1696, TBL(1)|1697, ++/* 24d8 */ TBL(1)|1698, TBL(1)|1699, TBL(1)|1700, TBL(1)|1701, TBL(1)|1702, TBL(1)|1703, TBL(1)|1704, TBL(1)|1705, ++/* 24e0 */ TBL(1)|1706, TBL(1)|1707, TBL(1)|1708, TBL(1)|1709, TBL(1)|1710, TBL(1)|1711, TBL(1)|1712, TBL(1)|1713, ++/* 24e8 */ TBL(1)|1714, TBL(1)|1715, TBL(1)|8, 0, 0, 0, 0, 0, + /* 24f0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 24f8 */ 0, 0, 0, 0, 0, 0, 0, 0 + }; +@@ -1412,7 +1418,7 @@ static const uint16_t UNWIF_compat_00_2c [256] = { + /* 2c60 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2c68 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2c70 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 2c78 */ 0, 0, 0, 0, TBL(1)|1645, TBL(1)|46, 0, 0, ++/* 2c78 */ 0, 0, 0, 0, TBL(1)|1699, TBL(1)|46, 0, 0, + /* 2c80 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2c88 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2c90 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1445,7 +1451,7 @@ static const uint16_t UNWIF_compat_00_2d [256] = { + /* 2d50 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2d58 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2d60 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 2d68 */ 0, 0, 0, 0, 0, 0, 0, TBL(1)|492, ++/* 2d68 */ 0, 0, 0, 0, 0, 0, 0, TBL(1)|543, + /* 2d70 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2d78 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2d80 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1486,7 +1492,7 @@ static const uint16_t UNWIF_compat_00_2e [256] = { + /* 2e80 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2e88 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2e90 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 2e98 */ 0, 0, 0, 0, 0, 0, 0, TBL(1)|1087, ++/* 2e98 */ 0, 0, 0, 0, 0, 0, 0, TBL(1)|1138, + /* 2ea0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2ea8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2eb0 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1497,38 +1503,38 @@ static const uint16_t UNWIF_compat_00_2e [256] = { + /* 2ed8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2ee0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2ee8 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 2ef0 */ 0, 0, 0, TBL(1)|1626, 0, 0, 0, 0, ++/* 2ef0 */ 0, 0, 0, TBL(1)|1677, 0, 0, 0, 0, + /* 2ef8 */ 0, 0, 0, 0, 0, 0, 0, 0 + }; + + static const uint16_t UNWIF_compat_00_2f [256] = { +-/* 2f00 */ TBL(1)|638, TBL(1)|647, TBL(1)|650, TBL(1)|654, TBL(1)|656, TBL(1)|659, TBL(1)|661, TBL(1)|663, +-/* 2f08 */ TBL(1)|666, TBL(1)|687, TBL(1)|693, TBL(1)|697, TBL(1)|701, TBL(1)|705, TBL(1)|709, TBL(1)|717, +-/* 2f10 */ TBL(1)|718, TBL(1)|719, TBL(1)|732, TBL(1)|742, TBL(1)|746, TBL(1)|748, TBL(1)|749, TBL(1)|752, +-/* 2f18 */ TBL(1)|759, TBL(1)|760, TBL(1)|766, TBL(1)|767, TBL(1)|769, TBL(1)|773, TBL(1)|812, TBL(1)|817, +-/* 2f20 */ TBL(1)|833, TBL(1)|838, TBL(1)|840, TBL(1)|841, TBL(1)|845, TBL(1)|852, TBL(1)|863, TBL(1)|866, +-/* 2f28 */ TBL(1)|874, TBL(1)|877, TBL(1)|878, TBL(1)|879, TBL(1)|885, TBL(1)|886, TBL(1)|897, TBL(1)|900, +-/* 2f30 */ TBL(1)|902, TBL(1)|904, TBL(1)|908, TBL(1)|910, TBL(1)|912, TBL(1)|923, TBL(1)|924, TBL(1)|926, +-/* 2f38 */ TBL(1)|927, TBL(1)|929, TBL(1)|931, TBL(1)|935, TBL(1)|942, TBL(1)|972, TBL(1)|977, TBL(1)|978, +-/* 2f40 */ TBL(1)|1010, TBL(1)|1011, TBL(1)|1016, TBL(1)|1017, TBL(1)|1019, TBL(1)|1021, TBL(1)|1023, TBL(1)|1026, +-/* 2f48 */ TBL(1)|1036, TBL(1)|1040, TBL(1)|1045, TBL(1)|1073, TBL(1)|1076, TBL(1)|1080, TBL(1)|1083, TBL(1)|1086, +-/* 2f50 */ TBL(1)|1088, TBL(1)|1089, TBL(1)|1090, TBL(1)|1091, TBL(1)|1092, TBL(1)|1138, TBL(1)|1156, TBL(1)|1159, +-/* 2f58 */ TBL(1)|1160, TBL(1)|1161, TBL(1)|1162, TBL(1)|1164, TBL(1)|1165, TBL(1)|1170, TBL(1)|1177, TBL(1)|1179, +-/* 2f60 */ TBL(1)|1195, TBL(1)|1196, TBL(1)|1198, TBL(1)|1199, TBL(1)|1201, TBL(1)|1202, TBL(1)|1211, TBL(1)|1212, +-/* 2f68 */ TBL(1)|1219, TBL(1)|1220, TBL(1)|1221, TBL(1)|1222, TBL(1)|1227, TBL(1)|1236, TBL(1)|1237, TBL(1)|1238, +-/* 2f70 */ TBL(1)|1247, TBL(1)|1263, TBL(1)|1264, TBL(1)|1272, TBL(1)|1276, TBL(1)|1278, TBL(1)|1286, TBL(1)|1295, +-/* 2f78 */ TBL(1)|1312, TBL(1)|1314, TBL(1)|1319, TBL(1)|1322, TBL(1)|1324, TBL(1)|1326, TBL(1)|1327, TBL(1)|1328, +-/* 2f80 */ TBL(1)|1334, TBL(1)|1335, TBL(1)|1342, TBL(1)|1344, TBL(1)|1346, TBL(1)|1347, TBL(1)|1350, TBL(1)|1352, +-/* 2f88 */ TBL(1)|1353, TBL(1)|1354, TBL(1)|1356, TBL(1)|1357, TBL(1)|1397, TBL(1)|1402, TBL(1)|1415, TBL(1)|1416, +-/* 2f90 */ TBL(1)|1418, TBL(1)|1429, TBL(1)|1431, TBL(1)|1433, TBL(1)|1435, TBL(1)|1450, TBL(1)|1451, TBL(1)|1453, +-/* 2f98 */ TBL(1)|1454, TBL(1)|1455, TBL(1)|1466, TBL(1)|1467, TBL(1)|1469, TBL(1)|1474, TBL(1)|1475, TBL(1)|1482, +-/* 2fa0 */ TBL(1)|1484, TBL(1)|1485, TBL(1)|1494, TBL(1)|1502, TBL(1)|1507, TBL(1)|1508, TBL(1)|1510, TBL(1)|1521, +-/* 2fa8 */ TBL(1)|1522, TBL(1)|1526, TBL(1)|1535, TBL(1)|1538, TBL(1)|1542, TBL(1)|1548, TBL(1)|1550, TBL(1)|1551, +-/* 2fb0 */ TBL(1)|1552, TBL(1)|1553, TBL(1)|1556, TBL(1)|1557, TBL(1)|1559, TBL(1)|1566, TBL(1)|1567, TBL(1)|1568, +-/* 2fb8 */ TBL(1)|1574, TBL(1)|1575, TBL(1)|1577, TBL(1)|1582, TBL(1)|1583, TBL(1)|1584, TBL(1)|1586, TBL(1)|1587, +-/* 2fc0 */ TBL(1)|1588, TBL(1)|1589, TBL(1)|1590, TBL(1)|1594, TBL(1)|1600, TBL(1)|1601, TBL(1)|1604, TBL(1)|1605, +-/* 2fc8 */ TBL(1)|1606, TBL(1)|1607, TBL(1)|1609, TBL(1)|1610, TBL(1)|1611, TBL(1)|1614, TBL(1)|1616, TBL(1)|1618, +-/* 2fd0 */ TBL(1)|1619, TBL(1)|1621, TBL(1)|1622, TBL(1)|1623, TBL(1)|1625, TBL(1)|1627, 0, 0, ++/* 2f00 */ TBL(1)|689, TBL(1)|698, TBL(1)|701, TBL(1)|705, TBL(1)|707, TBL(1)|710, TBL(1)|712, TBL(1)|714, ++/* 2f08 */ TBL(1)|717, TBL(1)|738, TBL(1)|744, TBL(1)|748, TBL(1)|752, TBL(1)|756, TBL(1)|760, TBL(1)|768, ++/* 2f10 */ TBL(1)|769, TBL(1)|770, TBL(1)|783, TBL(1)|793, TBL(1)|797, TBL(1)|799, TBL(1)|800, TBL(1)|803, ++/* 2f18 */ TBL(1)|810, TBL(1)|811, TBL(1)|817, TBL(1)|818, TBL(1)|820, TBL(1)|824, TBL(1)|863, TBL(1)|868, ++/* 2f20 */ TBL(1)|884, TBL(1)|889, TBL(1)|891, TBL(1)|892, TBL(1)|896, TBL(1)|903, TBL(1)|914, TBL(1)|917, ++/* 2f28 */ TBL(1)|925, TBL(1)|928, TBL(1)|929, TBL(1)|930, TBL(1)|936, TBL(1)|937, TBL(1)|948, TBL(1)|951, ++/* 2f30 */ TBL(1)|953, TBL(1)|955, TBL(1)|959, TBL(1)|961, TBL(1)|963, TBL(1)|974, TBL(1)|975, TBL(1)|977, ++/* 2f38 */ TBL(1)|978, TBL(1)|980, TBL(1)|982, TBL(1)|986, TBL(1)|993, TBL(1)|1023, TBL(1)|1028, TBL(1)|1029, ++/* 2f40 */ TBL(1)|1061, TBL(1)|1062, TBL(1)|1067, TBL(1)|1068, TBL(1)|1070, TBL(1)|1072, TBL(1)|1074, TBL(1)|1077, ++/* 2f48 */ TBL(1)|1087, TBL(1)|1091, TBL(1)|1096, TBL(1)|1124, TBL(1)|1127, TBL(1)|1131, TBL(1)|1134, TBL(1)|1137, ++/* 2f50 */ TBL(1)|1139, TBL(1)|1140, TBL(1)|1141, TBL(1)|1142, TBL(1)|1143, TBL(1)|1189, TBL(1)|1207, TBL(1)|1210, ++/* 2f58 */ TBL(1)|1211, TBL(1)|1212, TBL(1)|1213, TBL(1)|1215, TBL(1)|1216, TBL(1)|1221, TBL(1)|1228, TBL(1)|1230, ++/* 2f60 */ TBL(1)|1246, TBL(1)|1247, TBL(1)|1249, TBL(1)|1250, TBL(1)|1252, TBL(1)|1253, TBL(1)|1262, TBL(1)|1263, ++/* 2f68 */ TBL(1)|1270, TBL(1)|1271, TBL(1)|1272, TBL(1)|1273, TBL(1)|1278, TBL(1)|1287, TBL(1)|1288, TBL(1)|1289, ++/* 2f70 */ TBL(1)|1298, TBL(1)|1314, TBL(1)|1315, TBL(1)|1323, TBL(1)|1327, TBL(1)|1329, TBL(1)|1337, TBL(1)|1346, ++/* 2f78 */ TBL(1)|1363, TBL(1)|1365, TBL(1)|1370, TBL(1)|1373, TBL(1)|1375, TBL(1)|1377, TBL(1)|1378, TBL(1)|1379, ++/* 2f80 */ TBL(1)|1385, TBL(1)|1386, TBL(1)|1393, TBL(1)|1395, TBL(1)|1397, TBL(1)|1398, TBL(1)|1401, TBL(1)|1403, ++/* 2f88 */ TBL(1)|1404, TBL(1)|1405, TBL(1)|1407, TBL(1)|1408, TBL(1)|1448, TBL(1)|1453, TBL(1)|1466, TBL(1)|1467, ++/* 2f90 */ TBL(1)|1469, TBL(1)|1480, TBL(1)|1482, TBL(1)|1484, TBL(1)|1486, TBL(1)|1501, TBL(1)|1502, TBL(1)|1504, ++/* 2f98 */ TBL(1)|1505, TBL(1)|1506, TBL(1)|1517, TBL(1)|1518, TBL(1)|1520, TBL(1)|1525, TBL(1)|1526, TBL(1)|1533, ++/* 2fa0 */ TBL(1)|1535, TBL(1)|1536, TBL(1)|1545, TBL(1)|1553, TBL(1)|1558, TBL(1)|1559, TBL(1)|1561, TBL(1)|1572, ++/* 2fa8 */ TBL(1)|1573, TBL(1)|1577, TBL(1)|1586, TBL(1)|1589, TBL(1)|1593, TBL(1)|1599, TBL(1)|1601, TBL(1)|1602, ++/* 2fb0 */ TBL(1)|1603, TBL(1)|1604, TBL(1)|1607, TBL(1)|1608, TBL(1)|1610, TBL(1)|1617, TBL(1)|1618, TBL(1)|1619, ++/* 2fb8 */ TBL(1)|1625, TBL(1)|1626, TBL(1)|1628, TBL(1)|1633, TBL(1)|1634, TBL(1)|1635, TBL(1)|1637, TBL(1)|1638, ++/* 2fc0 */ TBL(1)|1639, TBL(1)|1640, TBL(1)|1641, TBL(1)|1645, TBL(1)|1651, TBL(1)|1652, TBL(1)|1655, TBL(1)|1656, ++/* 2fc8 */ TBL(1)|1657, TBL(1)|1658, TBL(1)|1660, TBL(1)|1661, TBL(1)|1662, TBL(1)|1665, TBL(1)|1667, TBL(1)|1669, ++/* 2fd0 */ TBL(1)|1670, TBL(1)|1672, TBL(1)|1673, TBL(1)|1674, TBL(1)|1676, TBL(1)|1678, 0, 0, + /* 2fd8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2fe0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 2fe8 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1543,8 +1549,8 @@ static const uint16_t UNWIF_compat_00_30 [256] = { + /* 3018 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 3020 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 3028 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 3030 */ 0, 0, 0, 0, 0, 0, TBL(1)|505, 0, +-/* 3038 */ TBL(1)|752, TBL(1)|753, TBL(1)|754, 0, 0, 0, 0, 0, ++/* 3030 */ 0, 0, 0, 0, 0, 0, TBL(1)|556, 0, ++/* 3038 */ TBL(1)|803, TBL(1)|804, TBL(1)|805, 0, 0, 0, 0, 0, + /* 3040 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 3048 */ 0, 0, 0, 0, TBL(2)|870, 0, TBL(2)|871, 0, + /* 3050 */ TBL(2)|872, 0, TBL(2)|873, 0, TBL(2)|874, 0, TBL(2)|875, 0, +@@ -1578,20 +1584,20 @@ static const uint16_t UNWIF_compat_00_31 [256] = { + /* 3118 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 3120 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 3128 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 3130 */ 0, TBL(1)|263, TBL(1)|264, TBL(1)|337, TBL(1)|265, TBL(1)|338, TBL(1)|339, TBL(1)|266, +-/* 3138 */ TBL(1)|267, TBL(1)|268, TBL(1)|340, TBL(1)|341, TBL(1)|342, TBL(1)|343, TBL(1)|344, TBL(1)|345, +-/* 3140 */ TBL(1)|284, TBL(1)|269, TBL(1)|270, TBL(1)|271, TBL(1)|289, TBL(1)|272, TBL(1)|273, TBL(1)|274, +-/* 3148 */ TBL(1)|275, TBL(1)|276, TBL(1)|277, TBL(1)|278, TBL(1)|279, TBL(1)|280, TBL(1)|281, TBL(1)|308, +-/* 3150 */ TBL(1)|309, TBL(1)|310, TBL(1)|311, TBL(1)|312, TBL(1)|313, TBL(1)|314, TBL(1)|315, TBL(1)|316, +-/* 3158 */ TBL(1)|317, TBL(1)|318, TBL(1)|319, TBL(1)|320, TBL(1)|321, TBL(1)|322, TBL(1)|323, TBL(1)|324, +-/* 3160 */ TBL(1)|325, TBL(1)|326, TBL(1)|327, TBL(1)|328, TBL(1)|307, TBL(1)|282, TBL(1)|283, TBL(1)|346, +-/* 3168 */ TBL(1)|347, TBL(1)|348, TBL(1)|349, TBL(1)|350, TBL(1)|351, TBL(1)|352, TBL(1)|285, TBL(1)|353, +-/* 3170 */ TBL(1)|354, TBL(1)|286, TBL(1)|287, TBL(1)|288, TBL(1)|290, TBL(1)|291, TBL(1)|292, TBL(1)|293, +-/* 3178 */ TBL(1)|294, TBL(1)|295, TBL(1)|296, TBL(1)|297, TBL(1)|298, TBL(1)|299, TBL(1)|300, TBL(1)|301, +-/* 3180 */ TBL(1)|302, TBL(1)|303, TBL(1)|355, TBL(1)|356, TBL(1)|304, TBL(1)|305, TBL(1)|306, TBL(1)|329, +-/* 3188 */ TBL(1)|330, TBL(1)|331, TBL(1)|332, TBL(1)|333, TBL(1)|334, TBL(1)|335, TBL(1)|336, 0, +-/* 3190 */ 0, 0, TBL(1)|638, TBL(1)|661, TBL(1)|641, TBL(1)|813, TBL(1)|642, TBL(1)|648, +-/* 3198 */ TBL(1)|643, TBL(1)|1203, TBL(1)|656, TBL(1)|645, TBL(1)|639, TBL(1)|846, TBL(1)|818, TBL(1)|666, ++/* 3130 */ 0, TBL(1)|306, TBL(1)|307, TBL(1)|380, TBL(1)|308, TBL(1)|381, TBL(1)|382, TBL(1)|309, ++/* 3138 */ TBL(1)|310, TBL(1)|311, TBL(1)|383, TBL(1)|384, TBL(1)|385, TBL(1)|386, TBL(1)|387, TBL(1)|388, ++/* 3140 */ TBL(1)|327, TBL(1)|312, TBL(1)|313, TBL(1)|314, TBL(1)|332, TBL(1)|315, TBL(1)|316, TBL(1)|317, ++/* 3148 */ TBL(1)|318, TBL(1)|319, TBL(1)|320, TBL(1)|321, TBL(1)|322, TBL(1)|323, TBL(1)|324, TBL(1)|351, ++/* 3150 */ TBL(1)|352, TBL(1)|353, TBL(1)|354, TBL(1)|355, TBL(1)|356, TBL(1)|357, TBL(1)|358, TBL(1)|359, ++/* 3158 */ TBL(1)|360, TBL(1)|361, TBL(1)|362, TBL(1)|363, TBL(1)|364, TBL(1)|365, TBL(1)|366, TBL(1)|367, ++/* 3160 */ TBL(1)|368, TBL(1)|369, TBL(1)|370, TBL(1)|371, TBL(1)|350, TBL(1)|325, TBL(1)|326, TBL(1)|389, ++/* 3168 */ TBL(1)|390, TBL(1)|391, TBL(1)|392, TBL(1)|393, TBL(1)|394, TBL(1)|395, TBL(1)|328, TBL(1)|396, ++/* 3170 */ TBL(1)|397, TBL(1)|329, TBL(1)|330, TBL(1)|331, TBL(1)|333, TBL(1)|334, TBL(1)|335, TBL(1)|336, ++/* 3178 */ TBL(1)|337, TBL(1)|338, TBL(1)|339, TBL(1)|340, TBL(1)|341, TBL(1)|342, TBL(1)|343, TBL(1)|344, ++/* 3180 */ TBL(1)|345, TBL(1)|346, TBL(1)|398, TBL(1)|399, TBL(1)|347, TBL(1)|348, TBL(1)|349, TBL(1)|372, ++/* 3188 */ TBL(1)|373, TBL(1)|374, TBL(1)|375, TBL(1)|376, TBL(1)|377, TBL(1)|378, TBL(1)|379, 0, ++/* 3190 */ 0, 0, TBL(1)|689, TBL(1)|712, TBL(1)|692, TBL(1)|864, TBL(1)|693, TBL(1)|699, ++/* 3198 */ TBL(1)|694, TBL(1)|1254, TBL(1)|707, TBL(1)|696, TBL(1)|690, TBL(1)|897, TBL(1)|869, TBL(1)|717, + /* 31a0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 31a8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 31b0 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1615,30 +1621,30 @@ static const uint16_t UNWIF_compat_00_32 [256] = { + /* 3228 */ TBL(3)|52, TBL(3)|61, TBL(3)|69, TBL(3)|74, TBL(3)|73, TBL(3)|71, TBL(3)|84, TBL(3)|66, + /* 3230 */ TBL(3)|68, TBL(3)|72, TBL(3)|70, TBL(3)|77, TBL(3)|63, TBL(3)|75, TBL(3)|82, TBL(3)|78, + /* 3238 */ TBL(3)|60, TBL(3)|55, TBL(3)|64, TBL(3)|67, TBL(3)|76, TBL(3)|56, TBL(3)|83, TBL(3)|62, +-/* 3240 */ TBL(3)|79, TBL(3)|57, TBL(3)|80, TBL(3)|81, TBL(1)|794, TBL(1)|911, TBL(1)|1016, TBL(1)|1280, ++/* 3240 */ TBL(3)|79, TBL(3)|57, TBL(3)|80, TBL(3)|81, TBL(1)|845, TBL(1)|962, TBL(1)|1067, TBL(1)|1331, + /* 3248 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 3250 */ TBL(3)|238, TBL(2)|23, TBL(2)|24, TBL(2)|25, TBL(2)|26, TBL(2)|27, TBL(2)|28, TBL(2)|29, + /* 3258 */ TBL(2)|30, TBL(2)|31, TBL(2)|37, TBL(2)|38, TBL(2)|39, TBL(2)|40, TBL(2)|41, TBL(2)|42, +-/* 3260 */ TBL(1)|263, TBL(1)|265, TBL(1)|266, TBL(1)|268, TBL(1)|269, TBL(1)|270, TBL(1)|272, TBL(1)|274, +-/* 3268 */ TBL(1)|275, TBL(1)|277, TBL(1)|278, TBL(1)|279, TBL(1)|280, TBL(1)|281, TBL(2)|780, TBL(2)|781, ++/* 3260 */ TBL(1)|306, TBL(1)|308, TBL(1)|309, TBL(1)|311, TBL(1)|312, TBL(1)|313, TBL(1)|315, TBL(1)|317, ++/* 3268 */ TBL(1)|318, TBL(1)|320, TBL(1)|321, TBL(1)|322, TBL(1)|323, TBL(1)|324, TBL(2)|780, TBL(2)|781, + /* 3270 */ TBL(2)|782, TBL(2)|783, TBL(2)|784, TBL(2)|785, TBL(2)|786, TBL(2)|790, TBL(2)|792, TBL(2)|793, + /* 3278 */ TBL(2)|794, TBL(2)|795, TBL(2)|796, TBL(2)|797, TBL(5)|0, TBL(4)|73, TBL(2)|791, 0, +-/* 3280 */ TBL(1)|638, TBL(1)|661, TBL(1)|641, TBL(1)|813, TBL(1)|662, TBL(1)|698, TBL(1)|640, TBL(1)|697, +-/* 3288 */ TBL(1)|657, TBL(1)|752, TBL(1)|1040, TBL(1)|1138, TBL(1)|1092, TBL(1)|1045, TBL(1)|1510, TBL(1)|817, +-/* 3290 */ TBL(1)|1026, TBL(1)|1057, TBL(1)|1041, TBL(1)|1249, TBL(1)|781, TBL(1)|1167, TBL(1)|1456, TBL(1)|1254, +-/* 3298 */ TBL(1)|735, TBL(1)|1266, TBL(1)|1205, TBL(1)|852, TBL(1)|1490, TBL(1)|686, TBL(1)|761, TBL(1)|1100, +-/* 32a0 */ TBL(1)|1560, TBL(1)|671, TBL(1)|707, TBL(1)|1077, TBL(1)|642, TBL(1)|648, TBL(1)|643, TBL(1)|901, +-/* 32a8 */ TBL(1)|778, TBL(1)|750, TBL(1)|868, TBL(1)|865, TBL(1)|1225, TBL(1)|670, TBL(1)|1461, TBL(1)|757, +-/* 32b0 */ TBL(1)|843, TBL(2)|43, TBL(2)|44, TBL(2)|45, TBL(2)|46, TBL(2)|52, TBL(2)|53, TBL(2)|54, ++/* 3280 */ TBL(1)|689, TBL(1)|712, TBL(1)|692, TBL(1)|864, TBL(1)|713, TBL(1)|749, TBL(1)|691, TBL(1)|748, ++/* 3288 */ TBL(1)|708, TBL(1)|803, TBL(1)|1091, TBL(1)|1189, TBL(1)|1143, TBL(1)|1096, TBL(1)|1561, TBL(1)|868, ++/* 3290 */ TBL(1)|1077, TBL(1)|1108, TBL(1)|1092, TBL(1)|1300, TBL(1)|832, TBL(1)|1218, TBL(1)|1507, TBL(1)|1305, ++/* 3298 */ TBL(1)|786, TBL(1)|1317, TBL(1)|1256, TBL(1)|903, TBL(1)|1541, TBL(1)|737, TBL(1)|812, TBL(1)|1151, ++/* 32a0 */ TBL(1)|1611, TBL(1)|722, TBL(1)|758, TBL(1)|1128, TBL(1)|693, TBL(1)|699, TBL(1)|694, TBL(1)|952, ++/* 32a8 */ TBL(1)|829, TBL(1)|801, TBL(1)|919, TBL(1)|916, TBL(1)|1276, TBL(1)|721, TBL(1)|1512, TBL(1)|808, ++/* 32b0 */ TBL(1)|894, TBL(2)|43, TBL(2)|44, TBL(2)|45, TBL(2)|46, TBL(2)|52, TBL(2)|53, TBL(2)|54, + /* 32b8 */ TBL(2)|55, TBL(2)|56, TBL(2)|57, TBL(2)|58, TBL(2)|59, TBL(2)|60, TBL(2)|61, TBL(2)|67, + /* 32c0 */ TBL(2)|18, TBL(2)|33, TBL(2)|48, TBL(2)|63, TBL(2)|69, TBL(2)|74, TBL(2)|79, TBL(2)|84, + /* 32c8 */ TBL(2)|89, TBL(3)|115, TBL(3)|119, TBL(3)|123, TBL(2)|169, TBL(3)|584, TBL(2)|982, TBL(3)|214, +-/* 32d0 */ TBL(1)|513, TBL(1)|515, TBL(1)|517, TBL(1)|519, TBL(1)|521, TBL(1)|522, TBL(1)|523, TBL(1)|524, +-/* 32d8 */ TBL(1)|525, TBL(1)|526, TBL(1)|527, TBL(1)|528, TBL(1)|529, TBL(1)|530, TBL(1)|531, TBL(1)|532, +-/* 32e0 */ TBL(1)|533, TBL(1)|535, TBL(1)|536, TBL(1)|537, TBL(1)|538, TBL(1)|539, TBL(1)|540, TBL(1)|541, +-/* 32e8 */ TBL(1)|542, TBL(1)|543, TBL(1)|544, TBL(1)|545, TBL(1)|546, TBL(1)|547, TBL(1)|548, TBL(1)|549, +-/* 32f0 */ TBL(1)|550, TBL(1)|551, TBL(1)|552, TBL(1)|554, TBL(1)|556, TBL(1)|558, TBL(1)|559, TBL(1)|560, +-/* 32f8 */ TBL(1)|561, TBL(1)|562, TBL(1)|563, TBL(1)|564, TBL(1)|565, TBL(1)|566, TBL(1)|567, TBL(2)|938 ++/* 32d0 */ TBL(1)|564, TBL(1)|566, TBL(1)|568, TBL(1)|570, TBL(1)|572, TBL(1)|573, TBL(1)|574, TBL(1)|575, ++/* 32d8 */ TBL(1)|576, TBL(1)|577, TBL(1)|578, TBL(1)|579, TBL(1)|580, TBL(1)|581, TBL(1)|582, TBL(1)|583, ++/* 32e0 */ TBL(1)|584, TBL(1)|586, TBL(1)|587, TBL(1)|588, TBL(1)|589, TBL(1)|590, TBL(1)|591, TBL(1)|592, ++/* 32e8 */ TBL(1)|593, TBL(1)|594, TBL(1)|595, TBL(1)|596, TBL(1)|597, TBL(1)|598, TBL(1)|599, TBL(1)|600, ++/* 32f0 */ TBL(1)|601, TBL(1)|602, TBL(1)|603, TBL(1)|605, TBL(1)|607, TBL(1)|609, TBL(1)|610, TBL(1)|611, ++/* 32f8 */ TBL(1)|612, TBL(1)|613, TBL(1)|614, TBL(1)|615, TBL(1)|616, TBL(1)|617, TBL(1)|618, TBL(2)|938 + }; + + static const uint16_t UNWIF_compat_00_33 [256] = { +@@ -1696,7 +1702,7 @@ static const uint16_t UNWIF_compat_00_a6 [256] = { + /* a680 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* a688 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* a690 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* a698 */ 0, 0, 0, 0, TBL(1)|177, TBL(1)|178, 0, 0, ++/* a698 */ 0, 0, 0, 0, TBL(1)|220, TBL(1)|221, 0, 0, + /* a6a0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* a6a8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* a6b0 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1726,7 +1732,7 @@ static const uint16_t UNWIF_compat_00_a7 [256] = { + /* a758 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* a760 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* a768 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* a770 */ TBL(1)|1629, 0, 0, 0, 0, 0, 0, 0, ++/* a770 */ TBL(1)|1680, 0, 0, 0, 0, 0, 0, 0, + /* a778 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* a780 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* a788 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1742,8 +1748,8 @@ static const uint16_t UNWIF_compat_00_a7 [256] = { + /* a7d8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* a7e0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* a7e8 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* a7f0 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* a7f8 */ TBL(1)|69, TBL(1)|73, 0, 0, 0, 0, 0, 0 ++/* a7f0 */ 0, 0, TBL(1)|27, TBL(1)|30, TBL(1)|41, 0, 0, 0, ++/* a7f8 */ TBL(1)|71, TBL(1)|75, 0, 0, 0, 0, 0, 0 + }; + + static const uint16_t UNWIF_compat_00_ab [256] = { +@@ -1758,9 +1764,9 @@ static const uint16_t UNWIF_compat_00_ab [256] = { + /* ab40 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* ab48 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* ab50 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* ab58 */ 0, 0, 0, 0, TBL(1)|1628, TBL(1)|1630, TBL(1)|95, TBL(1)|1631, ++/* ab58 */ 0, 0, 0, 0, TBL(1)|1679, TBL(1)|1682, TBL(1)|109, TBL(1)|1683, + /* ab60 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* ab68 */ 0, TBL(1)|114, 0, 0, 0, 0, 0, 0, ++/* ab68 */ 0, TBL(1)|138, 0, 0, 0, 0, 0, 0, + /* ab70 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* ab78 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* ab80 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1782,69 +1788,69 @@ static const uint16_t UNWIF_compat_00_ab [256] = { + }; + + static const uint16_t UNWIF_compat_00_f9 [256] = { +-/* f900 */ TBL(1)|1452, TBL(1)|1037, TBL(1)|1475, TBL(1)|1462, TBL(1)|1124, TBL(1)|649, TBL(1)|774, TBL(1)|1625, +-/* f908 */ TBL(1)|1625, TBL(1)|849, TBL(1)|1510, TBL(1)|799, TBL(1)|848, TBL(1)|970, TBL(1)|1218, TBL(1)|1318, +-/* f910 */ TBL(1)|1396, TBL(1)|1411, TBL(1)|1424, TBL(1)|1493, TBL(1)|1067, TBL(1)|1102, TBL(1)|1145, TBL(1)|1183, +-/* f918 */ TBL(1)|1382, TBL(1)|1504, TBL(1)|1579, TBL(1)|658, TBL(1)|763, TBL(1)|1072, TBL(1)|1154, TBL(1)|1395, +-/* f920 */ TBL(1)|1599, TBL(1)|891, TBL(1)|1132, TBL(1)|1391, TBL(1)|1428, TBL(1)|983, TBL(1)|1341, TBL(1)|1414, +-/* f928 */ TBL(1)|918, TBL(1)|1042, TBL(1)|1108, TBL(1)|1173, TBL(1)|1496, TBL(1)|674, TBL(1)|712, TBL(1)|739, +-/* f930 */ TBL(1)|1009, TBL(1)|1070, TBL(1)|1153, TBL(1)|1226, TBL(1)|1324, TBL(1)|1393, TBL(1)|1399, TBL(1)|1472, +-/* f938 */ TBL(1)|1546, TBL(1)|1591, TBL(1)|1598, TBL(1)|1241, TBL(1)|1257, TBL(1)|1303, TBL(1)|1375, TBL(1)|1517, +-/* f940 */ TBL(1)|1601, TBL(1)|1441, TBL(1)|832, TBL(1)|925, TBL(1)|1285, TBL(1)|1333, TBL(1)|1166, TBL(1)|1243, +-/* f948 */ TBL(1)|1460, TBL(1)|1544, TBL(1)|831, TBL(1)|882, TBL(1)|1068, TBL(1)|1113, TBL(1)|1126, TBL(1)|1299, +-/* f950 */ TBL(1)|1309, TBL(1)|1528, TBL(1)|738, TBL(1)|1336, TBL(1)|715, TBL(1)|714, TBL(1)|1268, TBL(1)|1304, +-/* f958 */ TBL(1)|1381, TBL(1)|1530, TBL(1)|1448, TBL(1)|984, TBL(1)|1067, TBL(1)|1444, TBL(1)|652, TBL(1)|871, +-/* f960 */ TBL(1)|947, TBL(1)|1178, TBL(1)|1210, TBL(1)|747, TBL(1)|1245, TBL(1)|678, TBL(1)|940, TBL(1)|644, +-/* f968 */ TBL(1)|1097, TBL(1)|1015, TBL(1)|1298, TBL(1)|768, TBL(1)|827, TBL(1)|1229, TBL(1)|1383, TBL(1)|1437, +-/* f970 */ TBL(1)|1084, TBL(1)|1484, TBL(1)|1095, TBL(1)|988, TBL(1)|1365, TBL(1)|996, TBL(1)|1209, TBL(1)|665, +-/* f978 */ TBL(1)|696, TBL(1)|713, TBL(1)|1059, TBL(1)|1293, TBL(1)|1355, TBL(1)|1440, TBL(1)|1509, TBL(1)|741, +-/* f980 */ TBL(1)|786, TBL(1)|852, TBL(1)|922, TBL(1)|1022, TBL(1)|1133, TBL(1)|1246, TBL(1)|1524, TBL(1)|1581, +-/* f988 */ TBL(1)|1602, TBL(1)|1608, TBL(1)|732, TBL(1)|1035, TBL(1)|1079, TBL(1)|1481, TBL(1)|909, TBL(1)|964, +-/* f990 */ TBL(1)|971, TBL(1)|1007, TBL(1)|1129, TBL(1)|1148, TBL(1)|1192, TBL(1)|1265, TBL(1)|1306, TBL(1)|1331, +-/* f998 */ TBL(1)|1477, TBL(1)|1385, TBL(1)|1487, TBL(1)|1518, TBL(1)|722, TBL(1)|733, TBL(1)|791, TBL(1)|1144, +-/* f9a0 */ TBL(1)|1419, TBL(1)|1437, TBL(1)|917, TBL(1)|945, TBL(1)|994, TBL(1)|1082, TBL(1)|1284, TBL(1)|1175, +-/* f9a8 */ TBL(1)|669, TBL(1)|814, TBL(1)|871, TBL(1)|896, TBL(1)|948, TBL(1)|1182, TBL(1)|1189, TBL(1)|1321, +-/* f9b0 */ TBL(1)|1329, TBL(1)|1511, TBL(1)|1543, TBL(1)|1547, TBL(1)|1562, TBL(1)|675, TBL(1)|1262, TBL(1)|1506, +-/* f9b8 */ TBL(1)|1537, TBL(1)|954, TBL(1)|660, TBL(1)|684, TBL(1)|872, TBL(1)|880, TBL(1)|1018, TBL(1)|1067, +-/* f9c0 */ TBL(1)|1151, TBL(1)|1217, TBL(1)|1388, TBL(1)|1492, TBL(1)|1623, TBL(1)|1031, TBL(1)|1527, TBL(1)|731, +-/* f9c8 */ TBL(1)|1050, TBL(1)|1053, TBL(1)|1106, TBL(1)|1120, TBL(1)|1185, TBL(1)|1208, TBL(1)|1240, TBL(1)|1297, +-/* f9d0 */ TBL(1)|1565, TBL(1)|698, TBL(1)|975, TBL(1)|1531, TBL(1)|680, TBL(1)|889, TBL(1)|1114, TBL(1)|1478, +-/* f9d8 */ TBL(1)|936, TBL(1)|956, TBL(1)|1055, TBL(1)|1178, TBL(1)|1533, TBL(1)|724, TBL(1)|782, TBL(1)|884, +-/* f9e0 */ TBL(1)|1027, TBL(1)|1046, TBL(1)|1062, TBL(1)|1099, TBL(1)|1184, TBL(1)|1213, TBL(1)|1316, TBL(1)|1420, +-/* f9e8 */ TBL(1)|1423, TBL(1)|1508, TBL(1)|1540, TBL(1)|751, TBL(1)|1121, TBL(1)|783, TBL(1)|1152, TBL(1)|1193, +-/* f9f0 */ TBL(1)|1392, TBL(1)|1534, TBL(1)|1593, TBL(1)|1603, TBL(1)|1052, TBL(1)|1112, TBL(1)|1343, TBL(1)|1276, +-/* f9f8 */ TBL(1)|1279, TBL(1)|1288, TBL(1)|1172, TBL(1)|1142, TBL(1)|1447, TBL(1)|667, TBL(1)|1369, TBL(1)|725 ++/* f900 */ TBL(1)|1503, TBL(1)|1088, TBL(1)|1526, TBL(1)|1513, TBL(1)|1175, TBL(1)|700, TBL(1)|825, TBL(1)|1676, ++/* f908 */ TBL(1)|1676, TBL(1)|900, TBL(1)|1561, TBL(1)|850, TBL(1)|899, TBL(1)|1021, TBL(1)|1269, TBL(1)|1369, ++/* f910 */ TBL(1)|1447, TBL(1)|1462, TBL(1)|1475, TBL(1)|1544, TBL(1)|1118, TBL(1)|1153, TBL(1)|1196, TBL(1)|1234, ++/* f918 */ TBL(1)|1433, TBL(1)|1555, TBL(1)|1630, TBL(1)|709, TBL(1)|814, TBL(1)|1123, TBL(1)|1205, TBL(1)|1446, ++/* f920 */ TBL(1)|1650, TBL(1)|942, TBL(1)|1183, TBL(1)|1442, TBL(1)|1479, TBL(1)|1034, TBL(1)|1392, TBL(1)|1465, ++/* f928 */ TBL(1)|969, TBL(1)|1093, TBL(1)|1159, TBL(1)|1224, TBL(1)|1547, TBL(1)|725, TBL(1)|763, TBL(1)|790, ++/* f930 */ TBL(1)|1060, TBL(1)|1121, TBL(1)|1204, TBL(1)|1277, TBL(1)|1375, TBL(1)|1444, TBL(1)|1450, TBL(1)|1523, ++/* f938 */ TBL(1)|1597, TBL(1)|1642, TBL(1)|1649, TBL(1)|1292, TBL(1)|1308, TBL(1)|1354, TBL(1)|1426, TBL(1)|1568, ++/* f940 */ TBL(1)|1652, TBL(1)|1492, TBL(1)|883, TBL(1)|976, TBL(1)|1336, TBL(1)|1384, TBL(1)|1217, TBL(1)|1294, ++/* f948 */ TBL(1)|1511, TBL(1)|1595, TBL(1)|882, TBL(1)|933, TBL(1)|1119, TBL(1)|1164, TBL(1)|1177, TBL(1)|1350, ++/* f950 */ TBL(1)|1360, TBL(1)|1579, TBL(1)|789, TBL(1)|1387, TBL(1)|766, TBL(1)|765, TBL(1)|1319, TBL(1)|1355, ++/* f958 */ TBL(1)|1432, TBL(1)|1581, TBL(1)|1499, TBL(1)|1035, TBL(1)|1118, TBL(1)|1495, TBL(1)|703, TBL(1)|922, ++/* f960 */ TBL(1)|998, TBL(1)|1229, TBL(1)|1261, TBL(1)|798, TBL(1)|1296, TBL(1)|729, TBL(1)|991, TBL(1)|695, ++/* f968 */ TBL(1)|1148, TBL(1)|1066, TBL(1)|1349, TBL(1)|819, TBL(1)|878, TBL(1)|1280, TBL(1)|1434, TBL(1)|1488, ++/* f970 */ TBL(1)|1135, TBL(1)|1535, TBL(1)|1146, TBL(1)|1039, TBL(1)|1416, TBL(1)|1047, TBL(1)|1260, TBL(1)|716, ++/* f978 */ TBL(1)|747, TBL(1)|764, TBL(1)|1110, TBL(1)|1344, TBL(1)|1406, TBL(1)|1491, TBL(1)|1560, TBL(1)|792, ++/* f980 */ TBL(1)|837, TBL(1)|903, TBL(1)|973, TBL(1)|1073, TBL(1)|1184, TBL(1)|1297, TBL(1)|1575, TBL(1)|1632, ++/* f988 */ TBL(1)|1653, TBL(1)|1659, TBL(1)|783, TBL(1)|1086, TBL(1)|1130, TBL(1)|1532, TBL(1)|960, TBL(1)|1015, ++/* f990 */ TBL(1)|1022, TBL(1)|1058, TBL(1)|1180, TBL(1)|1199, TBL(1)|1243, TBL(1)|1316, TBL(1)|1357, TBL(1)|1382, ++/* f998 */ TBL(1)|1528, TBL(1)|1436, TBL(1)|1538, TBL(1)|1569, TBL(1)|773, TBL(1)|784, TBL(1)|842, TBL(1)|1195, ++/* f9a0 */ TBL(1)|1470, TBL(1)|1488, TBL(1)|968, TBL(1)|996, TBL(1)|1045, TBL(1)|1133, TBL(1)|1335, TBL(1)|1226, ++/* f9a8 */ TBL(1)|720, TBL(1)|865, TBL(1)|922, TBL(1)|947, TBL(1)|999, TBL(1)|1233, TBL(1)|1240, TBL(1)|1372, ++/* f9b0 */ TBL(1)|1380, TBL(1)|1562, TBL(1)|1594, TBL(1)|1598, TBL(1)|1613, TBL(1)|726, TBL(1)|1313, TBL(1)|1557, ++/* f9b8 */ TBL(1)|1588, TBL(1)|1005, TBL(1)|711, TBL(1)|735, TBL(1)|923, TBL(1)|931, TBL(1)|1069, TBL(1)|1118, ++/* f9c0 */ TBL(1)|1202, TBL(1)|1268, TBL(1)|1439, TBL(1)|1543, TBL(1)|1674, TBL(1)|1082, TBL(1)|1578, TBL(1)|782, ++/* f9c8 */ TBL(1)|1101, TBL(1)|1104, TBL(1)|1157, TBL(1)|1171, TBL(1)|1236, TBL(1)|1259, TBL(1)|1291, TBL(1)|1348, ++/* f9d0 */ TBL(1)|1616, TBL(1)|749, TBL(1)|1026, TBL(1)|1582, TBL(1)|731, TBL(1)|940, TBL(1)|1165, TBL(1)|1529, ++/* f9d8 */ TBL(1)|987, TBL(1)|1007, TBL(1)|1106, TBL(1)|1229, TBL(1)|1584, TBL(1)|775, TBL(1)|833, TBL(1)|935, ++/* f9e0 */ TBL(1)|1078, TBL(1)|1097, TBL(1)|1113, TBL(1)|1150, TBL(1)|1235, TBL(1)|1264, TBL(1)|1367, TBL(1)|1471, ++/* f9e8 */ TBL(1)|1474, TBL(1)|1559, TBL(1)|1591, TBL(1)|802, TBL(1)|1172, TBL(1)|834, TBL(1)|1203, TBL(1)|1244, ++/* f9f0 */ TBL(1)|1443, TBL(1)|1585, TBL(1)|1644, TBL(1)|1654, TBL(1)|1103, TBL(1)|1163, TBL(1)|1394, TBL(1)|1327, ++/* f9f8 */ TBL(1)|1330, TBL(1)|1339, TBL(1)|1223, TBL(1)|1193, TBL(1)|1498, TBL(1)|718, TBL(1)|1420, TBL(1)|776 + }; + + static const uint16_t UNWIF_compat_00_fa [256] = { +-/* fa00 */ TBL(1)|721, TBL(1)|913, TBL(1)|985, TBL(1)|1291, TBL(1)|867, TBL(1)|1103, TBL(1)|1034, TBL(1)|1480, +-/* fa08 */ TBL(1)|1416, TBL(1)|1529, TBL(1)|1431, TBL(1)|920, TBL(1)|688, TBL(1)|805, 0, 0, +-/* fa10 */ TBL(1)|826, 0, TBL(1)|1030, 0, 0, TBL(1)|716, TBL(1)|1174, TBL(1)|1223, +-/* fa18 */ TBL(1)|1248, TBL(1)|1255, TBL(1)|1256, TBL(1)|1261, TBL(1)|1549, TBL(1)|1289, TBL(1)|1322, 0, +-/* fa20 */ TBL(1)|1394, 0, TBL(1)|1443, 0, 0, TBL(1)|1488, TBL(1)|1499, 0, +-/* fa28 */ 0, 0, TBL(1)|1570, TBL(1)|1571, TBL(1)|1572, TBL(1)|1597, TBL(1)|1497, TBL(1)|1536, +-/* fa30 */ TBL(1)|676, TBL(1)|685, TBL(1)|690, TBL(1)|737, TBL(1)|740, TBL(1)|756, TBL(1)|801, TBL(1)|808, +-/* fa38 */ TBL(1)|810, TBL(1)|825, TBL(1)|828, TBL(1)|883, TBL(1)|885, TBL(1)|951, TBL(1)|961, TBL(1)|963, +-/* fa40 */ TBL(1)|969, TBL(1)|1012, TBL(1)|1024, TBL(1)|1032, TBL(1)|1060, TBL(1)|1109, TBL(1)|1116, TBL(1)|1128, +-/* fa48 */ TBL(1)|1149, TBL(1)|1157, TBL(1)|1186, TBL(1)|1242, TBL(1)|1249, TBL(1)|1251, TBL(1)|1250, TBL(1)|1252, +-/* fa50 */ TBL(1)|1253, TBL(1)|1254, TBL(1)|1259, TBL(1)|1260, TBL(1)|1269, TBL(1)|1274, TBL(1)|1281, TBL(1)|1306, +-/* fa58 */ TBL(1)|1308, TBL(1)|1310, TBL(1)|1315, TBL(1)|1325, TBL(1)|1345, TBL(1)|1358, TBL(1)|1358, TBL(1)|1384, +-/* fa60 */ TBL(1)|1426, TBL(1)|1432, TBL(1)|1445, TBL(1)|1446, TBL(1)|1463, TBL(1)|1464, TBL(1)|1486, TBL(1)|1488, +-/* fa68 */ TBL(1)|1541, TBL(1)|1558, TBL(1)|1564, TBL(1)|949, TBL(1)|420, TBL(1)|1351, 0, 0, +-/* fa70 */ TBL(1)|646, TBL(1)|711, TBL(1)|695, TBL(1)|673, TBL(1)|689, TBL(1)|700, TBL(1)|736, TBL(1)|743, +-/* fa78 */ TBL(1)|801, TBL(1)|796, TBL(1)|800, TBL(1)|807, TBL(1)|826, TBL(1)|830, TBL(1)|847, TBL(1)|850, +-/* fa80 */ TBL(1)|857, TBL(1)|861, TBL(1)|919, TBL(1)|921, TBL(1)|933, TBL(1)|941, TBL(1)|953, TBL(1)|959, +-/* fa88 */ TBL(1)|955, TBL(1)|963, TBL(1)|960, TBL(1)|969, TBL(1)|976, TBL(1)|998, TBL(1)|1001, TBL(1)|1003, +-/* fa90 */ TBL(1)|1013, TBL(1)|1030, TBL(1)|1042, TBL(1)|1043, TBL(1)|1048, TBL(1)|1080, TBL(1)|1084, TBL(1)|1106, +-/* fa98 */ TBL(1)|1125, TBL(1)|1123, TBL(1)|1128, TBL(1)|1135, TBL(1)|1149, TBL(1)|1235, TBL(1)|1158, TBL(1)|1171, +-/* faa0 */ TBL(1)|1174, TBL(1)|1190, TBL(1)|1197, TBL(1)|1206, TBL(1)|1215, TBL(1)|1216, TBL(1)|1223, TBL(1)|1224, +-/* faa8 */ TBL(1)|1228, TBL(1)|1233, TBL(1)|1232, TBL(1)|1244, TBL(1)|1275, TBL(1)|1281, TBL(1)|1287, TBL(1)|1301, +-/* fab0 */ TBL(1)|1306, TBL(1)|1313, TBL(1)|1325, TBL(1)|1370, TBL(1)|1380, TBL(1)|1409, TBL(1)|1427, TBL(1)|1430, +-/* fab8 */ TBL(1)|1432, TBL(1)|1438, TBL(1)|1443, TBL(1)|1439, TBL(1)|1445, TBL(1)|1444, TBL(1)|1442, TBL(1)|1446, +-/* fac0 */ TBL(1)|1449, TBL(1)|1464, TBL(1)|1479, TBL(1)|1491, TBL(1)|1505, TBL(1)|1513, TBL(1)|1532, TBL(1)|1541, +-/* fac8 */ TBL(1)|1549, TBL(1)|1554, TBL(1)|1558, TBL(1)|1561, TBL(1)|1564, TBL(1)|1585, TBL(1)|1625, TBL(1)|399, +-/* fad0 */ TBL(1)|398, TBL(1)|408, TBL(1)|592, TBL(1)|602, TBL(1)|603, TBL(1)|435, TBL(1)|446, TBL(1)|470, +-/* fad8 */ TBL(1)|1620, TBL(1)|1624, 0, 0, 0, 0, 0, 0, ++/* fa00 */ TBL(1)|772, TBL(1)|964, TBL(1)|1036, TBL(1)|1342, TBL(1)|918, TBL(1)|1154, TBL(1)|1085, TBL(1)|1531, ++/* fa08 */ TBL(1)|1467, TBL(1)|1580, TBL(1)|1482, TBL(1)|971, TBL(1)|739, TBL(1)|856, 0, 0, ++/* fa10 */ TBL(1)|877, 0, TBL(1)|1081, 0, 0, TBL(1)|767, TBL(1)|1225, TBL(1)|1274, ++/* fa18 */ TBL(1)|1299, TBL(1)|1306, TBL(1)|1307, TBL(1)|1312, TBL(1)|1600, TBL(1)|1340, TBL(1)|1373, 0, ++/* fa20 */ TBL(1)|1445, 0, TBL(1)|1494, 0, 0, TBL(1)|1539, TBL(1)|1550, 0, ++/* fa28 */ 0, 0, TBL(1)|1621, TBL(1)|1622, TBL(1)|1623, TBL(1)|1648, TBL(1)|1548, TBL(1)|1587, ++/* fa30 */ TBL(1)|727, TBL(1)|736, TBL(1)|741, TBL(1)|788, TBL(1)|791, TBL(1)|807, TBL(1)|852, TBL(1)|859, ++/* fa38 */ TBL(1)|861, TBL(1)|876, TBL(1)|879, TBL(1)|934, TBL(1)|936, TBL(1)|1002, TBL(1)|1012, TBL(1)|1014, ++/* fa40 */ TBL(1)|1020, TBL(1)|1063, TBL(1)|1075, TBL(1)|1083, TBL(1)|1111, TBL(1)|1160, TBL(1)|1167, TBL(1)|1179, ++/* fa48 */ TBL(1)|1200, TBL(1)|1208, TBL(1)|1237, TBL(1)|1293, TBL(1)|1300, TBL(1)|1302, TBL(1)|1301, TBL(1)|1303, ++/* fa50 */ TBL(1)|1304, TBL(1)|1305, TBL(1)|1310, TBL(1)|1311, TBL(1)|1320, TBL(1)|1325, TBL(1)|1332, TBL(1)|1357, ++/* fa58 */ TBL(1)|1359, TBL(1)|1361, TBL(1)|1366, TBL(1)|1376, TBL(1)|1396, TBL(1)|1409, TBL(1)|1409, TBL(1)|1435, ++/* fa60 */ TBL(1)|1477, TBL(1)|1483, TBL(1)|1496, TBL(1)|1497, TBL(1)|1514, TBL(1)|1515, TBL(1)|1537, TBL(1)|1539, ++/* fa68 */ TBL(1)|1592, TBL(1)|1609, TBL(1)|1615, TBL(1)|1000, TBL(1)|470, TBL(1)|1402, 0, 0, ++/* fa70 */ TBL(1)|697, TBL(1)|762, TBL(1)|746, TBL(1)|724, TBL(1)|740, TBL(1)|751, TBL(1)|787, TBL(1)|794, ++/* fa78 */ TBL(1)|852, TBL(1)|847, TBL(1)|851, TBL(1)|858, TBL(1)|877, TBL(1)|881, TBL(1)|898, TBL(1)|901, ++/* fa80 */ TBL(1)|908, TBL(1)|912, TBL(1)|970, TBL(1)|972, TBL(1)|984, TBL(1)|992, TBL(1)|1004, TBL(1)|1010, ++/* fa88 */ TBL(1)|1006, TBL(1)|1014, TBL(1)|1011, TBL(1)|1020, TBL(1)|1027, TBL(1)|1049, TBL(1)|1052, TBL(1)|1054, ++/* fa90 */ TBL(1)|1064, TBL(1)|1081, TBL(1)|1093, TBL(1)|1094, TBL(1)|1099, TBL(1)|1131, TBL(1)|1135, TBL(1)|1157, ++/* fa98 */ TBL(1)|1176, TBL(1)|1174, TBL(1)|1179, TBL(1)|1186, TBL(1)|1200, TBL(1)|1286, TBL(1)|1209, TBL(1)|1222, ++/* faa0 */ TBL(1)|1225, TBL(1)|1241, TBL(1)|1248, TBL(1)|1257, TBL(1)|1266, TBL(1)|1267, TBL(1)|1274, TBL(1)|1275, ++/* faa8 */ TBL(1)|1279, TBL(1)|1284, TBL(1)|1283, TBL(1)|1295, TBL(1)|1326, TBL(1)|1332, TBL(1)|1338, TBL(1)|1352, ++/* fab0 */ TBL(1)|1357, TBL(1)|1364, TBL(1)|1376, TBL(1)|1421, TBL(1)|1431, TBL(1)|1460, TBL(1)|1478, TBL(1)|1481, ++/* fab8 */ TBL(1)|1483, TBL(1)|1489, TBL(1)|1494, TBL(1)|1490, TBL(1)|1496, TBL(1)|1495, TBL(1)|1493, TBL(1)|1497, ++/* fac0 */ TBL(1)|1500, TBL(1)|1515, TBL(1)|1530, TBL(1)|1542, TBL(1)|1556, TBL(1)|1564, TBL(1)|1583, TBL(1)|1592, ++/* fac8 */ TBL(1)|1600, TBL(1)|1605, TBL(1)|1609, TBL(1)|1612, TBL(1)|1615, TBL(1)|1636, TBL(1)|1676, TBL(1)|449, ++/* fad0 */ TBL(1)|448, TBL(1)|458, TBL(1)|643, TBL(1)|653, TBL(1)|654, TBL(1)|485, TBL(1)|496, TBL(1)|520, ++/* fad8 */ TBL(1)|1671, TBL(1)|1675, 0, 0, 0, 0, 0, 0, + /* fae0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* fae8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* faf0 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -1856,34 +1862,34 @@ static const uint16_t UNWIF_compat_00_fb [256] = { + /* fb08 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* fb10 */ 0, 0, 0, TBL(2)|518, TBL(2)|515, TBL(2)|516, TBL(2)|519, TBL(2)|517, + /* fb18 */ 0, 0, 0, 0, 0, TBL(2)|533, 0, TBL(2)|552, +-/* fb20 */ TBL(1)|187, TBL(1)|179, TBL(1)|182, TBL(1)|183, TBL(1)|184, TBL(1)|185, TBL(1)|186, TBL(1)|188, +-/* fb28 */ TBL(1)|189, TBL(1)|3, TBL(2)|549, TBL(2)|550, TBL(3)|374, TBL(3)|375, TBL(2)|520, TBL(2)|521, ++/* fb20 */ TBL(1)|230, TBL(1)|222, TBL(1)|225, TBL(1)|226, TBL(1)|227, TBL(1)|228, TBL(1)|229, TBL(1)|231, ++/* fb28 */ TBL(1)|232, TBL(1)|3, TBL(2)|549, TBL(2)|550, TBL(3)|374, TBL(3)|375, TBL(2)|520, TBL(2)|521, + /* fb30 */ TBL(2)|522, TBL(2)|524, TBL(2)|526, TBL(2)|527, TBL(2)|528, TBL(2)|530, TBL(2)|531, 0, + /* fb38 */ TBL(2)|532, TBL(2)|534, TBL(2)|535, TBL(2)|536, TBL(2)|538, 0, TBL(2)|539, 0, + /* fb40 */ TBL(2)|540, TBL(2)|541, 0, TBL(2)|542, TBL(2)|543, 0, TBL(2)|545, TBL(2)|546, + /* fb48 */ TBL(2)|547, TBL(2)|548, TBL(2)|551, TBL(2)|529, TBL(2)|525, TBL(2)|537, TBL(2)|544, TBL(2)|523, +-/* fb50 */ TBL(1)|223, TBL(1)|223, TBL(1)|226, TBL(1)|226, TBL(1)|226, TBL(1)|226, TBL(1)|227, TBL(1)|227, +-/* fb58 */ TBL(1)|227, TBL(1)|227, TBL(1)|229, TBL(1)|229, TBL(1)|229, TBL(1)|229, TBL(1)|225, TBL(1)|225, +-/* fb60 */ TBL(1)|225, TBL(1)|225, TBL(1)|228, TBL(1)|228, TBL(1)|228, TBL(1)|228, TBL(1)|224, TBL(1)|224, +-/* fb68 */ TBL(1)|224, TBL(1)|224, TBL(1)|241, TBL(1)|241, TBL(1)|241, TBL(1)|241, TBL(1)|242, TBL(1)|242, +-/* fb70 */ TBL(1)|242, TBL(1)|242, TBL(1)|231, TBL(1)|231, TBL(1)|231, TBL(1)|231, TBL(1)|230, TBL(1)|230, +-/* fb78 */ TBL(1)|230, TBL(1)|230, TBL(1)|232, TBL(1)|232, TBL(1)|232, TBL(1)|232, TBL(1)|233, TBL(1)|233, +-/* fb80 */ TBL(1)|233, TBL(1)|233, TBL(1)|236, TBL(1)|236, TBL(1)|235, TBL(1)|235, TBL(1)|237, TBL(1)|237, +-/* fb88 */ TBL(1)|234, TBL(1)|234, TBL(1)|239, TBL(1)|239, TBL(1)|238, TBL(1)|238, TBL(1)|243, TBL(1)|243, +-/* fb90 */ TBL(1)|243, TBL(1)|243, TBL(1)|245, TBL(1)|245, TBL(1)|245, TBL(1)|245, TBL(1)|247, TBL(1)|247, +-/* fb98 */ TBL(1)|247, TBL(1)|247, TBL(1)|246, TBL(1)|246, TBL(1)|246, TBL(1)|246, TBL(1)|248, TBL(1)|248, +-/* fba0 */ TBL(1)|249, TBL(1)|249, TBL(1)|249, TBL(1)|249, TBL(2)|715, TBL(2)|715, TBL(1)|251, TBL(1)|251, +-/* fba8 */ TBL(1)|251, TBL(1)|251, TBL(1)|250, TBL(1)|250, TBL(1)|250, TBL(1)|250, TBL(1)|260, TBL(1)|260, ++/* fb50 */ TBL(1)|266, TBL(1)|266, TBL(1)|269, TBL(1)|269, TBL(1)|269, TBL(1)|269, TBL(1)|270, TBL(1)|270, ++/* fb58 */ TBL(1)|270, TBL(1)|270, TBL(1)|272, TBL(1)|272, TBL(1)|272, TBL(1)|272, TBL(1)|268, TBL(1)|268, ++/* fb60 */ TBL(1)|268, TBL(1)|268, TBL(1)|271, TBL(1)|271, TBL(1)|271, TBL(1)|271, TBL(1)|267, TBL(1)|267, ++/* fb68 */ TBL(1)|267, TBL(1)|267, TBL(1)|284, TBL(1)|284, TBL(1)|284, TBL(1)|284, TBL(1)|285, TBL(1)|285, ++/* fb70 */ TBL(1)|285, TBL(1)|285, TBL(1)|274, TBL(1)|274, TBL(1)|274, TBL(1)|274, TBL(1)|273, TBL(1)|273, ++/* fb78 */ TBL(1)|273, TBL(1)|273, TBL(1)|275, TBL(1)|275, TBL(1)|275, TBL(1)|275, TBL(1)|276, TBL(1)|276, ++/* fb80 */ TBL(1)|276, TBL(1)|276, TBL(1)|279, TBL(1)|279, TBL(1)|278, TBL(1)|278, TBL(1)|280, TBL(1)|280, ++/* fb88 */ TBL(1)|277, TBL(1)|277, TBL(1)|282, TBL(1)|282, TBL(1)|281, TBL(1)|281, TBL(1)|286, TBL(1)|286, ++/* fb90 */ TBL(1)|286, TBL(1)|286, TBL(1)|288, TBL(1)|288, TBL(1)|288, TBL(1)|288, TBL(1)|290, TBL(1)|290, ++/* fb98 */ TBL(1)|290, TBL(1)|290, TBL(1)|289, TBL(1)|289, TBL(1)|289, TBL(1)|289, TBL(1)|291, TBL(1)|291, ++/* fba0 */ TBL(1)|292, TBL(1)|292, TBL(1)|292, TBL(1)|292, TBL(2)|715, TBL(2)|715, TBL(1)|294, TBL(1)|294, ++/* fba8 */ TBL(1)|294, TBL(1)|294, TBL(1)|293, TBL(1)|293, TBL(1)|293, TBL(1)|293, TBL(1)|303, TBL(1)|303, + /* fbb0 */ TBL(2)|714, TBL(2)|714, 0, 0, 0, 0, 0, 0, + /* fbb8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* fbc0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* fbc8 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* fbd0 */ 0, 0, 0, TBL(1)|244, TBL(1)|244, TBL(1)|244, TBL(1)|244, TBL(1)|254, +-/* fbd8 */ TBL(1)|254, TBL(1)|253, TBL(1)|253, TBL(1)|255, TBL(1)|255, TBL(2)|713, TBL(1)|257, TBL(1)|257, +-/* fbe0 */ TBL(1)|252, TBL(1)|252, TBL(1)|256, TBL(1)|256, TBL(1)|259, TBL(1)|259, TBL(1)|259, TBL(1)|259, +-/* fbe8 */ TBL(1)|219, TBL(1)|219, TBL(3)|479, TBL(3)|479, TBL(3)|495, TBL(3)|495, TBL(3)|488, TBL(3)|488, ++/* fbd0 */ 0, 0, 0, TBL(1)|287, TBL(1)|287, TBL(1)|287, TBL(1)|287, TBL(1)|297, ++/* fbd8 */ TBL(1)|297, TBL(1)|296, TBL(1)|296, TBL(1)|298, TBL(1)|298, TBL(2)|713, TBL(1)|300, TBL(1)|300, ++/* fbe0 */ TBL(1)|295, TBL(1)|295, TBL(1)|299, TBL(1)|299, TBL(1)|302, TBL(1)|302, TBL(1)|302, TBL(1)|302, ++/* fbe8 */ TBL(1)|262, TBL(1)|262, TBL(3)|479, TBL(3)|479, TBL(3)|495, TBL(3)|495, TBL(3)|488, TBL(3)|488, + /* fbf0 */ TBL(3)|492, TBL(3)|492, TBL(3)|491, TBL(3)|491, TBL(3)|493, TBL(3)|493, TBL(3)|494, TBL(3)|494, +-/* fbf8 */ TBL(3)|494, TBL(3)|489, TBL(3)|489, TBL(3)|489, TBL(1)|258, TBL(1)|258, TBL(1)|258, TBL(1)|258 ++/* fbf8 */ TBL(3)|494, TBL(3)|489, TBL(3)|489, TBL(3)|489, TBL(1)|301, TBL(1)|301, TBL(1)|301, TBL(1)|301 + }; + + static const uint16_t UNWIF_compat_00_fc [256] = { +@@ -1959,35 +1965,35 @@ static const uint16_t UNWIF_compat_00_fd [256] = { + static const uint16_t UNWIF_compat_00_fe [256] = { + /* fe00 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* fe08 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* fe10 */ TBL(1)|4, TBL(1)|493, TBL(1)|494, TBL(1)|18, TBL(1)|19, TBL(1)|53, TBL(1)|23, TBL(1)|508, +-/* fe18 */ TBL(1)|509, TBL(3)|111, 0, 0, 0, 0, 0, 0, ++/* fe10 */ TBL(1)|4, TBL(1)|544, TBL(1)|545, TBL(1)|18, TBL(1)|19, TBL(1)|53, TBL(1)|23, TBL(1)|559, ++/* fe18 */ TBL(1)|560, TBL(3)|111, 0, 0, 0, 0, 0, 0, + /* fe20 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* fe28 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* fe30 */ TBL(2)|0, TBL(1)|368, TBL(1)|367, TBL(1)|1634, TBL(1)|1634, TBL(1)|0, TBL(1)|1, TBL(1)|1662, +-/* fe38 */ TBL(1)|1664, TBL(1)|506, TBL(1)|507, TBL(1)|503, TBL(1)|504, TBL(1)|497, TBL(1)|498, TBL(1)|495, +-/* fe40 */ TBL(1)|496, TBL(1)|499, TBL(1)|500, TBL(1)|501, TBL(1)|502, 0, 0, TBL(1)|51, +-/* fe48 */ TBL(1)|1632, TBL(2)|332, TBL(2)|332, TBL(2)|332, TBL(2)|332, TBL(1)|1634, TBL(1)|1634, TBL(1)|1634, +-/* fe50 */ TBL(1)|4, TBL(1)|493, TBL(1)|6, 0, TBL(1)|19, TBL(1)|18, TBL(1)|23, TBL(1)|53, +-/* fe58 */ TBL(1)|368, TBL(1)|0, TBL(1)|1, TBL(1)|1662, TBL(1)|1664, TBL(1)|506, TBL(1)|507, TBL(1)|55, ++/* fe30 */ TBL(2)|0, TBL(1)|418, TBL(1)|417, TBL(1)|1688, TBL(1)|1688, TBL(1)|0, TBL(1)|1, TBL(1)|1716, ++/* fe38 */ TBL(1)|1718, TBL(1)|557, TBL(1)|558, TBL(1)|554, TBL(1)|555, TBL(1)|548, TBL(1)|549, TBL(1)|546, ++/* fe40 */ TBL(1)|547, TBL(1)|550, TBL(1)|551, TBL(1)|552, TBL(1)|553, 0, 0, TBL(1)|51, ++/* fe48 */ TBL(1)|1686, TBL(2)|332, TBL(2)|332, TBL(2)|332, TBL(2)|332, TBL(1)|1688, TBL(1)|1688, TBL(1)|1688, ++/* fe50 */ TBL(1)|4, TBL(1)|544, TBL(1)|6, 0, TBL(1)|19, TBL(1)|18, TBL(1)|23, TBL(1)|53, ++/* fe58 */ TBL(1)|418, TBL(1)|0, TBL(1)|1, TBL(1)|1716, TBL(1)|1718, TBL(1)|557, TBL(1)|558, TBL(1)|55, + /* fe60 */ TBL(1)|58, TBL(1)|2, TBL(1)|3, TBL(1)|5, TBL(1)|20, TBL(1)|22, TBL(1)|21, 0, + /* fe68 */ TBL(1)|60, TBL(1)|56, TBL(1)|57, TBL(1)|24, 0, 0, 0, 0, + /* fe70 */ TBL(2)|345, TBL(2)|643, TBL(2)|346, 0, TBL(2)|347, 0, TBL(2)|348, TBL(2)|644, + /* fe78 */ TBL(2)|349, TBL(2)|645, TBL(2)|350, TBL(2)|646, TBL(2)|351, TBL(2)|647, TBL(2)|352, TBL(2)|648, +-/* fe80 */ TBL(1)|190, TBL(2)|554, TBL(2)|554, TBL(2)|555, TBL(2)|555, TBL(2)|697, TBL(2)|697, TBL(2)|556, +-/* fe88 */ TBL(2)|556, TBL(2)|710, TBL(2)|710, TBL(2)|710, TBL(2)|710, TBL(1)|191, TBL(1)|191, TBL(1)|192, +-/* fe90 */ TBL(1)|192, TBL(1)|192, TBL(1)|192, TBL(1)|193, TBL(1)|193, TBL(1)|194, TBL(1)|194, TBL(1)|194, +-/* fe98 */ TBL(1)|194, TBL(1)|195, TBL(1)|195, TBL(1)|195, TBL(1)|195, TBL(1)|196, TBL(1)|196, TBL(1)|196, +-/* fea0 */ TBL(1)|196, TBL(1)|197, TBL(1)|197, TBL(1)|197, TBL(1)|197, TBL(1)|198, TBL(1)|198, TBL(1)|198, +-/* fea8 */ TBL(1)|198, TBL(1)|199, TBL(1)|199, TBL(1)|200, TBL(1)|200, TBL(1)|201, TBL(1)|201, TBL(1)|202, +-/* feb0 */ TBL(1)|202, TBL(1)|203, TBL(1)|203, TBL(1)|203, TBL(1)|203, TBL(1)|204, TBL(1)|204, TBL(1)|204, +-/* feb8 */ TBL(1)|204, TBL(1)|205, TBL(1)|205, TBL(1)|205, TBL(1)|205, TBL(1)|206, TBL(1)|206, TBL(1)|206, +-/* fec0 */ TBL(1)|206, TBL(1)|207, TBL(1)|207, TBL(1)|207, TBL(1)|207, TBL(1)|208, TBL(1)|208, TBL(1)|208, +-/* fec8 */ TBL(1)|208, TBL(1)|209, TBL(1)|209, TBL(1)|209, TBL(1)|209, TBL(1)|210, TBL(1)|210, TBL(1)|210, +-/* fed0 */ TBL(1)|210, TBL(1)|211, TBL(1)|211, TBL(1)|211, TBL(1)|211, TBL(1)|212, TBL(1)|212, TBL(1)|212, +-/* fed8 */ TBL(1)|212, TBL(1)|213, TBL(1)|213, TBL(1)|213, TBL(1)|213, TBL(1)|214, TBL(1)|214, TBL(1)|214, +-/* fee0 */ TBL(1)|214, TBL(1)|215, TBL(1)|215, TBL(1)|215, TBL(1)|215, TBL(1)|216, TBL(1)|216, TBL(1)|216, +-/* fee8 */ TBL(1)|216, TBL(1)|217, TBL(1)|217, TBL(1)|217, TBL(1)|217, TBL(1)|218, TBL(1)|218, TBL(1)|219, +-/* fef0 */ TBL(1)|219, TBL(1)|220, TBL(1)|220, TBL(1)|220, TBL(1)|220, TBL(3)|441, TBL(3)|441, TBL(3)|442, ++/* fe80 */ TBL(1)|233, TBL(2)|554, TBL(2)|554, TBL(2)|555, TBL(2)|555, TBL(2)|697, TBL(2)|697, TBL(2)|556, ++/* fe88 */ TBL(2)|556, TBL(2)|710, TBL(2)|710, TBL(2)|710, TBL(2)|710, TBL(1)|234, TBL(1)|234, TBL(1)|235, ++/* fe90 */ TBL(1)|235, TBL(1)|235, TBL(1)|235, TBL(1)|236, TBL(1)|236, TBL(1)|237, TBL(1)|237, TBL(1)|237, ++/* fe98 */ TBL(1)|237, TBL(1)|238, TBL(1)|238, TBL(1)|238, TBL(1)|238, TBL(1)|239, TBL(1)|239, TBL(1)|239, ++/* fea0 */ TBL(1)|239, TBL(1)|240, TBL(1)|240, TBL(1)|240, TBL(1)|240, TBL(1)|241, TBL(1)|241, TBL(1)|241, ++/* fea8 */ TBL(1)|241, TBL(1)|242, TBL(1)|242, TBL(1)|243, TBL(1)|243, TBL(1)|244, TBL(1)|244, TBL(1)|245, ++/* feb0 */ TBL(1)|245, TBL(1)|246, TBL(1)|246, TBL(1)|246, TBL(1)|246, TBL(1)|247, TBL(1)|247, TBL(1)|247, ++/* feb8 */ TBL(1)|247, TBL(1)|248, TBL(1)|248, TBL(1)|248, TBL(1)|248, TBL(1)|249, TBL(1)|249, TBL(1)|249, ++/* fec0 */ TBL(1)|249, TBL(1)|250, TBL(1)|250, TBL(1)|250, TBL(1)|250, TBL(1)|251, TBL(1)|251, TBL(1)|251, ++/* fec8 */ TBL(1)|251, TBL(1)|252, TBL(1)|252, TBL(1)|252, TBL(1)|252, TBL(1)|253, TBL(1)|253, TBL(1)|253, ++/* fed0 */ TBL(1)|253, TBL(1)|254, TBL(1)|254, TBL(1)|254, TBL(1)|254, TBL(1)|255, TBL(1)|255, TBL(1)|255, ++/* fed8 */ TBL(1)|255, TBL(1)|256, TBL(1)|256, TBL(1)|256, TBL(1)|256, TBL(1)|257, TBL(1)|257, TBL(1)|257, ++/* fee0 */ TBL(1)|257, TBL(1)|258, TBL(1)|258, TBL(1)|258, TBL(1)|258, TBL(1)|259, TBL(1)|259, TBL(1)|259, ++/* fee8 */ TBL(1)|259, TBL(1)|260, TBL(1)|260, TBL(1)|260, TBL(1)|260, TBL(1)|261, TBL(1)|261, TBL(1)|262, ++/* fef0 */ TBL(1)|262, TBL(1)|263, TBL(1)|263, TBL(1)|263, TBL(1)|263, TBL(3)|441, TBL(3)|441, TBL(3)|442, + /* fef8 */ TBL(3)|442, TBL(3)|443, TBL(3)|443, TBL(2)|667, TBL(2)|667, 0, 0, 0 + }; + +@@ -1999,33 +2005,68 @@ static const uint16_t UNWIF_compat_00_ff [256] = { + /* ff20 */ TBL(1)|24, TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, TBL(1)|29, TBL(1)|30, TBL(1)|31, + /* ff28 */ TBL(1)|32, TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, TBL(1)|37, TBL(1)|38, TBL(1)|39, + /* ff30 */ TBL(1)|40, TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, TBL(1)|45, TBL(1)|46, TBL(1)|47, +-/* ff38 */ TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|51, TBL(1)|60, TBL(1)|1632, TBL(1)|1633, TBL(1)|1634, +-/* ff40 */ TBL(1)|1635, TBL(1)|1636, TBL(1)|1637, TBL(1)|1638, TBL(1)|1639, TBL(1)|1640, TBL(1)|1641, TBL(1)|1642, +-/* ff48 */ TBL(1)|1643, TBL(1)|1644, TBL(1)|1645, TBL(1)|1646, TBL(1)|1647, TBL(1)|1648, TBL(1)|1649, TBL(1)|1650, +-/* ff50 */ TBL(1)|1651, TBL(1)|1652, TBL(1)|1653, TBL(1)|1654, TBL(1)|1655, TBL(1)|1656, TBL(1)|1657, TBL(1)|1658, +-/* ff58 */ TBL(1)|1659, TBL(1)|1660, TBL(1)|1661, TBL(1)|1662, TBL(1)|1663, TBL(1)|1664, TBL(1)|1665, TBL(1)|483, +-/* ff60 */ TBL(1)|484, TBL(1)|494, TBL(1)|499, TBL(1)|500, TBL(1)|493, TBL(1)|569, TBL(1)|567, TBL(1)|512, +-/* ff68 */ TBL(1)|514, TBL(1)|516, TBL(1)|518, TBL(1)|520, TBL(1)|553, TBL(1)|555, TBL(1)|557, TBL(1)|534, +-/* ff70 */ TBL(1)|570, TBL(1)|513, TBL(1)|515, TBL(1)|517, TBL(1)|519, TBL(1)|521, TBL(1)|522, TBL(1)|523, +-/* ff78 */ TBL(1)|524, TBL(1)|525, TBL(1)|526, TBL(1)|527, TBL(1)|528, TBL(1)|529, TBL(1)|530, TBL(1)|531, +-/* ff80 */ TBL(1)|532, TBL(1)|533, TBL(1)|535, TBL(1)|536, TBL(1)|537, TBL(1)|538, TBL(1)|539, TBL(1)|540, +-/* ff88 */ TBL(1)|541, TBL(1)|542, TBL(1)|543, TBL(1)|544, TBL(1)|545, TBL(1)|546, TBL(1)|547, TBL(1)|548, +-/* ff90 */ TBL(1)|549, TBL(1)|550, TBL(1)|551, TBL(1)|552, TBL(1)|554, TBL(1)|556, TBL(1)|558, TBL(1)|559, +-/* ff98 */ TBL(1)|560, TBL(1)|561, TBL(1)|562, TBL(1)|563, TBL(1)|564, TBL(1)|568, TBL(1)|510, TBL(1)|511, +-/* ffa0 */ TBL(1)|307, TBL(1)|263, TBL(1)|264, TBL(1)|337, TBL(1)|265, TBL(1)|338, TBL(1)|339, TBL(1)|266, +-/* ffa8 */ TBL(1)|267, TBL(1)|268, TBL(1)|340, TBL(1)|341, TBL(1)|342, TBL(1)|343, TBL(1)|344, TBL(1)|345, +-/* ffb0 */ TBL(1)|284, TBL(1)|269, TBL(1)|270, TBL(1)|271, TBL(1)|289, TBL(1)|272, TBL(1)|273, TBL(1)|274, +-/* ffb8 */ TBL(1)|275, TBL(1)|276, TBL(1)|277, TBL(1)|278, TBL(1)|279, TBL(1)|280, TBL(1)|281, 0, +-/* ffc0 */ 0, 0, TBL(1)|308, TBL(1)|309, TBL(1)|310, TBL(1)|311, TBL(1)|312, TBL(1)|313, +-/* ffc8 */ 0, 0, TBL(1)|314, TBL(1)|315, TBL(1)|316, TBL(1)|317, TBL(1)|318, TBL(1)|319, +-/* ffd0 */ 0, 0, TBL(1)|320, TBL(1)|321, TBL(1)|322, TBL(1)|323, TBL(1)|324, TBL(1)|325, +-/* ffd8 */ 0, 0, TBL(1)|326, TBL(1)|327, TBL(1)|328, 0, 0, 0, +-/* ffe0 */ TBL(1)|61, TBL(1)|62, TBL(1)|65, TBL(2)|331, TBL(1)|64, TBL(1)|63, TBL(1)|376, 0, +-/* ffe8 */ TBL(1)|429, TBL(1)|381, TBL(1)|382, TBL(1)|383, TBL(1)|384, TBL(1)|441, TBL(1)|445, 0, ++/* ff38 */ TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|51, TBL(1)|60, TBL(1)|1686, TBL(1)|1687, TBL(1)|1688, ++/* ff40 */ TBL(1)|1689, TBL(1)|1690, TBL(1)|1691, TBL(1)|1692, TBL(1)|1693, TBL(1)|1694, TBL(1)|1695, TBL(1)|1696, ++/* ff48 */ TBL(1)|1697, TBL(1)|1698, TBL(1)|1699, TBL(1)|1700, TBL(1)|1701, TBL(1)|1702, TBL(1)|1703, TBL(1)|1704, ++/* ff50 */ TBL(1)|1705, TBL(1)|1706, TBL(1)|1707, TBL(1)|1708, TBL(1)|1709, TBL(1)|1710, TBL(1)|1711, TBL(1)|1712, ++/* ff58 */ TBL(1)|1713, TBL(1)|1714, TBL(1)|1715, TBL(1)|1716, TBL(1)|1717, TBL(1)|1718, TBL(1)|1719, TBL(1)|533, ++/* ff60 */ TBL(1)|534, TBL(1)|545, TBL(1)|550, TBL(1)|551, TBL(1)|544, TBL(1)|620, TBL(1)|618, TBL(1)|563, ++/* ff68 */ TBL(1)|565, TBL(1)|567, TBL(1)|569, TBL(1)|571, TBL(1)|604, TBL(1)|606, TBL(1)|608, TBL(1)|585, ++/* ff70 */ TBL(1)|621, TBL(1)|564, TBL(1)|566, TBL(1)|568, TBL(1)|570, TBL(1)|572, TBL(1)|573, TBL(1)|574, ++/* ff78 */ TBL(1)|575, TBL(1)|576, TBL(1)|577, TBL(1)|578, TBL(1)|579, TBL(1)|580, TBL(1)|581, TBL(1)|582, ++/* ff80 */ TBL(1)|583, TBL(1)|584, TBL(1)|586, TBL(1)|587, TBL(1)|588, TBL(1)|589, TBL(1)|590, TBL(1)|591, ++/* ff88 */ TBL(1)|592, TBL(1)|593, TBL(1)|594, TBL(1)|595, TBL(1)|596, TBL(1)|597, TBL(1)|598, TBL(1)|599, ++/* ff90 */ TBL(1)|600, TBL(1)|601, TBL(1)|602, TBL(1)|603, TBL(1)|605, TBL(1)|607, TBL(1)|609, TBL(1)|610, ++/* ff98 */ TBL(1)|611, TBL(1)|612, TBL(1)|613, TBL(1)|614, TBL(1)|615, TBL(1)|619, TBL(1)|561, TBL(1)|562, ++/* ffa0 */ TBL(1)|350, TBL(1)|306, TBL(1)|307, TBL(1)|380, TBL(1)|308, TBL(1)|381, TBL(1)|382, TBL(1)|309, ++/* ffa8 */ TBL(1)|310, TBL(1)|311, TBL(1)|383, TBL(1)|384, TBL(1)|385, TBL(1)|386, TBL(1)|387, TBL(1)|388, ++/* ffb0 */ TBL(1)|327, TBL(1)|312, TBL(1)|313, TBL(1)|314, TBL(1)|332, TBL(1)|315, TBL(1)|316, TBL(1)|317, ++/* ffb8 */ TBL(1)|318, TBL(1)|319, TBL(1)|320, TBL(1)|321, TBL(1)|322, TBL(1)|323, TBL(1)|324, 0, ++/* ffc0 */ 0, 0, TBL(1)|351, TBL(1)|352, TBL(1)|353, TBL(1)|354, TBL(1)|355, TBL(1)|356, ++/* ffc8 */ 0, 0, TBL(1)|357, TBL(1)|358, TBL(1)|359, TBL(1)|360, TBL(1)|361, TBL(1)|362, ++/* ffd0 */ 0, 0, TBL(1)|363, TBL(1)|364, TBL(1)|365, TBL(1)|366, TBL(1)|367, TBL(1)|368, ++/* ffd8 */ 0, 0, TBL(1)|369, TBL(1)|370, TBL(1)|371, 0, 0, 0, ++/* ffe0 */ TBL(1)|61, TBL(1)|62, TBL(1)|65, TBL(2)|331, TBL(1)|64, TBL(1)|63, TBL(1)|426, 0, ++/* ffe8 */ TBL(1)|479, TBL(1)|431, TBL(1)|432, TBL(1)|433, TBL(1)|434, TBL(1)|491, TBL(1)|495, 0, + /* fff0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* fff8 */ 0, 0, 0, 0, 0, 0, 0, 0 + }; + ++static const uint16_t UNWIF_compat_01_07 [256] = { ++/* 010700 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010708 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010710 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010718 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010720 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010728 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010730 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010738 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010740 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010748 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010750 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010758 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010760 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010768 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010770 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010778 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 010780 */ 0, TBL(1)|163, TBL(1)|164, TBL(1)|68, TBL(1)|146, TBL(1)|87, 0, TBL(1)|153, ++/* 010788 */ TBL(1)|1684, TBL(1)|155, TBL(1)|154, TBL(1)|90, TBL(1)|91, TBL(1)|408, TBL(1)|92, TBL(1)|96, ++/* 010790 */ TBL(1)|159, TBL(1)|102, TBL(1)|100, TBL(1)|98, TBL(1)|147, TBL(1)|72, TBL(1)|148, TBL(1)|105, ++/* 010798 */ TBL(1)|132, TBL(1)|160, TBL(1)|161, TBL(1)|110, TBL(1)|409, TBL(1)|1681, TBL(1)|112, TBL(1)|410, ++/* 0107a0 */ TBL(1)|139, TBL(1)|411, TBL(1)|70, TBL(1)|120, TBL(1)|121, TBL(1)|1706, TBL(1)|124, TBL(1)|412, ++/* 0107a8 */ TBL(1)|126, TBL(1)|127, TBL(1)|128, TBL(1)|158, TBL(1)|156, TBL(1)|1685, TBL(1)|157, TBL(1)|133, ++/* 0107b0 */ TBL(1)|542, 0, TBL(1)|140, TBL(1)|151, TBL(1)|152, TBL(1)|145, TBL(1)|79, TBL(1)|80, ++/* 0107b8 */ TBL(1)|81, TBL(1)|413, TBL(1)|414, 0, 0, 0, 0, 0, ++/* 0107c0 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 0107c8 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 0107d0 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 0107d8 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 0107e0 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 0107e8 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 0107f0 */ 0, 0, 0, 0, 0, 0, 0, 0, ++/* 0107f8 */ 0, 0, 0, 0, 0, 0, 0, 0 ++}; ++ + static const uint16_t UNWIF_compat_01_10 [256] = { + /* 011000 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 011008 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -2275,134 +2316,134 @@ static const uint16_t UNWIF_compat_01_d4 [256] = { + /* 01d400 */ TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, + /* 01d408 */ TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, + /* 01d410 */ TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, +-/* 01d418 */ TBL(1)|49, TBL(1)|50, TBL(1)|1636, TBL(1)|1637, TBL(1)|1638, TBL(1)|1639, TBL(1)|1640, TBL(1)|1641, +-/* 01d420 */ TBL(1)|1642, TBL(1)|1643, TBL(1)|1644, TBL(1)|1645, TBL(1)|1646, TBL(1)|1647, TBL(1)|1648, TBL(1)|1649, +-/* 01d428 */ TBL(1)|1650, TBL(1)|1651, TBL(1)|1652, TBL(1)|1653, TBL(1)|1654, TBL(1)|1655, TBL(1)|1656, TBL(1)|1657, +-/* 01d430 */ TBL(1)|1658, TBL(1)|1659, TBL(1)|1660, TBL(1)|1661, TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, ++/* 01d418 */ TBL(1)|49, TBL(1)|50, TBL(1)|1690, TBL(1)|1691, TBL(1)|1692, TBL(1)|1693, TBL(1)|1694, TBL(1)|1695, ++/* 01d420 */ TBL(1)|1696, TBL(1)|1697, TBL(1)|1698, TBL(1)|1699, TBL(1)|1700, TBL(1)|1701, TBL(1)|1702, TBL(1)|1703, ++/* 01d428 */ TBL(1)|1704, TBL(1)|1705, TBL(1)|1706, TBL(1)|1707, TBL(1)|1708, TBL(1)|1709, TBL(1)|1710, TBL(1)|1711, ++/* 01d430 */ TBL(1)|1712, TBL(1)|1713, TBL(1)|1714, TBL(1)|1715, TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, + /* 01d438 */ TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, + /* 01d440 */ TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, +-/* 01d448 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|1636, TBL(1)|1637, +-/* 01d450 */ TBL(1)|1638, TBL(1)|1639, TBL(1)|1640, TBL(1)|1641, TBL(1)|1642, 0, TBL(1)|1644, TBL(1)|1645, +-/* 01d458 */ TBL(1)|1646, TBL(1)|1647, TBL(1)|1648, TBL(1)|1649, TBL(1)|1650, TBL(1)|1651, TBL(1)|1652, TBL(1)|1653, +-/* 01d460 */ TBL(1)|1654, TBL(1)|1655, TBL(1)|1656, TBL(1)|1657, TBL(1)|1658, TBL(1)|1659, TBL(1)|1660, TBL(1)|1661, ++/* 01d448 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|1690, TBL(1)|1691, ++/* 01d450 */ TBL(1)|1692, TBL(1)|1693, TBL(1)|1694, TBL(1)|1695, TBL(1)|1696, 0, TBL(1)|1698, TBL(1)|1699, ++/* 01d458 */ TBL(1)|1700, TBL(1)|1701, TBL(1)|1702, TBL(1)|1703, TBL(1)|1704, TBL(1)|1705, TBL(1)|1706, TBL(1)|1707, ++/* 01d460 */ TBL(1)|1708, TBL(1)|1709, TBL(1)|1710, TBL(1)|1711, TBL(1)|1712, TBL(1)|1713, TBL(1)|1714, TBL(1)|1715, + /* 01d468 */ TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, + /* 01d470 */ TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, + /* 01d478 */ TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, +-/* 01d480 */ TBL(1)|49, TBL(1)|50, TBL(1)|1636, TBL(1)|1637, TBL(1)|1638, TBL(1)|1639, TBL(1)|1640, TBL(1)|1641, +-/* 01d488 */ TBL(1)|1642, TBL(1)|1643, TBL(1)|1644, TBL(1)|1645, TBL(1)|1646, TBL(1)|1647, TBL(1)|1648, TBL(1)|1649, +-/* 01d490 */ TBL(1)|1650, TBL(1)|1651, TBL(1)|1652, TBL(1)|1653, TBL(1)|1654, TBL(1)|1655, TBL(1)|1656, TBL(1)|1657, +-/* 01d498 */ TBL(1)|1658, TBL(1)|1659, TBL(1)|1660, TBL(1)|1661, TBL(1)|25, 0, TBL(1)|27, TBL(1)|28, ++/* 01d480 */ TBL(1)|49, TBL(1)|50, TBL(1)|1690, TBL(1)|1691, TBL(1)|1692, TBL(1)|1693, TBL(1)|1694, TBL(1)|1695, ++/* 01d488 */ TBL(1)|1696, TBL(1)|1697, TBL(1)|1698, TBL(1)|1699, TBL(1)|1700, TBL(1)|1701, TBL(1)|1702, TBL(1)|1703, ++/* 01d490 */ TBL(1)|1704, TBL(1)|1705, TBL(1)|1706, TBL(1)|1707, TBL(1)|1708, TBL(1)|1709, TBL(1)|1710, TBL(1)|1711, ++/* 01d498 */ TBL(1)|1712, TBL(1)|1713, TBL(1)|1714, TBL(1)|1715, TBL(1)|25, 0, TBL(1)|27, TBL(1)|28, + /* 01d4a0 */ 0, 0, TBL(1)|31, 0, 0, TBL(1)|34, TBL(1)|35, 0, + /* 01d4a8 */ 0, TBL(1)|38, TBL(1)|39, TBL(1)|40, TBL(1)|41, 0, TBL(1)|43, TBL(1)|44, +-/* 01d4b0 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|1636, TBL(1)|1637, +-/* 01d4b8 */ TBL(1)|1638, TBL(1)|1639, 0, TBL(1)|1641, 0, TBL(1)|1643, TBL(1)|1644, TBL(1)|1645, +-/* 01d4c0 */ TBL(1)|1646, TBL(1)|1647, TBL(1)|1648, TBL(1)|1649, 0, TBL(1)|1651, TBL(1)|1652, TBL(1)|1653, +-/* 01d4c8 */ TBL(1)|1654, TBL(1)|1655, TBL(1)|1656, TBL(1)|1657, TBL(1)|1658, TBL(1)|1659, TBL(1)|1660, TBL(1)|1661, ++/* 01d4b0 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|1690, TBL(1)|1691, ++/* 01d4b8 */ TBL(1)|1692, TBL(1)|1693, 0, TBL(1)|1695, 0, TBL(1)|1697, TBL(1)|1698, TBL(1)|1699, ++/* 01d4c0 */ TBL(1)|1700, TBL(1)|1701, TBL(1)|1702, TBL(1)|1703, 0, TBL(1)|1705, TBL(1)|1706, TBL(1)|1707, ++/* 01d4c8 */ TBL(1)|1708, TBL(1)|1709, TBL(1)|1710, TBL(1)|1711, TBL(1)|1712, TBL(1)|1713, TBL(1)|1714, TBL(1)|1715, + /* 01d4d0 */ TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, + /* 01d4d8 */ TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, + /* 01d4e0 */ TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, +-/* 01d4e8 */ TBL(1)|49, TBL(1)|50, TBL(1)|1636, TBL(1)|1637, TBL(1)|1638, TBL(1)|1639, TBL(1)|1640, TBL(1)|1641, +-/* 01d4f0 */ TBL(1)|1642, TBL(1)|1643, TBL(1)|1644, TBL(1)|1645, TBL(1)|1646, TBL(1)|1647, TBL(1)|1648, TBL(1)|1649, +-/* 01d4f8 */ TBL(1)|1650, TBL(1)|1651, TBL(1)|1652, TBL(1)|1653, TBL(1)|1654, TBL(1)|1655, TBL(1)|1656, TBL(1)|1657 ++/* 01d4e8 */ TBL(1)|49, TBL(1)|50, TBL(1)|1690, TBL(1)|1691, TBL(1)|1692, TBL(1)|1693, TBL(1)|1694, TBL(1)|1695, ++/* 01d4f0 */ TBL(1)|1696, TBL(1)|1697, TBL(1)|1698, TBL(1)|1699, TBL(1)|1700, TBL(1)|1701, TBL(1)|1702, TBL(1)|1703, ++/* 01d4f8 */ TBL(1)|1704, TBL(1)|1705, TBL(1)|1706, TBL(1)|1707, TBL(1)|1708, TBL(1)|1709, TBL(1)|1710, TBL(1)|1711 + }; + + static const uint16_t UNWIF_compat_01_d5 [256] = { +-/* 01d500 */ TBL(1)|1658, TBL(1)|1659, TBL(1)|1660, TBL(1)|1661, TBL(1)|25, TBL(1)|26, 0, TBL(1)|28, ++/* 01d500 */ TBL(1)|1712, TBL(1)|1713, TBL(1)|1714, TBL(1)|1715, TBL(1)|25, TBL(1)|26, 0, TBL(1)|28, + /* 01d508 */ TBL(1)|29, TBL(1)|30, TBL(1)|31, 0, 0, TBL(1)|34, TBL(1)|35, TBL(1)|36, + /* 01d510 */ TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, TBL(1)|41, 0, TBL(1)|43, TBL(1)|44, +-/* 01d518 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, 0, TBL(1)|1636, TBL(1)|1637, +-/* 01d520 */ TBL(1)|1638, TBL(1)|1639, TBL(1)|1640, TBL(1)|1641, TBL(1)|1642, TBL(1)|1643, TBL(1)|1644, TBL(1)|1645, +-/* 01d528 */ TBL(1)|1646, TBL(1)|1647, TBL(1)|1648, TBL(1)|1649, TBL(1)|1650, TBL(1)|1651, TBL(1)|1652, TBL(1)|1653, +-/* 01d530 */ TBL(1)|1654, TBL(1)|1655, TBL(1)|1656, TBL(1)|1657, TBL(1)|1658, TBL(1)|1659, TBL(1)|1660, TBL(1)|1661, ++/* 01d518 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, 0, TBL(1)|1690, TBL(1)|1691, ++/* 01d520 */ TBL(1)|1692, TBL(1)|1693, TBL(1)|1694, TBL(1)|1695, TBL(1)|1696, TBL(1)|1697, TBL(1)|1698, TBL(1)|1699, ++/* 01d528 */ TBL(1)|1700, TBL(1)|1701, TBL(1)|1702, TBL(1)|1703, TBL(1)|1704, TBL(1)|1705, TBL(1)|1706, TBL(1)|1707, ++/* 01d530 */ TBL(1)|1708, TBL(1)|1709, TBL(1)|1710, TBL(1)|1711, TBL(1)|1712, TBL(1)|1713, TBL(1)|1714, TBL(1)|1715, + /* 01d538 */ TBL(1)|25, TBL(1)|26, 0, TBL(1)|28, TBL(1)|29, TBL(1)|30, TBL(1)|31, 0, + /* 01d540 */ TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, TBL(1)|37, 0, TBL(1)|39, 0, + /* 01d548 */ 0, 0, TBL(1)|43, TBL(1)|44, TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, +-/* 01d550 */ TBL(1)|49, 0, TBL(1)|1636, TBL(1)|1637, TBL(1)|1638, TBL(1)|1639, TBL(1)|1640, TBL(1)|1641, +-/* 01d558 */ TBL(1)|1642, TBL(1)|1643, TBL(1)|1644, TBL(1)|1645, TBL(1)|1646, TBL(1)|1647, TBL(1)|1648, TBL(1)|1649, +-/* 01d560 */ TBL(1)|1650, TBL(1)|1651, TBL(1)|1652, TBL(1)|1653, TBL(1)|1654, TBL(1)|1655, TBL(1)|1656, TBL(1)|1657, +-/* 01d568 */ TBL(1)|1658, TBL(1)|1659, TBL(1)|1660, TBL(1)|1661, TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, ++/* 01d550 */ TBL(1)|49, 0, TBL(1)|1690, TBL(1)|1691, TBL(1)|1692, TBL(1)|1693, TBL(1)|1694, TBL(1)|1695, ++/* 01d558 */ TBL(1)|1696, TBL(1)|1697, TBL(1)|1698, TBL(1)|1699, TBL(1)|1700, TBL(1)|1701, TBL(1)|1702, TBL(1)|1703, ++/* 01d560 */ TBL(1)|1704, TBL(1)|1705, TBL(1)|1706, TBL(1)|1707, TBL(1)|1708, TBL(1)|1709, TBL(1)|1710, TBL(1)|1711, ++/* 01d568 */ TBL(1)|1712, TBL(1)|1713, TBL(1)|1714, TBL(1)|1715, TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, + /* 01d570 */ TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, + /* 01d578 */ TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, +-/* 01d580 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|1636, TBL(1)|1637, +-/* 01d588 */ TBL(1)|1638, TBL(1)|1639, TBL(1)|1640, TBL(1)|1641, TBL(1)|1642, TBL(1)|1643, TBL(1)|1644, TBL(1)|1645, +-/* 01d590 */ TBL(1)|1646, TBL(1)|1647, TBL(1)|1648, TBL(1)|1649, TBL(1)|1650, TBL(1)|1651, TBL(1)|1652, TBL(1)|1653, +-/* 01d598 */ TBL(1)|1654, TBL(1)|1655, TBL(1)|1656, TBL(1)|1657, TBL(1)|1658, TBL(1)|1659, TBL(1)|1660, TBL(1)|1661, ++/* 01d580 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|1690, TBL(1)|1691, ++/* 01d588 */ TBL(1)|1692, TBL(1)|1693, TBL(1)|1694, TBL(1)|1695, TBL(1)|1696, TBL(1)|1697, TBL(1)|1698, TBL(1)|1699, ++/* 01d590 */ TBL(1)|1700, TBL(1)|1701, TBL(1)|1702, TBL(1)|1703, TBL(1)|1704, TBL(1)|1705, TBL(1)|1706, TBL(1)|1707, ++/* 01d598 */ TBL(1)|1708, TBL(1)|1709, TBL(1)|1710, TBL(1)|1711, TBL(1)|1712, TBL(1)|1713, TBL(1)|1714, TBL(1)|1715, + /* 01d5a0 */ TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, + /* 01d5a8 */ TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, + /* 01d5b0 */ TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, +-/* 01d5b8 */ TBL(1)|49, TBL(1)|50, TBL(1)|1636, TBL(1)|1637, TBL(1)|1638, TBL(1)|1639, TBL(1)|1640, TBL(1)|1641, +-/* 01d5c0 */ TBL(1)|1642, TBL(1)|1643, TBL(1)|1644, TBL(1)|1645, TBL(1)|1646, TBL(1)|1647, TBL(1)|1648, TBL(1)|1649, +-/* 01d5c8 */ TBL(1)|1650, TBL(1)|1651, TBL(1)|1652, TBL(1)|1653, TBL(1)|1654, TBL(1)|1655, TBL(1)|1656, TBL(1)|1657, +-/* 01d5d0 */ TBL(1)|1658, TBL(1)|1659, TBL(1)|1660, TBL(1)|1661, TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, ++/* 01d5b8 */ TBL(1)|49, TBL(1)|50, TBL(1)|1690, TBL(1)|1691, TBL(1)|1692, TBL(1)|1693, TBL(1)|1694, TBL(1)|1695, ++/* 01d5c0 */ TBL(1)|1696, TBL(1)|1697, TBL(1)|1698, TBL(1)|1699, TBL(1)|1700, TBL(1)|1701, TBL(1)|1702, TBL(1)|1703, ++/* 01d5c8 */ TBL(1)|1704, TBL(1)|1705, TBL(1)|1706, TBL(1)|1707, TBL(1)|1708, TBL(1)|1709, TBL(1)|1710, TBL(1)|1711, ++/* 01d5d0 */ TBL(1)|1712, TBL(1)|1713, TBL(1)|1714, TBL(1)|1715, TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, + /* 01d5d8 */ TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, + /* 01d5e0 */ TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, +-/* 01d5e8 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|1636, TBL(1)|1637, +-/* 01d5f0 */ TBL(1)|1638, TBL(1)|1639, TBL(1)|1640, TBL(1)|1641, TBL(1)|1642, TBL(1)|1643, TBL(1)|1644, TBL(1)|1645, +-/* 01d5f8 */ TBL(1)|1646, TBL(1)|1647, TBL(1)|1648, TBL(1)|1649, TBL(1)|1650, TBL(1)|1651, TBL(1)|1652, TBL(1)|1653 ++/* 01d5e8 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|1690, TBL(1)|1691, ++/* 01d5f0 */ TBL(1)|1692, TBL(1)|1693, TBL(1)|1694, TBL(1)|1695, TBL(1)|1696, TBL(1)|1697, TBL(1)|1698, TBL(1)|1699, ++/* 01d5f8 */ TBL(1)|1700, TBL(1)|1701, TBL(1)|1702, TBL(1)|1703, TBL(1)|1704, TBL(1)|1705, TBL(1)|1706, TBL(1)|1707 + }; + + static const uint16_t UNWIF_compat_01_d6 [256] = { +-/* 01d600 */ TBL(1)|1654, TBL(1)|1655, TBL(1)|1656, TBL(1)|1657, TBL(1)|1658, TBL(1)|1659, TBL(1)|1660, TBL(1)|1661, ++/* 01d600 */ TBL(1)|1708, TBL(1)|1709, TBL(1)|1710, TBL(1)|1711, TBL(1)|1712, TBL(1)|1713, TBL(1)|1714, TBL(1)|1715, + /* 01d608 */ TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, + /* 01d610 */ TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, + /* 01d618 */ TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, +-/* 01d620 */ TBL(1)|49, TBL(1)|50, TBL(1)|1636, TBL(1)|1637, TBL(1)|1638, TBL(1)|1639, TBL(1)|1640, TBL(1)|1641, +-/* 01d628 */ TBL(1)|1642, TBL(1)|1643, TBL(1)|1644, TBL(1)|1645, TBL(1)|1646, TBL(1)|1647, TBL(1)|1648, TBL(1)|1649, +-/* 01d630 */ TBL(1)|1650, TBL(1)|1651, TBL(1)|1652, TBL(1)|1653, TBL(1)|1654, TBL(1)|1655, TBL(1)|1656, TBL(1)|1657, +-/* 01d638 */ TBL(1)|1658, TBL(1)|1659, TBL(1)|1660, TBL(1)|1661, TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, ++/* 01d620 */ TBL(1)|49, TBL(1)|50, TBL(1)|1690, TBL(1)|1691, TBL(1)|1692, TBL(1)|1693, TBL(1)|1694, TBL(1)|1695, ++/* 01d628 */ TBL(1)|1696, TBL(1)|1697, TBL(1)|1698, TBL(1)|1699, TBL(1)|1700, TBL(1)|1701, TBL(1)|1702, TBL(1)|1703, ++/* 01d630 */ TBL(1)|1704, TBL(1)|1705, TBL(1)|1706, TBL(1)|1707, TBL(1)|1708, TBL(1)|1709, TBL(1)|1710, TBL(1)|1711, ++/* 01d638 */ TBL(1)|1712, TBL(1)|1713, TBL(1)|1714, TBL(1)|1715, TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, + /* 01d640 */ TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, + /* 01d648 */ TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, +-/* 01d650 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|1636, TBL(1)|1637, +-/* 01d658 */ TBL(1)|1638, TBL(1)|1639, TBL(1)|1640, TBL(1)|1641, TBL(1)|1642, TBL(1)|1643, TBL(1)|1644, TBL(1)|1645, +-/* 01d660 */ TBL(1)|1646, TBL(1)|1647, TBL(1)|1648, TBL(1)|1649, TBL(1)|1650, TBL(1)|1651, TBL(1)|1652, TBL(1)|1653, +-/* 01d668 */ TBL(1)|1654, TBL(1)|1655, TBL(1)|1656, TBL(1)|1657, TBL(1)|1658, TBL(1)|1659, TBL(1)|1660, TBL(1)|1661, ++/* 01d650 */ TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, TBL(1)|49, TBL(1)|50, TBL(1)|1690, TBL(1)|1691, ++/* 01d658 */ TBL(1)|1692, TBL(1)|1693, TBL(1)|1694, TBL(1)|1695, TBL(1)|1696, TBL(1)|1697, TBL(1)|1698, TBL(1)|1699, ++/* 01d660 */ TBL(1)|1700, TBL(1)|1701, TBL(1)|1702, TBL(1)|1703, TBL(1)|1704, TBL(1)|1705, TBL(1)|1706, TBL(1)|1707, ++/* 01d668 */ TBL(1)|1708, TBL(1)|1709, TBL(1)|1710, TBL(1)|1711, TBL(1)|1712, TBL(1)|1713, TBL(1)|1714, TBL(1)|1715, + /* 01d670 */ TBL(1)|25, TBL(1)|26, TBL(1)|27, TBL(1)|28, TBL(1)|29, TBL(1)|30, TBL(1)|31, TBL(1)|32, + /* 01d678 */ TBL(1)|33, TBL(1)|34, TBL(1)|35, TBL(1)|36, TBL(1)|37, TBL(1)|38, TBL(1)|39, TBL(1)|40, + /* 01d680 */ TBL(1)|41, TBL(1)|42, TBL(1)|43, TBL(1)|44, TBL(1)|45, TBL(1)|46, TBL(1)|47, TBL(1)|48, +-/* 01d688 */ TBL(1)|49, TBL(1)|50, TBL(1)|1636, TBL(1)|1637, TBL(1)|1638, TBL(1)|1639, TBL(1)|1640, TBL(1)|1641, +-/* 01d690 */ TBL(1)|1642, TBL(1)|1643, TBL(1)|1644, TBL(1)|1645, TBL(1)|1646, TBL(1)|1647, TBL(1)|1648, TBL(1)|1649, +-/* 01d698 */ TBL(1)|1650, TBL(1)|1651, TBL(1)|1652, TBL(1)|1653, TBL(1)|1654, TBL(1)|1655, TBL(1)|1656, TBL(1)|1657, +-/* 01d6a0 */ TBL(1)|1658, TBL(1)|1659, TBL(1)|1660, TBL(1)|1661, TBL(1)|71, TBL(1)|78, 0, 0, +-/* 01d6a8 */ TBL(1)|125, TBL(1)|126, TBL(1)|127, TBL(1)|128, TBL(1)|129, TBL(1)|130, TBL(1)|131, TBL(1)|132, +-/* 01d6b0 */ TBL(1)|133, TBL(1)|134, TBL(1)|135, TBL(1)|136, TBL(1)|137, TBL(1)|138, TBL(1)|139, TBL(1)|140, +-/* 01d6b8 */ TBL(1)|141, TBL(1)|132, TBL(1)|142, TBL(1)|143, TBL(1)|144, TBL(1)|145, TBL(1)|146, TBL(1)|147, +-/* 01d6c0 */ TBL(1)|148, TBL(1)|391, TBL(1)|149, TBL(1)|150, TBL(1)|151, TBL(1)|152, TBL(1)|153, TBL(1)|154, +-/* 01d6c8 */ TBL(1)|155, TBL(1)|156, TBL(1)|157, TBL(1)|158, TBL(1)|159, TBL(1)|160, TBL(1)|161, TBL(1)|162, +-/* 01d6d0 */ TBL(1)|163, TBL(1)|164, TBL(1)|165, TBL(1)|166, TBL(1)|167, TBL(1)|168, TBL(1)|169, TBL(1)|170, +-/* 01d6d8 */ TBL(1)|171, TBL(1)|172, TBL(1)|173, TBL(1)|390, TBL(1)|153, TBL(1)|156, TBL(1)|158, TBL(1)|170, +-/* 01d6e0 */ TBL(1)|165, TBL(1)|164, TBL(1)|125, TBL(1)|126, TBL(1)|127, TBL(1)|128, TBL(1)|129, TBL(1)|130, +-/* 01d6e8 */ TBL(1)|131, TBL(1)|132, TBL(1)|133, TBL(1)|134, TBL(1)|135, TBL(1)|136, TBL(1)|137, TBL(1)|138, +-/* 01d6f0 */ TBL(1)|139, TBL(1)|140, TBL(1)|141, TBL(1)|132, TBL(1)|142, TBL(1)|143, TBL(1)|144, TBL(1)|145, +-/* 01d6f8 */ TBL(1)|146, TBL(1)|147, TBL(1)|148, TBL(1)|391, TBL(1)|149, TBL(1)|150, TBL(1)|151, TBL(1)|152 ++/* 01d688 */ TBL(1)|49, TBL(1)|50, TBL(1)|1690, TBL(1)|1691, TBL(1)|1692, TBL(1)|1693, TBL(1)|1694, TBL(1)|1695, ++/* 01d690 */ TBL(1)|1696, TBL(1)|1697, TBL(1)|1698, TBL(1)|1699, TBL(1)|1700, TBL(1)|1701, TBL(1)|1702, TBL(1)|1703, ++/* 01d698 */ TBL(1)|1704, TBL(1)|1705, TBL(1)|1706, TBL(1)|1707, TBL(1)|1708, TBL(1)|1709, TBL(1)|1710, TBL(1)|1711, ++/* 01d6a0 */ TBL(1)|1712, TBL(1)|1713, TBL(1)|1714, TBL(1)|1715, TBL(1)|73, TBL(1)|83, 0, 0, ++/* 01d6a8 */ TBL(1)|168, TBL(1)|169, TBL(1)|170, TBL(1)|171, TBL(1)|172, TBL(1)|173, TBL(1)|174, TBL(1)|175, ++/* 01d6b0 */ TBL(1)|176, TBL(1)|177, TBL(1)|178, TBL(1)|179, TBL(1)|180, TBL(1)|181, TBL(1)|182, TBL(1)|183, ++/* 01d6b8 */ TBL(1)|184, TBL(1)|175, TBL(1)|185, TBL(1)|186, TBL(1)|187, TBL(1)|188, TBL(1)|189, TBL(1)|190, ++/* 01d6c0 */ TBL(1)|191, TBL(1)|441, TBL(1)|192, TBL(1)|193, TBL(1)|194, TBL(1)|195, TBL(1)|196, TBL(1)|197, ++/* 01d6c8 */ TBL(1)|198, TBL(1)|199, TBL(1)|200, TBL(1)|201, TBL(1)|202, TBL(1)|203, TBL(1)|204, TBL(1)|205, ++/* 01d6d0 */ TBL(1)|206, TBL(1)|207, TBL(1)|208, TBL(1)|209, TBL(1)|210, TBL(1)|211, TBL(1)|212, TBL(1)|213, ++/* 01d6d8 */ TBL(1)|214, TBL(1)|215, TBL(1)|216, TBL(1)|440, TBL(1)|196, TBL(1)|199, TBL(1)|201, TBL(1)|213, ++/* 01d6e0 */ TBL(1)|208, TBL(1)|207, TBL(1)|168, TBL(1)|169, TBL(1)|170, TBL(1)|171, TBL(1)|172, TBL(1)|173, ++/* 01d6e8 */ TBL(1)|174, TBL(1)|175, TBL(1)|176, TBL(1)|177, TBL(1)|178, TBL(1)|179, TBL(1)|180, TBL(1)|181, ++/* 01d6f0 */ TBL(1)|182, TBL(1)|183, TBL(1)|184, TBL(1)|175, TBL(1)|185, TBL(1)|186, TBL(1)|187, TBL(1)|188, ++/* 01d6f8 */ TBL(1)|189, TBL(1)|190, TBL(1)|191, TBL(1)|441, TBL(1)|192, TBL(1)|193, TBL(1)|194, TBL(1)|195 + }; + + static const uint16_t UNWIF_compat_01_d7 [256] = { +-/* 01d700 */ TBL(1)|153, TBL(1)|154, TBL(1)|155, TBL(1)|156, TBL(1)|157, TBL(1)|158, TBL(1)|159, TBL(1)|160, +-/* 01d708 */ TBL(1)|161, TBL(1)|162, TBL(1)|163, TBL(1)|164, TBL(1)|165, TBL(1)|166, TBL(1)|167, TBL(1)|168, +-/* 01d710 */ TBL(1)|169, TBL(1)|170, TBL(1)|171, TBL(1)|172, TBL(1)|173, TBL(1)|390, TBL(1)|153, TBL(1)|156, +-/* 01d718 */ TBL(1)|158, TBL(1)|170, TBL(1)|165, TBL(1)|164, TBL(1)|125, TBL(1)|126, TBL(1)|127, TBL(1)|128, +-/* 01d720 */ TBL(1)|129, TBL(1)|130, TBL(1)|131, TBL(1)|132, TBL(1)|133, TBL(1)|134, TBL(1)|135, TBL(1)|136, +-/* 01d728 */ TBL(1)|137, TBL(1)|138, TBL(1)|139, TBL(1)|140, TBL(1)|141, TBL(1)|132, TBL(1)|142, TBL(1)|143, +-/* 01d730 */ TBL(1)|144, TBL(1)|145, TBL(1)|146, TBL(1)|147, TBL(1)|148, TBL(1)|391, TBL(1)|149, TBL(1)|150, +-/* 01d738 */ TBL(1)|151, TBL(1)|152, TBL(1)|153, TBL(1)|154, TBL(1)|155, TBL(1)|156, TBL(1)|157, TBL(1)|158, +-/* 01d740 */ TBL(1)|159, TBL(1)|160, TBL(1)|161, TBL(1)|162, TBL(1)|163, TBL(1)|164, TBL(1)|165, TBL(1)|166, +-/* 01d748 */ TBL(1)|167, TBL(1)|168, TBL(1)|169, TBL(1)|170, TBL(1)|171, TBL(1)|172, TBL(1)|173, TBL(1)|390, +-/* 01d750 */ TBL(1)|153, TBL(1)|156, TBL(1)|158, TBL(1)|170, TBL(1)|165, TBL(1)|164, TBL(1)|125, TBL(1)|126, +-/* 01d758 */ TBL(1)|127, TBL(1)|128, TBL(1)|129, TBL(1)|130, TBL(1)|131, TBL(1)|132, TBL(1)|133, TBL(1)|134, +-/* 01d760 */ TBL(1)|135, TBL(1)|136, TBL(1)|137, TBL(1)|138, TBL(1)|139, TBL(1)|140, TBL(1)|141, TBL(1)|132, +-/* 01d768 */ TBL(1)|142, TBL(1)|143, TBL(1)|144, TBL(1)|145, TBL(1)|146, TBL(1)|147, TBL(1)|148, TBL(1)|391, +-/* 01d770 */ TBL(1)|149, TBL(1)|150, TBL(1)|151, TBL(1)|152, TBL(1)|153, TBL(1)|154, TBL(1)|155, TBL(1)|156, +-/* 01d778 */ TBL(1)|157, TBL(1)|158, TBL(1)|159, TBL(1)|160, TBL(1)|161, TBL(1)|162, TBL(1)|163, TBL(1)|164, +-/* 01d780 */ TBL(1)|165, TBL(1)|166, TBL(1)|167, TBL(1)|168, TBL(1)|169, TBL(1)|170, TBL(1)|171, TBL(1)|172, +-/* 01d788 */ TBL(1)|173, TBL(1)|390, TBL(1)|153, TBL(1)|156, TBL(1)|158, TBL(1)|170, TBL(1)|165, TBL(1)|164, +-/* 01d790 */ TBL(1)|125, TBL(1)|126, TBL(1)|127, TBL(1)|128, TBL(1)|129, TBL(1)|130, TBL(1)|131, TBL(1)|132, +-/* 01d798 */ TBL(1)|133, TBL(1)|134, TBL(1)|135, TBL(1)|136, TBL(1)|137, TBL(1)|138, TBL(1)|139, TBL(1)|140, +-/* 01d7a0 */ TBL(1)|141, TBL(1)|132, TBL(1)|142, TBL(1)|143, TBL(1)|144, TBL(1)|145, TBL(1)|146, TBL(1)|147, +-/* 01d7a8 */ TBL(1)|148, TBL(1)|391, TBL(1)|149, TBL(1)|150, TBL(1)|151, TBL(1)|152, TBL(1)|153, TBL(1)|154, +-/* 01d7b0 */ TBL(1)|155, TBL(1)|156, TBL(1)|157, TBL(1)|158, TBL(1)|159, TBL(1)|160, TBL(1)|161, TBL(1)|162, +-/* 01d7b8 */ TBL(1)|163, TBL(1)|164, TBL(1)|165, TBL(1)|166, TBL(1)|167, TBL(1)|168, TBL(1)|169, TBL(1)|170, +-/* 01d7c0 */ TBL(1)|171, TBL(1)|172, TBL(1)|173, TBL(1)|390, TBL(1)|153, TBL(1)|156, TBL(1)|158, TBL(1)|170, +-/* 01d7c8 */ TBL(1)|165, TBL(1)|164, TBL(1)|174, TBL(1)|175, 0, 0, TBL(1)|8, TBL(1)|9, ++/* 01d700 */ TBL(1)|196, TBL(1)|197, TBL(1)|198, TBL(1)|199, TBL(1)|200, TBL(1)|201, TBL(1)|202, TBL(1)|203, ++/* 01d708 */ TBL(1)|204, TBL(1)|205, TBL(1)|206, TBL(1)|207, TBL(1)|208, TBL(1)|209, TBL(1)|210, TBL(1)|211, ++/* 01d710 */ TBL(1)|212, TBL(1)|213, TBL(1)|214, TBL(1)|215, TBL(1)|216, TBL(1)|440, TBL(1)|196, TBL(1)|199, ++/* 01d718 */ TBL(1)|201, TBL(1)|213, TBL(1)|208, TBL(1)|207, TBL(1)|168, TBL(1)|169, TBL(1)|170, TBL(1)|171, ++/* 01d720 */ TBL(1)|172, TBL(1)|173, TBL(1)|174, TBL(1)|175, TBL(1)|176, TBL(1)|177, TBL(1)|178, TBL(1)|179, ++/* 01d728 */ TBL(1)|180, TBL(1)|181, TBL(1)|182, TBL(1)|183, TBL(1)|184, TBL(1)|175, TBL(1)|185, TBL(1)|186, ++/* 01d730 */ TBL(1)|187, TBL(1)|188, TBL(1)|189, TBL(1)|190, TBL(1)|191, TBL(1)|441, TBL(1)|192, TBL(1)|193, ++/* 01d738 */ TBL(1)|194, TBL(1)|195, TBL(1)|196, TBL(1)|197, TBL(1)|198, TBL(1)|199, TBL(1)|200, TBL(1)|201, ++/* 01d740 */ TBL(1)|202, TBL(1)|203, TBL(1)|204, TBL(1)|205, TBL(1)|206, TBL(1)|207, TBL(1)|208, TBL(1)|209, ++/* 01d748 */ TBL(1)|210, TBL(1)|211, TBL(1)|212, TBL(1)|213, TBL(1)|214, TBL(1)|215, TBL(1)|216, TBL(1)|440, ++/* 01d750 */ TBL(1)|196, TBL(1)|199, TBL(1)|201, TBL(1)|213, TBL(1)|208, TBL(1)|207, TBL(1)|168, TBL(1)|169, ++/* 01d758 */ TBL(1)|170, TBL(1)|171, TBL(1)|172, TBL(1)|173, TBL(1)|174, TBL(1)|175, TBL(1)|176, TBL(1)|177, ++/* 01d760 */ TBL(1)|178, TBL(1)|179, TBL(1)|180, TBL(1)|181, TBL(1)|182, TBL(1)|183, TBL(1)|184, TBL(1)|175, ++/* 01d768 */ TBL(1)|185, TBL(1)|186, TBL(1)|187, TBL(1)|188, TBL(1)|189, TBL(1)|190, TBL(1)|191, TBL(1)|441, ++/* 01d770 */ TBL(1)|192, TBL(1)|193, TBL(1)|194, TBL(1)|195, TBL(1)|196, TBL(1)|197, TBL(1)|198, TBL(1)|199, ++/* 01d778 */ TBL(1)|200, TBL(1)|201, TBL(1)|202, TBL(1)|203, TBL(1)|204, TBL(1)|205, TBL(1)|206, TBL(1)|207, ++/* 01d780 */ TBL(1)|208, TBL(1)|209, TBL(1)|210, TBL(1)|211, TBL(1)|212, TBL(1)|213, TBL(1)|214, TBL(1)|215, ++/* 01d788 */ TBL(1)|216, TBL(1)|440, TBL(1)|196, TBL(1)|199, TBL(1)|201, TBL(1)|213, TBL(1)|208, TBL(1)|207, ++/* 01d790 */ TBL(1)|168, TBL(1)|169, TBL(1)|170, TBL(1)|171, TBL(1)|172, TBL(1)|173, TBL(1)|174, TBL(1)|175, ++/* 01d798 */ TBL(1)|176, TBL(1)|177, TBL(1)|178, TBL(1)|179, TBL(1)|180, TBL(1)|181, TBL(1)|182, TBL(1)|183, ++/* 01d7a0 */ TBL(1)|184, TBL(1)|175, TBL(1)|185, TBL(1)|186, TBL(1)|187, TBL(1)|188, TBL(1)|189, TBL(1)|190, ++/* 01d7a8 */ TBL(1)|191, TBL(1)|441, TBL(1)|192, TBL(1)|193, TBL(1)|194, TBL(1)|195, TBL(1)|196, TBL(1)|197, ++/* 01d7b0 */ TBL(1)|198, TBL(1)|199, TBL(1)|200, TBL(1)|201, TBL(1)|202, TBL(1)|203, TBL(1)|204, TBL(1)|205, ++/* 01d7b8 */ TBL(1)|206, TBL(1)|207, TBL(1)|208, TBL(1)|209, TBL(1)|210, TBL(1)|211, TBL(1)|212, TBL(1)|213, ++/* 01d7c0 */ TBL(1)|214, TBL(1)|215, TBL(1)|216, TBL(1)|440, TBL(1)|196, TBL(1)|199, TBL(1)|201, TBL(1)|213, ++/* 01d7c8 */ TBL(1)|208, TBL(1)|207, TBL(1)|217, TBL(1)|218, 0, 0, TBL(1)|8, TBL(1)|9, + /* 01d7d0 */ TBL(1)|10, TBL(1)|11, TBL(1)|12, TBL(1)|13, TBL(1)|14, TBL(1)|15, TBL(1)|16, TBL(1)|17, + /* 01d7d8 */ TBL(1)|8, TBL(1)|9, TBL(1)|10, TBL(1)|11, TBL(1)|12, TBL(1)|13, TBL(1)|14, TBL(1)|15, + /* 01d7e0 */ TBL(1)|16, TBL(1)|17, TBL(1)|8, TBL(1)|9, TBL(1)|10, TBL(1)|11, TBL(1)|12, TBL(1)|13, +@@ -2412,30 +2453,30 @@ static const uint16_t UNWIF_compat_01_d7 [256] = { + }; + + static const uint16_t UNWIF_compat_01_ee [256] = { +-/* 01ee00 */ TBL(1)|191, TBL(1)|192, TBL(1)|196, TBL(1)|199, 0, TBL(1)|218, TBL(1)|202, TBL(1)|197, +-/* 01ee08 */ TBL(1)|207, TBL(1)|220, TBL(1)|213, TBL(1)|214, TBL(1)|215, TBL(1)|216, TBL(1)|203, TBL(1)|209, +-/* 01ee10 */ TBL(1)|211, TBL(1)|205, TBL(1)|212, TBL(1)|201, TBL(1)|204, TBL(1)|194, TBL(1)|195, TBL(1)|198, +-/* 01ee18 */ TBL(1)|200, TBL(1)|206, TBL(1)|208, TBL(1)|210, TBL(1)|221, TBL(1)|248, TBL(1)|240, TBL(1)|222, +-/* 01ee20 */ 0, TBL(1)|192, TBL(1)|196, 0, TBL(1)|217, 0, 0, TBL(1)|197, +-/* 01ee28 */ 0, TBL(1)|220, TBL(1)|213, TBL(1)|214, TBL(1)|215, TBL(1)|216, TBL(1)|203, TBL(1)|209, +-/* 01ee30 */ TBL(1)|211, TBL(1)|205, TBL(1)|212, 0, TBL(1)|204, TBL(1)|194, TBL(1)|195, TBL(1)|198, +-/* 01ee38 */ 0, TBL(1)|206, 0, TBL(1)|210, 0, 0, 0, 0, +-/* 01ee40 */ 0, 0, TBL(1)|196, 0, 0, 0, 0, TBL(1)|197, +-/* 01ee48 */ 0, TBL(1)|220, 0, TBL(1)|214, 0, TBL(1)|216, TBL(1)|203, TBL(1)|209, +-/* 01ee50 */ 0, TBL(1)|205, TBL(1)|212, 0, TBL(1)|204, 0, 0, TBL(1)|198, +-/* 01ee58 */ 0, TBL(1)|206, 0, TBL(1)|210, 0, TBL(1)|248, 0, TBL(1)|222, +-/* 01ee60 */ 0, TBL(1)|192, TBL(1)|196, 0, TBL(1)|217, 0, 0, TBL(1)|197, +-/* 01ee68 */ TBL(1)|207, TBL(1)|220, TBL(1)|213, 0, TBL(1)|215, TBL(1)|216, TBL(1)|203, TBL(1)|209, +-/* 01ee70 */ TBL(1)|211, TBL(1)|205, TBL(1)|212, 0, TBL(1)|204, TBL(1)|194, TBL(1)|195, TBL(1)|198, +-/* 01ee78 */ 0, TBL(1)|206, TBL(1)|208, TBL(1)|210, TBL(1)|221, 0, TBL(1)|240, 0, +-/* 01ee80 */ TBL(1)|191, TBL(1)|192, TBL(1)|196, TBL(1)|199, TBL(1)|217, TBL(1)|218, TBL(1)|202, TBL(1)|197, +-/* 01ee88 */ TBL(1)|207, TBL(1)|220, 0, TBL(1)|214, TBL(1)|215, TBL(1)|216, TBL(1)|203, TBL(1)|209, +-/* 01ee90 */ TBL(1)|211, TBL(1)|205, TBL(1)|212, TBL(1)|201, TBL(1)|204, TBL(1)|194, TBL(1)|195, TBL(1)|198, +-/* 01ee98 */ TBL(1)|200, TBL(1)|206, TBL(1)|208, TBL(1)|210, 0, 0, 0, 0, +-/* 01eea0 */ 0, TBL(1)|192, TBL(1)|196, TBL(1)|199, 0, TBL(1)|218, TBL(1)|202, TBL(1)|197, +-/* 01eea8 */ TBL(1)|207, TBL(1)|220, 0, TBL(1)|214, TBL(1)|215, TBL(1)|216, TBL(1)|203, TBL(1)|209, +-/* 01eeb0 */ TBL(1)|211, TBL(1)|205, TBL(1)|212, TBL(1)|201, TBL(1)|204, TBL(1)|194, TBL(1)|195, TBL(1)|198, +-/* 01eeb8 */ TBL(1)|200, TBL(1)|206, TBL(1)|208, TBL(1)|210, 0, 0, 0, 0, ++/* 01ee00 */ TBL(1)|234, TBL(1)|235, TBL(1)|239, TBL(1)|242, 0, TBL(1)|261, TBL(1)|245, TBL(1)|240, ++/* 01ee08 */ TBL(1)|250, TBL(1)|263, TBL(1)|256, TBL(1)|257, TBL(1)|258, TBL(1)|259, TBL(1)|246, TBL(1)|252, ++/* 01ee10 */ TBL(1)|254, TBL(1)|248, TBL(1)|255, TBL(1)|244, TBL(1)|247, TBL(1)|237, TBL(1)|238, TBL(1)|241, ++/* 01ee18 */ TBL(1)|243, TBL(1)|249, TBL(1)|251, TBL(1)|253, TBL(1)|264, TBL(1)|291, TBL(1)|283, TBL(1)|265, ++/* 01ee20 */ 0, TBL(1)|235, TBL(1)|239, 0, TBL(1)|260, 0, 0, TBL(1)|240, ++/* 01ee28 */ 0, TBL(1)|263, TBL(1)|256, TBL(1)|257, TBL(1)|258, TBL(1)|259, TBL(1)|246, TBL(1)|252, ++/* 01ee30 */ TBL(1)|254, TBL(1)|248, TBL(1)|255, 0, TBL(1)|247, TBL(1)|237, TBL(1)|238, TBL(1)|241, ++/* 01ee38 */ 0, TBL(1)|249, 0, TBL(1)|253, 0, 0, 0, 0, ++/* 01ee40 */ 0, 0, TBL(1)|239, 0, 0, 0, 0, TBL(1)|240, ++/* 01ee48 */ 0, TBL(1)|263, 0, TBL(1)|257, 0, TBL(1)|259, TBL(1)|246, TBL(1)|252, ++/* 01ee50 */ 0, TBL(1)|248, TBL(1)|255, 0, TBL(1)|247, 0, 0, TBL(1)|241, ++/* 01ee58 */ 0, TBL(1)|249, 0, TBL(1)|253, 0, TBL(1)|291, 0, TBL(1)|265, ++/* 01ee60 */ 0, TBL(1)|235, TBL(1)|239, 0, TBL(1)|260, 0, 0, TBL(1)|240, ++/* 01ee68 */ TBL(1)|250, TBL(1)|263, TBL(1)|256, 0, TBL(1)|258, TBL(1)|259, TBL(1)|246, TBL(1)|252, ++/* 01ee70 */ TBL(1)|254, TBL(1)|248, TBL(1)|255, 0, TBL(1)|247, TBL(1)|237, TBL(1)|238, TBL(1)|241, ++/* 01ee78 */ 0, TBL(1)|249, TBL(1)|251, TBL(1)|253, TBL(1)|264, 0, TBL(1)|283, 0, ++/* 01ee80 */ TBL(1)|234, TBL(1)|235, TBL(1)|239, TBL(1)|242, TBL(1)|260, TBL(1)|261, TBL(1)|245, TBL(1)|240, ++/* 01ee88 */ TBL(1)|250, TBL(1)|263, 0, TBL(1)|257, TBL(1)|258, TBL(1)|259, TBL(1)|246, TBL(1)|252, ++/* 01ee90 */ TBL(1)|254, TBL(1)|248, TBL(1)|255, TBL(1)|244, TBL(1)|247, TBL(1)|237, TBL(1)|238, TBL(1)|241, ++/* 01ee98 */ TBL(1)|243, TBL(1)|249, TBL(1)|251, TBL(1)|253, 0, 0, 0, 0, ++/* 01eea0 */ 0, TBL(1)|235, TBL(1)|239, TBL(1)|242, 0, TBL(1)|261, TBL(1)|245, TBL(1)|240, ++/* 01eea8 */ TBL(1)|250, TBL(1)|263, 0, TBL(1)|257, TBL(1)|258, TBL(1)|259, TBL(1)|246, TBL(1)|252, ++/* 01eeb0 */ TBL(1)|254, TBL(1)|248, TBL(1)|255, TBL(1)|244, TBL(1)|247, TBL(1)|237, TBL(1)|238, TBL(1)|241, ++/* 01eeb8 */ TBL(1)|243, TBL(1)|249, TBL(1)|251, TBL(1)|253, 0, 0, 0, 0, + /* 01eec0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 01eec8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 01eed0 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -2482,17 +2523,17 @@ static const uint16_t UNWIF_compat_01_f1 [256] = { + }; + + static const uint16_t UNWIF_compat_01_f2 [256] = { +-/* 01f200 */ TBL(2)|893, TBL(2)|905, TBL(1)|527, 0, 0, 0, 0, 0, ++/* 01f200 */ TBL(2)|893, TBL(2)|905, TBL(1)|578, 0, 0, 0, 0, 0, + /* 01f208 */ 0, 0, 0, 0, 0, 0, 0, 0, +-/* 01f210 */ TBL(1)|978, TBL(1)|864, TBL(1)|771, TBL(2)|915, TBL(1)|661, TBL(1)|842, TBL(1)|1434, TBL(1)|846, +-/* 01f218 */ TBL(1)|664, TBL(1)|1028, TBL(1)|1146, TBL(1)|1018, TBL(1)|728, TBL(1)|937, TBL(1)|702, TBL(1)|1020, +-/* 01f220 */ TBL(1)|723, TBL(1)|1300, TBL(1)|1199, TBL(1)|1457, TBL(1)|835, TBL(1)|785, TBL(1)|1127, TBL(1)|981, +-/* 01f228 */ TBL(1)|992, TBL(1)|638, TBL(1)|641, TBL(1)|1489, TBL(1)|901, TBL(1)|648, TBL(1)|778, TBL(1)|989, +-/* 01f230 */ TBL(1)|1467, TBL(1)|979, TBL(1)|1258, TBL(1)|1273, TBL(1)|780, TBL(1)|1119, TBL(1)|1041, TBL(1)|1040, +-/* 01f238 */ TBL(1)|1204, TBL(1)|729, TBL(1)|804, TBL(1)|1503, 0, 0, 0, 0, ++/* 01f210 */ TBL(1)|1029, TBL(1)|915, TBL(1)|822, TBL(2)|915, TBL(1)|712, TBL(1)|893, TBL(1)|1485, TBL(1)|897, ++/* 01f218 */ TBL(1)|715, TBL(1)|1079, TBL(1)|1197, TBL(1)|1069, TBL(1)|779, TBL(1)|988, TBL(1)|753, TBL(1)|1071, ++/* 01f220 */ TBL(1)|774, TBL(1)|1351, TBL(1)|1250, TBL(1)|1508, TBL(1)|886, TBL(1)|836, TBL(1)|1178, TBL(1)|1032, ++/* 01f228 */ TBL(1)|1043, TBL(1)|689, TBL(1)|692, TBL(1)|1540, TBL(1)|952, TBL(1)|699, TBL(1)|829, TBL(1)|1040, ++/* 01f230 */ TBL(1)|1518, TBL(1)|1030, TBL(1)|1309, TBL(1)|1324, TBL(1)|831, TBL(1)|1170, TBL(1)|1092, TBL(1)|1091, ++/* 01f238 */ TBL(1)|1255, TBL(1)|780, TBL(1)|855, TBL(1)|1554, 0, 0, 0, 0, + /* 01f240 */ TBL(3)|520, TBL(3)|514, TBL(3)|515, TBL(3)|517, TBL(3)|521, TBL(3)|518, TBL(3)|522, TBL(3)|516, + /* 01f248 */ TBL(3)|519, 0, 0, 0, 0, 0, 0, 0, +-/* 01f250 */ TBL(1)|938, TBL(1)|776, 0, 0, 0, 0, 0, 0, ++/* 01f250 */ TBL(1)|989, TBL(1)|827, 0, 0, 0, 0, 0, 0, + /* 01f258 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 01f260 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 01f268 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -2552,80 +2593,80 @@ static const uint16_t UNWIF_compat_01_fb [256] = { + }; + + static const uint16_t UNWIF_compat_02_f8 [256] = { +-/* 02f800 */ TBL(1)|653, TBL(1)|651, TBL(1)|655, TBL(1)|366, TBL(1)|672, TBL(1)|676, TBL(1)|677, TBL(1)|679, +-/* 02f808 */ TBL(1)|681, TBL(1)|682, TBL(1)|685, TBL(1)|683, TBL(1)|571, TBL(1)|372, TBL(1)|690, TBL(1)|691, +-/* 02f810 */ TBL(1)|692, TBL(1)|699, TBL(1)|369, TBL(1)|572, TBL(1)|694, TBL(1)|702, TBL(1)|371, TBL(1)|706, +-/* 02f818 */ TBL(1)|708, TBL(1)|668, TBL(1)|710, TBL(1)|711, TBL(1)|478, TBL(1)|718, TBL(1)|720, TBL(1)|574, +-/* 02f820 */ TBL(1)|726, TBL(1)|727, TBL(1)|729, TBL(1)|730, TBL(1)|575, TBL(1)|736, TBL(1)|737, TBL(1)|740, +-/* 02f828 */ TBL(1)|743, TBL(1)|744, TBL(1)|745, TBL(1)|747, TBL(1)|755, TBL(1)|756, TBL(1)|758, TBL(1)|762, +-/* 02f830 */ TBL(1)|764, TBL(1)|765, TBL(1)|765, TBL(1)|765, TBL(1)|375, TBL(1)|1139, TBL(1)|770, TBL(1)|772, +-/* 02f838 */ TBL(1)|377, TBL(1)|775, TBL(1)|777, TBL(1)|779, TBL(1)|789, TBL(1)|784, TBL(1)|787, TBL(1)|788, +-/* 02f840 */ TBL(1)|790, TBL(1)|792, TBL(1)|793, TBL(1)|795, TBL(1)|797, TBL(1)|798, TBL(1)|798, TBL(1)|800, +-/* 02f848 */ TBL(1)|802, TBL(1)|803, TBL(1)|806, TBL(1)|815, TBL(1)|808, TBL(1)|816, TBL(1)|809, TBL(1)|811, +-/* 02f850 */ TBL(1)|721, TBL(1)|834, TBL(1)|820, TBL(1)|821, TBL(1)|822, TBL(1)|819, TBL(1)|824, TBL(1)|823, +-/* 02f858 */ TBL(1)|829, TBL(1)|378, TBL(1)|836, TBL(1)|837, TBL(1)|839, TBL(1)|842, TBL(1)|844, TBL(1)|851, +-/* 02f860 */ TBL(1)|379, TBL(1)|380, TBL(1)|854, TBL(1)|855, TBL(1)|856, TBL(1)|853, TBL(1)|858, TBL(1)|576, +-/* 02f868 */ TBL(1)|577, TBL(1)|860, TBL(1)|862, TBL(1)|862, TBL(1)|385, TBL(1)|869, TBL(1)|870, TBL(1)|871, +-/* 02f870 */ TBL(1)|873, TBL(1)|386, TBL(1)|875, TBL(1)|876, TBL(1)|930, TBL(1)|878, TBL(1)|578, TBL(1)|881, +-/* 02f878 */ TBL(1)|885, TBL(1)|888, TBL(1)|887, TBL(1)|388, TBL(1)|890, TBL(1)|389, TBL(1)|893, TBL(1)|892, +-/* 02f880 */ TBL(1)|894, TBL(1)|898, TBL(1)|899, TBL(1)|579, TBL(1)|903, TBL(1)|905, TBL(1)|906, TBL(1)|907, +-/* 02f888 */ TBL(1)|580, TBL(1)|394, TBL(1)|581, TBL(1)|914, TBL(1)|915, TBL(1)|916, TBL(1)|918, TBL(1)|490, +-/* 02f890 */ TBL(1)|924, TBL(1)|396, TBL(1)|396, TBL(1)|1348, TBL(1)|928, TBL(1)|928, TBL(1)|582, TBL(1)|403, +-/* 02f898 */ TBL(1)|448, TBL(1)|932, TBL(1)|934, TBL(1)|583, TBL(1)|939, TBL(1)|943, TBL(1)|944, TBL(1)|946, +-/* 02f8a0 */ TBL(1)|950, TBL(1)|585, TBL(1)|584, TBL(1)|951, TBL(1)|397, TBL(1)|952, TBL(1)|957, TBL(1)|958, +-/* 02f8a8 */ TBL(1)|959, TBL(1)|958, TBL(1)|962, TBL(1)|963, TBL(1)|967, TBL(1)|965, TBL(1)|966, TBL(1)|968, +-/* 02f8b0 */ TBL(1)|969, TBL(1)|970, TBL(1)|973, TBL(1)|974, TBL(1)|980, TBL(1)|982, TBL(1)|986, TBL(1)|991, +-/* 02f8b8 */ TBL(1)|400, TBL(1)|990, TBL(1)|987, TBL(1)|993, TBL(1)|995, TBL(1)|1000, TBL(1)|401, TBL(1)|1002, +-/* 02f8c0 */ TBL(1)|999, TBL(1)|997, TBL(1)|586, TBL(1)|1004, TBL(1)|1006, TBL(1)|1008, TBL(1)|1005, TBL(1)|587, +-/* 02f8c8 */ TBL(1)|1012, TBL(1)|1014, TBL(1)|402, TBL(1)|1025, TBL(1)|1038, TBL(1)|1029, TBL(1)|590, TBL(1)|1032, +-/* 02f8d0 */ TBL(1)|589, TBL(1)|588, TBL(1)|703, TBL(1)|704, TBL(1)|1039, TBL(1)|1033, TBL(1)|1337, TBL(1)|615, +-/* 02f8d8 */ TBL(1)|1042, TBL(1)|1043, TBL(1)|1044, TBL(1)|1049, TBL(1)|1047, TBL(1)|407, TBL(1)|591, TBL(1)|1054, +-/* 02f8e0 */ TBL(1)|1051, TBL(1)|1058, TBL(1)|1060, TBL(1)|409, TBL(1)|1061, TBL(1)|1056, TBL(1)|1063, TBL(1)|592, +-/* 02f8e8 */ TBL(1)|1064, TBL(1)|1065, TBL(1)|1066, TBL(1)|1069, TBL(1)|410, TBL(1)|1071, TBL(1)|593, TBL(1)|1074, +-/* 02f8f0 */ TBL(1)|411, TBL(1)|1075, TBL(1)|594, TBL(1)|1078, TBL(1)|1081, TBL(1)|1084, TBL(1)|1085, TBL(1)|412, +-/* 02f8f8 */ TBL(1)|387, TBL(1)|413, TBL(1)|1093, TBL(1)|414, TBL(1)|1096, TBL(1)|1098, TBL(1)|1094, TBL(1)|1101 ++/* 02f800 */ TBL(1)|704, TBL(1)|702, TBL(1)|706, TBL(1)|416, TBL(1)|723, TBL(1)|727, TBL(1)|728, TBL(1)|730, ++/* 02f808 */ TBL(1)|732, TBL(1)|733, TBL(1)|736, TBL(1)|734, TBL(1)|622, TBL(1)|422, TBL(1)|741, TBL(1)|742, ++/* 02f810 */ TBL(1)|743, TBL(1)|750, TBL(1)|419, TBL(1)|623, TBL(1)|745, TBL(1)|753, TBL(1)|421, TBL(1)|757, ++/* 02f818 */ TBL(1)|759, TBL(1)|719, TBL(1)|761, TBL(1)|762, TBL(1)|528, TBL(1)|769, TBL(1)|771, TBL(1)|625, ++/* 02f820 */ TBL(1)|777, TBL(1)|778, TBL(1)|780, TBL(1)|781, TBL(1)|626, TBL(1)|787, TBL(1)|788, TBL(1)|791, ++/* 02f828 */ TBL(1)|794, TBL(1)|795, TBL(1)|796, TBL(1)|798, TBL(1)|806, TBL(1)|807, TBL(1)|809, TBL(1)|813, ++/* 02f830 */ TBL(1)|815, TBL(1)|816, TBL(1)|816, TBL(1)|816, TBL(1)|425, TBL(1)|1190, TBL(1)|821, TBL(1)|823, ++/* 02f838 */ TBL(1)|427, TBL(1)|826, TBL(1)|828, TBL(1)|830, TBL(1)|840, TBL(1)|835, TBL(1)|838, TBL(1)|839, ++/* 02f840 */ TBL(1)|841, TBL(1)|843, TBL(1)|844, TBL(1)|846, TBL(1)|848, TBL(1)|849, TBL(1)|849, TBL(1)|851, ++/* 02f848 */ TBL(1)|853, TBL(1)|854, TBL(1)|857, TBL(1)|866, TBL(1)|859, TBL(1)|867, TBL(1)|860, TBL(1)|862, ++/* 02f850 */ TBL(1)|772, TBL(1)|885, TBL(1)|871, TBL(1)|872, TBL(1)|873, TBL(1)|870, TBL(1)|875, TBL(1)|874, ++/* 02f858 */ TBL(1)|880, TBL(1)|428, TBL(1)|887, TBL(1)|888, TBL(1)|890, TBL(1)|893, TBL(1)|895, TBL(1)|902, ++/* 02f860 */ TBL(1)|429, TBL(1)|430, TBL(1)|905, TBL(1)|906, TBL(1)|907, TBL(1)|904, TBL(1)|909, TBL(1)|627, ++/* 02f868 */ TBL(1)|628, TBL(1)|911, TBL(1)|913, TBL(1)|913, TBL(1)|435, TBL(1)|920, TBL(1)|921, TBL(1)|922, ++/* 02f870 */ TBL(1)|924, TBL(1)|436, TBL(1)|926, TBL(1)|927, TBL(1)|981, TBL(1)|929, TBL(1)|629, TBL(1)|932, ++/* 02f878 */ TBL(1)|936, TBL(1)|939, TBL(1)|938, TBL(1)|438, TBL(1)|941, TBL(1)|439, TBL(1)|944, TBL(1)|943, ++/* 02f880 */ TBL(1)|945, TBL(1)|949, TBL(1)|950, TBL(1)|630, TBL(1)|954, TBL(1)|956, TBL(1)|957, TBL(1)|958, ++/* 02f888 */ TBL(1)|631, TBL(1)|444, TBL(1)|632, TBL(1)|965, TBL(1)|966, TBL(1)|967, TBL(1)|969, TBL(1)|540, ++/* 02f890 */ TBL(1)|975, TBL(1)|446, TBL(1)|446, TBL(1)|1399, TBL(1)|979, TBL(1)|979, TBL(1)|633, TBL(1)|453, ++/* 02f898 */ TBL(1)|498, TBL(1)|983, TBL(1)|985, TBL(1)|634, TBL(1)|990, TBL(1)|994, TBL(1)|995, TBL(1)|997, ++/* 02f8a0 */ TBL(1)|1001, TBL(1)|636, TBL(1)|635, TBL(1)|1002, TBL(1)|447, TBL(1)|1003, TBL(1)|1008, TBL(1)|1009, ++/* 02f8a8 */ TBL(1)|1010, TBL(1)|1009, TBL(1)|1013, TBL(1)|1014, TBL(1)|1018, TBL(1)|1016, TBL(1)|1017, TBL(1)|1019, ++/* 02f8b0 */ TBL(1)|1020, TBL(1)|1021, TBL(1)|1024, TBL(1)|1025, TBL(1)|1031, TBL(1)|1033, TBL(1)|1037, TBL(1)|1042, ++/* 02f8b8 */ TBL(1)|450, TBL(1)|1041, TBL(1)|1038, TBL(1)|1044, TBL(1)|1046, TBL(1)|1051, TBL(1)|451, TBL(1)|1053, ++/* 02f8c0 */ TBL(1)|1050, TBL(1)|1048, TBL(1)|637, TBL(1)|1055, TBL(1)|1057, TBL(1)|1059, TBL(1)|1056, TBL(1)|638, ++/* 02f8c8 */ TBL(1)|1063, TBL(1)|1065, TBL(1)|452, TBL(1)|1076, TBL(1)|1089, TBL(1)|1080, TBL(1)|641, TBL(1)|1083, ++/* 02f8d0 */ TBL(1)|640, TBL(1)|639, TBL(1)|754, TBL(1)|755, TBL(1)|1090, TBL(1)|1084, TBL(1)|1388, TBL(1)|666, ++/* 02f8d8 */ TBL(1)|1093, TBL(1)|1094, TBL(1)|1095, TBL(1)|1100, TBL(1)|1098, TBL(1)|457, TBL(1)|642, TBL(1)|1105, ++/* 02f8e0 */ TBL(1)|1102, TBL(1)|1109, TBL(1)|1111, TBL(1)|459, TBL(1)|1112, TBL(1)|1107, TBL(1)|1114, TBL(1)|643, ++/* 02f8e8 */ TBL(1)|1115, TBL(1)|1116, TBL(1)|1117, TBL(1)|1120, TBL(1)|460, TBL(1)|1122, TBL(1)|644, TBL(1)|1125, ++/* 02f8f0 */ TBL(1)|461, TBL(1)|1126, TBL(1)|645, TBL(1)|1129, TBL(1)|1132, TBL(1)|1135, TBL(1)|1136, TBL(1)|462, ++/* 02f8f8 */ TBL(1)|437, TBL(1)|463, TBL(1)|1144, TBL(1)|464, TBL(1)|1147, TBL(1)|1149, TBL(1)|1145, TBL(1)|1152 + }; + + static const uint16_t UNWIF_compat_02_f9 [256] = { +-/* 02f900 */ TBL(1)|1105, TBL(1)|1109, TBL(1)|1106, TBL(1)|1107, TBL(1)|1110, TBL(1)|1111, TBL(1)|415, TBL(1)|1104, +-/* 02f908 */ TBL(1)|1117, TBL(1)|1118, TBL(1)|595, TBL(1)|1123, TBL(1)|1122, TBL(1)|416, TBL(1)|1115, TBL(1)|1130, +-/* 02f910 */ TBL(1)|417, TBL(1)|418, TBL(1)|1131, TBL(1)|1136, TBL(1)|1135, TBL(1)|1134, TBL(1)|596, TBL(1)|1137, +-/* 02f918 */ TBL(1)|1141, TBL(1)|1140, TBL(1)|1143, TBL(1)|370, TBL(1)|1147, TBL(1)|419, TBL(1)|1150, TBL(1)|421, +-/* 02f920 */ TBL(1)|1155, TBL(1)|1158, TBL(1)|1163, TBL(1)|422, TBL(1)|1168, TBL(1)|1169, TBL(1)|423, TBL(1)|424, +-/* 02f928 */ TBL(1)|1176, TBL(1)|1180, TBL(1)|597, TBL(1)|1181, TBL(1)|598, TBL(1)|598, TBL(1)|1187, TBL(1)|1188, +-/* 02f930 */ TBL(1)|1190, TBL(1)|1191, TBL(1)|1194, TBL(1)|599, TBL(1)|1200, TBL(1)|425, TBL(1)|1207, TBL(1)|426, +-/* 02f938 */ TBL(1)|1210, TBL(1)|395, TBL(1)|1214, TBL(1)|427, TBL(1)|428, TBL(1)|430, TBL(1)|600, TBL(1)|601, +-/* 02f940 */ TBL(1)|1228, TBL(1)|432, TBL(1)|431, TBL(1)|433, TBL(1)|434, TBL(1)|1230, TBL(1)|1231, TBL(1)|1231, +-/* 02f948 */ TBL(1)|1233, TBL(1)|603, TBL(1)|1234, TBL(1)|604, TBL(1)|605, TBL(1)|436, TBL(1)|1239, TBL(1)|1241, +-/* 02f950 */ TBL(1)|1244, TBL(1)|606, TBL(1)|437, TBL(1)|1253, TBL(1)|438, TBL(1)|439, TBL(1)|1261, TBL(1)|1267, +-/* 02f958 */ TBL(1)|607, TBL(1)|1269, TBL(1)|1270, TBL(1)|1271, TBL(1)|440, TBL(1)|442, TBL(1)|442, TBL(1)|1277, +-/* 02f960 */ TBL(1)|608, TBL(1)|443, TBL(1)|1282, TBL(1)|1283, TBL(1)|609, TBL(1)|444, TBL(1)|1290, TBL(1)|610, +-/* 02f968 */ TBL(1)|1294, TBL(1)|1292, TBL(1)|1296, TBL(1)|447, TBL(1)|1302, TBL(1)|611, TBL(1)|1305, TBL(1)|1307, +-/* 02f970 */ TBL(1)|1311, TBL(1)|612, TBL(1)|449, TBL(1)|450, TBL(1)|613, TBL(1)|451, TBL(1)|1317, TBL(1)|452, +-/* 02f978 */ TBL(1)|1320, TBL(1)|1323, TBL(1)|1325, TBL(1)|453, TBL(1)|454, TBL(1)|1330, TBL(1)|455, TBL(1)|1332, +-/* 02f980 */ TBL(1)|404, TBL(1)|614, TBL(1)|1338, TBL(1)|1339, TBL(1)|616, TBL(1)|1340, TBL(1)|859, TBL(1)|456, +-/* 02f988 */ TBL(1)|457, TBL(1)|405, TBL(1)|406, TBL(1)|1348, TBL(1)|1349, TBL(1)|1483, TBL(1)|617, TBL(1)|1360, +-/* 02f990 */ TBL(1)|1359, TBL(1)|1361, TBL(1)|734, TBL(1)|1362, TBL(1)|1363, TBL(1)|1364, TBL(1)|1366, TBL(1)|458, +-/* 02f998 */ TBL(1)|1365, TBL(1)|1367, TBL(1)|1372, TBL(1)|1373, TBL(1)|1368, TBL(1)|1374, TBL(1)|1379, TBL(1)|1384, +-/* 02f9a0 */ TBL(1)|1371, TBL(1)|1376, TBL(1)|1377, TBL(1)|1378, TBL(1)|459, TBL(1)|461, TBL(1)|460, TBL(1)|618, +-/* 02f9a8 */ TBL(1)|1386, TBL(1)|1387, TBL(1)|1389, TBL(1)|465, TBL(1)|1390, TBL(1)|462, TBL(1)|619, TBL(1)|620, +-/* 02f9b0 */ TBL(1)|463, TBL(1)|464, TBL(1)|621, TBL(1)|1398, TBL(1)|1399, TBL(1)|1400, TBL(1)|1401, TBL(1)|1404, +-/* 02f9b8 */ TBL(1)|1403, TBL(1)|1406, TBL(1)|1405, TBL(1)|1409, TBL(1)|1407, TBL(1)|1408, TBL(1)|1410, TBL(1)|622, +-/* 02f9c0 */ TBL(1)|1412, TBL(1)|1413, TBL(1)|623, TBL(1)|1417, TBL(1)|1418, TBL(1)|466, TBL(1)|1421, TBL(1)|1422, +-/* 02f9c8 */ TBL(1)|624, TBL(1)|1425, TBL(1)|573, TBL(1)|467, TBL(1)|468, TBL(1)|625, TBL(1)|626, TBL(1)|1436, +-/* 02f9d0 */ TBL(1)|1442, TBL(1)|1449, TBL(1)|1453, TBL(1)|469, TBL(1)|1458, TBL(1)|1459, TBL(1)|1465, TBL(1)|1468, +-/* 02f9d8 */ TBL(1)|471, TBL(1)|373, TBL(1)|1471, TBL(1)|1470, TBL(1)|1473, TBL(1)|374, TBL(1)|1476, TBL(1)|1479, +-/* 02f9e0 */ TBL(1)|472, TBL(1)|473, TBL(1)|1495, TBL(1)|1498, TBL(1)|1500, TBL(1)|474, TBL(1)|1501, TBL(1)|1512, +-/* 02f9e8 */ TBL(1)|1515, TBL(1)|1516, TBL(1)|1514, TBL(1)|1519, TBL(1)|1520, TBL(1)|475, TBL(1)|1523, TBL(1)|627, +-/* 02f9f0 */ TBL(1)|1525, TBL(1)|476, TBL(1)|628, TBL(1)|1539, TBL(1)|895, TBL(1)|1545, TBL(1)|477, TBL(1)|479, +-/* 02f9f8 */ TBL(1)|629, TBL(1)|630, TBL(1)|1555, TBL(1)|480, TBL(1)|631, TBL(1)|481, TBL(1)|1561, TBL(1)|1561 ++/* 02f900 */ TBL(1)|1156, TBL(1)|1160, TBL(1)|1157, TBL(1)|1158, TBL(1)|1161, TBL(1)|1162, TBL(1)|465, TBL(1)|1155, ++/* 02f908 */ TBL(1)|1168, TBL(1)|1169, TBL(1)|646, TBL(1)|1174, TBL(1)|1173, TBL(1)|466, TBL(1)|1166, TBL(1)|1181, ++/* 02f910 */ TBL(1)|467, TBL(1)|468, TBL(1)|1182, TBL(1)|1187, TBL(1)|1186, TBL(1)|1185, TBL(1)|647, TBL(1)|1188, ++/* 02f918 */ TBL(1)|1192, TBL(1)|1191, TBL(1)|1194, TBL(1)|420, TBL(1)|1198, TBL(1)|469, TBL(1)|1201, TBL(1)|471, ++/* 02f920 */ TBL(1)|1206, TBL(1)|1209, TBL(1)|1214, TBL(1)|472, TBL(1)|1219, TBL(1)|1220, TBL(1)|473, TBL(1)|474, ++/* 02f928 */ TBL(1)|1227, TBL(1)|1231, TBL(1)|648, TBL(1)|1232, TBL(1)|649, TBL(1)|649, TBL(1)|1238, TBL(1)|1239, ++/* 02f930 */ TBL(1)|1241, TBL(1)|1242, TBL(1)|1245, TBL(1)|650, TBL(1)|1251, TBL(1)|475, TBL(1)|1258, TBL(1)|476, ++/* 02f938 */ TBL(1)|1261, TBL(1)|445, TBL(1)|1265, TBL(1)|477, TBL(1)|478, TBL(1)|480, TBL(1)|651, TBL(1)|652, ++/* 02f940 */ TBL(1)|1279, TBL(1)|482, TBL(1)|481, TBL(1)|483, TBL(1)|484, TBL(1)|1281, TBL(1)|1282, TBL(1)|1282, ++/* 02f948 */ TBL(1)|1284, TBL(1)|654, TBL(1)|1285, TBL(1)|655, TBL(1)|656, TBL(1)|486, TBL(1)|1290, TBL(1)|1292, ++/* 02f950 */ TBL(1)|1295, TBL(1)|657, TBL(1)|487, TBL(1)|1304, TBL(1)|488, TBL(1)|489, TBL(1)|1312, TBL(1)|1318, ++/* 02f958 */ TBL(1)|658, TBL(1)|1320, TBL(1)|1321, TBL(1)|1322, TBL(1)|490, TBL(1)|492, TBL(1)|492, TBL(1)|1328, ++/* 02f960 */ TBL(1)|659, TBL(1)|493, TBL(1)|1333, TBL(1)|1334, TBL(1)|660, TBL(1)|494, TBL(1)|1341, TBL(1)|661, ++/* 02f968 */ TBL(1)|1345, TBL(1)|1343, TBL(1)|1347, TBL(1)|497, TBL(1)|1353, TBL(1)|662, TBL(1)|1356, TBL(1)|1358, ++/* 02f970 */ TBL(1)|1362, TBL(1)|663, TBL(1)|499, TBL(1)|500, TBL(1)|664, TBL(1)|501, TBL(1)|1368, TBL(1)|502, ++/* 02f978 */ TBL(1)|1371, TBL(1)|1374, TBL(1)|1376, TBL(1)|503, TBL(1)|504, TBL(1)|1381, TBL(1)|505, TBL(1)|1383, ++/* 02f980 */ TBL(1)|454, TBL(1)|665, TBL(1)|1389, TBL(1)|1390, TBL(1)|667, TBL(1)|1391, TBL(1)|910, TBL(1)|506, ++/* 02f988 */ TBL(1)|507, TBL(1)|455, TBL(1)|456, TBL(1)|1399, TBL(1)|1400, TBL(1)|1534, TBL(1)|668, TBL(1)|1411, ++/* 02f990 */ TBL(1)|1410, TBL(1)|1412, TBL(1)|785, TBL(1)|1413, TBL(1)|1414, TBL(1)|1415, TBL(1)|1417, TBL(1)|508, ++/* 02f998 */ TBL(1)|1416, TBL(1)|1418, TBL(1)|1423, TBL(1)|1424, TBL(1)|1419, TBL(1)|1425, TBL(1)|1430, TBL(1)|1435, ++/* 02f9a0 */ TBL(1)|1422, TBL(1)|1427, TBL(1)|1428, TBL(1)|1429, TBL(1)|509, TBL(1)|511, TBL(1)|510, TBL(1)|669, ++/* 02f9a8 */ TBL(1)|1437, TBL(1)|1438, TBL(1)|1440, TBL(1)|515, TBL(1)|1441, TBL(1)|512, TBL(1)|670, TBL(1)|671, ++/* 02f9b0 */ TBL(1)|513, TBL(1)|514, TBL(1)|672, TBL(1)|1449, TBL(1)|1450, TBL(1)|1451, TBL(1)|1452, TBL(1)|1455, ++/* 02f9b8 */ TBL(1)|1454, TBL(1)|1457, TBL(1)|1456, TBL(1)|1460, TBL(1)|1458, TBL(1)|1459, TBL(1)|1461, TBL(1)|673, ++/* 02f9c0 */ TBL(1)|1463, TBL(1)|1464, TBL(1)|674, TBL(1)|1468, TBL(1)|1469, TBL(1)|516, TBL(1)|1472, TBL(1)|1473, ++/* 02f9c8 */ TBL(1)|675, TBL(1)|1476, TBL(1)|624, TBL(1)|517, TBL(1)|518, TBL(1)|676, TBL(1)|677, TBL(1)|1487, ++/* 02f9d0 */ TBL(1)|1493, TBL(1)|1500, TBL(1)|1504, TBL(1)|519, TBL(1)|1509, TBL(1)|1510, TBL(1)|1516, TBL(1)|1519, ++/* 02f9d8 */ TBL(1)|521, TBL(1)|423, TBL(1)|1522, TBL(1)|1521, TBL(1)|1524, TBL(1)|424, TBL(1)|1527, TBL(1)|1530, ++/* 02f9e0 */ TBL(1)|522, TBL(1)|523, TBL(1)|1546, TBL(1)|1549, TBL(1)|1551, TBL(1)|524, TBL(1)|1552, TBL(1)|1563, ++/* 02f9e8 */ TBL(1)|1566, TBL(1)|1567, TBL(1)|1565, TBL(1)|1570, TBL(1)|1571, TBL(1)|525, TBL(1)|1574, TBL(1)|678, ++/* 02f9f0 */ TBL(1)|1576, TBL(1)|526, TBL(1)|679, TBL(1)|1590, TBL(1)|946, TBL(1)|1596, TBL(1)|527, TBL(1)|529, ++/* 02f9f8 */ TBL(1)|680, TBL(1)|681, TBL(1)|1606, TBL(1)|530, TBL(1)|682, TBL(1)|531, TBL(1)|1612, TBL(1)|1612 + }; + + static const uint16_t UNWIF_compat_02_fa [256] = { +-/* 02fa00 */ TBL(1)|1563, TBL(1)|482, TBL(1)|1569, TBL(1)|632, TBL(1)|1573, TBL(1)|1576, TBL(1)|1578, TBL(1)|1580, +-/* 02fa08 */ TBL(1)|633, TBL(1)|485, TBL(1)|1585, TBL(1)|1592, TBL(1)|1595, TBL(1)|634, TBL(1)|635, TBL(1)|1596, +-/* 02fa10 */ TBL(1)|486, TBL(1)|636, TBL(1)|487, TBL(1)|488, TBL(1)|489, TBL(1)|1605, TBL(1)|637, TBL(1)|1610, +-/* 02fa18 */ TBL(1)|1612, TBL(1)|1613, TBL(1)|1615, TBL(1)|1617, TBL(1)|1619, TBL(1)|491, 0, 0, ++/* 02fa00 */ TBL(1)|1614, TBL(1)|532, TBL(1)|1620, TBL(1)|683, TBL(1)|1624, TBL(1)|1627, TBL(1)|1629, TBL(1)|1631, ++/* 02fa08 */ TBL(1)|684, TBL(1)|535, TBL(1)|1636, TBL(1)|1643, TBL(1)|1646, TBL(1)|685, TBL(1)|686, TBL(1)|1647, ++/* 02fa10 */ TBL(1)|536, TBL(1)|687, TBL(1)|537, TBL(1)|538, TBL(1)|539, TBL(1)|1656, TBL(1)|688, TBL(1)|1661, ++/* 02fa18 */ TBL(1)|1663, TBL(1)|1664, TBL(1)|1666, TBL(1)|1668, TBL(1)|1670, TBL(1)|541, 0, 0, + /* 02fa20 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 02fa28 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 02fa30 */ 0, 0, 0, 0, 0, 0, 0, 0, +@@ -2731,7 +2772,7 @@ UNWIF_compat_00_ff + }; + + static const uint16_t* UNWIF_compat_01 [256] = { +-NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, ++NULL,NULL,NULL,NULL,NULL,NULL,NULL,UNWIF_compat_01_07, + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + UNWIF_compat_01_10, + UNWIF_compat_01_11, +diff --git a/src/extwchar/unwifexc.h b/src/extwchar/unwifexc.h +index 28789f02..ce1f7106 100644 +--- a/src/extwchar/unwifexc.h ++++ b/src/extwchar/unwifexc.h +@@ -3,7 +3,7 @@ + * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! + * This file is auto-generated by Unicode-Normalize 1.27 + * mkheader -uni -ind -std +- * for Unicode 13.0.0 UTF-32 ++ * for Unicode 14.0.0 UTF-32 + * Any changes here will be lost! + */ + /* Composite exclusions */ +diff --git a/tests/CaseFolding.txt b/tests/CaseFolding.txt +deleted file mode 100644 +index 033788b2..00000000 +--- a/tests/CaseFolding.txt ++++ /dev/null +@@ -1,1584 +0,0 @@ +-# CaseFolding-13.0.0.txt +-# Date: 2019-09-08, 23:30:59 GMT +-# © 2019 Unicode®, Inc. +-# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +-# For terms of use, see http://www.unicode.org/terms_of_use.html +-# +-# Unicode Character Database +-# For documentation, see http://www.unicode.org/reports/tr44/ +-# +-# Case Folding Properties +-# +-# This file is a supplement to the UnicodeData file. +-# It provides a case folding mapping generated from the Unicode Character Database. +-# If all characters are mapped according to the full mapping below, then +-# case differences (according to UnicodeData.txt and SpecialCasing.txt) +-# are eliminated. +-# +-# The data supports both implementations that require simple case foldings +-# (where string lengths don't change), and implementations that allow full case folding +-# (where string lengths may grow). Note that where they can be supported, the +-# full case foldings are superior: for example, they allow "MASSE" and "Maße" to match. +-# +-# All code points not listed in this file map to themselves. +-# +-# NOTE: case folding does not preserve normalization formats! +-# +-# For information on case folding, including how to have case folding +-# preserve normalization formats, see Section 3.13 Default Case Algorithms in +-# The Unicode Standard. +-# +-# ================================================================================ +-# Format +-# ================================================================================ +-# The entries in this file are in the following machine-readable format: +-# +-# ; ; ; # +-# +-# The status field is: +-# C: common case folding, common mappings shared by both simple and full mappings. +-# F: full case folding, mappings that cause strings to grow in length. Multiple characters are separated by spaces. +-# S: simple case folding, mappings to single characters where different from F. +-# T: special case for uppercase I and dotted uppercase I +-# - For non-Turkic languages, this mapping is normally not used. +-# - For Turkic languages (tr, az), this mapping can be used instead of the normal mapping for these characters. +-# Note that the Turkic mappings do not maintain canonical equivalence without additional processing. +-# See the discussions of case mapping in the Unicode Standard for more information. +-# +-# Usage: +-# A. To do a simple case folding, use the mappings with status C + S. +-# B. To do a full case folding, use the mappings with status C + F. +-# +-# The mappings with status T can be used or omitted depending on the desired case-folding +-# behavior. (The default option is to exclude them.) +-# +-# ================================================================= +- +-# Property: Case_Folding +- +-# All code points not explicitly listed for Case_Folding +-# have the value C for the status field, and the code point itself for the mapping field. +- +-# ================================================================= +-0041; C; 0061; # LATIN CAPITAL LETTER A +-0042; C; 0062; # LATIN CAPITAL LETTER B +-0043; C; 0063; # LATIN CAPITAL LETTER C +-0044; C; 0064; # LATIN CAPITAL LETTER D +-0045; C; 0065; # LATIN CAPITAL LETTER E +-0046; C; 0066; # LATIN CAPITAL LETTER F +-0047; C; 0067; # LATIN CAPITAL LETTER G +-0048; C; 0068; # LATIN CAPITAL LETTER H +-0049; C; 0069; # LATIN CAPITAL LETTER I +-0049; T; 0131; # LATIN CAPITAL LETTER I +-004A; C; 006A; # LATIN CAPITAL LETTER J +-004B; C; 006B; # LATIN CAPITAL LETTER K +-004C; C; 006C; # LATIN CAPITAL LETTER L +-004D; C; 006D; # LATIN CAPITAL LETTER M +-004E; C; 006E; # LATIN CAPITAL LETTER N +-004F; C; 006F; # LATIN CAPITAL LETTER O +-0050; C; 0070; # LATIN CAPITAL LETTER P +-0051; C; 0071; # LATIN CAPITAL LETTER Q +-0052; C; 0072; # LATIN CAPITAL LETTER R +-0053; C; 0073; # LATIN CAPITAL LETTER S +-0054; C; 0074; # LATIN CAPITAL LETTER T +-0055; C; 0075; # LATIN CAPITAL LETTER U +-0056; C; 0076; # LATIN CAPITAL LETTER V +-0057; C; 0077; # LATIN CAPITAL LETTER W +-0058; C; 0078; # LATIN CAPITAL LETTER X +-0059; C; 0079; # LATIN CAPITAL LETTER Y +-005A; C; 007A; # LATIN CAPITAL LETTER Z +-00B5; C; 03BC; # MICRO SIGN +-00C0; C; 00E0; # LATIN CAPITAL LETTER A WITH GRAVE +-00C1; C; 00E1; # LATIN CAPITAL LETTER A WITH ACUTE +-00C2; C; 00E2; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +-00C3; C; 00E3; # LATIN CAPITAL LETTER A WITH TILDE +-00C4; C; 00E4; # LATIN CAPITAL LETTER A WITH DIAERESIS +-00C5; C; 00E5; # LATIN CAPITAL LETTER A WITH RING ABOVE +-00C6; C; 00E6; # LATIN CAPITAL LETTER AE +-00C7; C; 00E7; # LATIN CAPITAL LETTER C WITH CEDILLA +-00C8; C; 00E8; # LATIN CAPITAL LETTER E WITH GRAVE +-00C9; C; 00E9; # LATIN CAPITAL LETTER E WITH ACUTE +-00CA; C; 00EA; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +-00CB; C; 00EB; # LATIN CAPITAL LETTER E WITH DIAERESIS +-00CC; C; 00EC; # LATIN CAPITAL LETTER I WITH GRAVE +-00CD; C; 00ED; # LATIN CAPITAL LETTER I WITH ACUTE +-00CE; C; 00EE; # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +-00CF; C; 00EF; # LATIN CAPITAL LETTER I WITH DIAERESIS +-00D0; C; 00F0; # LATIN CAPITAL LETTER ETH +-00D1; C; 00F1; # LATIN CAPITAL LETTER N WITH TILDE +-00D2; C; 00F2; # LATIN CAPITAL LETTER O WITH GRAVE +-00D3; C; 00F3; # LATIN CAPITAL LETTER O WITH ACUTE +-00D4; C; 00F4; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +-00D5; C; 00F5; # LATIN CAPITAL LETTER O WITH TILDE +-00D6; C; 00F6; # LATIN CAPITAL LETTER O WITH DIAERESIS +-00D8; C; 00F8; # LATIN CAPITAL LETTER O WITH STROKE +-00D9; C; 00F9; # LATIN CAPITAL LETTER U WITH GRAVE +-00DA; C; 00FA; # LATIN CAPITAL LETTER U WITH ACUTE +-00DB; C; 00FB; # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +-00DC; C; 00FC; # LATIN CAPITAL LETTER U WITH DIAERESIS +-00DD; C; 00FD; # LATIN CAPITAL LETTER Y WITH ACUTE +-00DE; C; 00FE; # LATIN CAPITAL LETTER THORN +-00DF; F; 0073 0073; # LATIN SMALL LETTER SHARP S +-0100; C; 0101; # LATIN CAPITAL LETTER A WITH MACRON +-0102; C; 0103; # LATIN CAPITAL LETTER A WITH BREVE +-0104; C; 0105; # LATIN CAPITAL LETTER A WITH OGONEK +-0106; C; 0107; # LATIN CAPITAL LETTER C WITH ACUTE +-0108; C; 0109; # LATIN CAPITAL LETTER C WITH CIRCUMFLEX +-010A; C; 010B; # LATIN CAPITAL LETTER C WITH DOT ABOVE +-010C; C; 010D; # LATIN CAPITAL LETTER C WITH CARON +-010E; C; 010F; # LATIN CAPITAL LETTER D WITH CARON +-0110; C; 0111; # LATIN CAPITAL LETTER D WITH STROKE +-0112; C; 0113; # LATIN CAPITAL LETTER E WITH MACRON +-0114; C; 0115; # LATIN CAPITAL LETTER E WITH BREVE +-0116; C; 0117; # LATIN CAPITAL LETTER E WITH DOT ABOVE +-0118; C; 0119; # LATIN CAPITAL LETTER E WITH OGONEK +-011A; C; 011B; # LATIN CAPITAL LETTER E WITH CARON +-011C; C; 011D; # LATIN CAPITAL LETTER G WITH CIRCUMFLEX +-011E; C; 011F; # LATIN CAPITAL LETTER G WITH BREVE +-0120; C; 0121; # LATIN CAPITAL LETTER G WITH DOT ABOVE +-0122; C; 0123; # LATIN CAPITAL LETTER G WITH CEDILLA +-0124; C; 0125; # LATIN CAPITAL LETTER H WITH CIRCUMFLEX +-0126; C; 0127; # LATIN CAPITAL LETTER H WITH STROKE +-0128; C; 0129; # LATIN CAPITAL LETTER I WITH TILDE +-012A; C; 012B; # LATIN CAPITAL LETTER I WITH MACRON +-012C; C; 012D; # LATIN CAPITAL LETTER I WITH BREVE +-012E; C; 012F; # LATIN CAPITAL LETTER I WITH OGONEK +-0130; F; 0069 0307; # LATIN CAPITAL LETTER I WITH DOT ABOVE +-0130; T; 0069; # LATIN CAPITAL LETTER I WITH DOT ABOVE +-0132; C; 0133; # LATIN CAPITAL LIGATURE IJ +-0134; C; 0135; # LATIN CAPITAL LETTER J WITH CIRCUMFLEX +-0136; C; 0137; # LATIN CAPITAL LETTER K WITH CEDILLA +-0139; C; 013A; # LATIN CAPITAL LETTER L WITH ACUTE +-013B; C; 013C; # LATIN CAPITAL LETTER L WITH CEDILLA +-013D; C; 013E; # LATIN CAPITAL LETTER L WITH CARON +-013F; C; 0140; # LATIN CAPITAL LETTER L WITH MIDDLE DOT +-0141; C; 0142; # LATIN CAPITAL LETTER L WITH STROKE +-0143; C; 0144; # LATIN CAPITAL LETTER N WITH ACUTE +-0145; C; 0146; # LATIN CAPITAL LETTER N WITH CEDILLA +-0147; C; 0148; # LATIN CAPITAL LETTER N WITH CARON +-0149; F; 02BC 006E; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +-014A; C; 014B; # LATIN CAPITAL LETTER ENG +-014C; C; 014D; # LATIN CAPITAL LETTER O WITH MACRON +-014E; C; 014F; # LATIN CAPITAL LETTER O WITH BREVE +-0150; C; 0151; # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +-0152; C; 0153; # LATIN CAPITAL LIGATURE OE +-0154; C; 0155; # LATIN CAPITAL LETTER R WITH ACUTE +-0156; C; 0157; # LATIN CAPITAL LETTER R WITH CEDILLA +-0158; C; 0159; # LATIN CAPITAL LETTER R WITH CARON +-015A; C; 015B; # LATIN CAPITAL LETTER S WITH ACUTE +-015C; C; 015D; # LATIN CAPITAL LETTER S WITH CIRCUMFLEX +-015E; C; 015F; # LATIN CAPITAL LETTER S WITH CEDILLA +-0160; C; 0161; # LATIN CAPITAL LETTER S WITH CARON +-0162; C; 0163; # LATIN CAPITAL LETTER T WITH CEDILLA +-0164; C; 0165; # LATIN CAPITAL LETTER T WITH CARON +-0166; C; 0167; # LATIN CAPITAL LETTER T WITH STROKE +-0168; C; 0169; # LATIN CAPITAL LETTER U WITH TILDE +-016A; C; 016B; # LATIN CAPITAL LETTER U WITH MACRON +-016C; C; 016D; # LATIN CAPITAL LETTER U WITH BREVE +-016E; C; 016F; # LATIN CAPITAL LETTER U WITH RING ABOVE +-0170; C; 0171; # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +-0172; C; 0173; # LATIN CAPITAL LETTER U WITH OGONEK +-0174; C; 0175; # LATIN CAPITAL LETTER W WITH CIRCUMFLEX +-0176; C; 0177; # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +-0178; C; 00FF; # LATIN CAPITAL LETTER Y WITH DIAERESIS +-0179; C; 017A; # LATIN CAPITAL LETTER Z WITH ACUTE +-017B; C; 017C; # LATIN CAPITAL LETTER Z WITH DOT ABOVE +-017D; C; 017E; # LATIN CAPITAL LETTER Z WITH CARON +-017F; C; 0073; # LATIN SMALL LETTER LONG S +-0181; C; 0253; # LATIN CAPITAL LETTER B WITH HOOK +-0182; C; 0183; # LATIN CAPITAL LETTER B WITH TOPBAR +-0184; C; 0185; # LATIN CAPITAL LETTER TONE SIX +-0186; C; 0254; # LATIN CAPITAL LETTER OPEN O +-0187; C; 0188; # LATIN CAPITAL LETTER C WITH HOOK +-0189; C; 0256; # LATIN CAPITAL LETTER AFRICAN D +-018A; C; 0257; # LATIN CAPITAL LETTER D WITH HOOK +-018B; C; 018C; # LATIN CAPITAL LETTER D WITH TOPBAR +-018E; C; 01DD; # LATIN CAPITAL LETTER REVERSED E +-018F; C; 0259; # LATIN CAPITAL LETTER SCHWA +-0190; C; 025B; # LATIN CAPITAL LETTER OPEN E +-0191; C; 0192; # LATIN CAPITAL LETTER F WITH HOOK +-0193; C; 0260; # LATIN CAPITAL LETTER G WITH HOOK +-0194; C; 0263; # LATIN CAPITAL LETTER GAMMA +-0196; C; 0269; # LATIN CAPITAL LETTER IOTA +-0197; C; 0268; # LATIN CAPITAL LETTER I WITH STROKE +-0198; C; 0199; # LATIN CAPITAL LETTER K WITH HOOK +-019C; C; 026F; # LATIN CAPITAL LETTER TURNED M +-019D; C; 0272; # LATIN CAPITAL LETTER N WITH LEFT HOOK +-019F; C; 0275; # LATIN CAPITAL LETTER O WITH MIDDLE TILDE +-01A0; C; 01A1; # LATIN CAPITAL LETTER O WITH HORN +-01A2; C; 01A3; # LATIN CAPITAL LETTER OI +-01A4; C; 01A5; # LATIN CAPITAL LETTER P WITH HOOK +-01A6; C; 0280; # LATIN LETTER YR +-01A7; C; 01A8; # LATIN CAPITAL LETTER TONE TWO +-01A9; C; 0283; # LATIN CAPITAL LETTER ESH +-01AC; C; 01AD; # LATIN CAPITAL LETTER T WITH HOOK +-01AE; C; 0288; # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK +-01AF; C; 01B0; # LATIN CAPITAL LETTER U WITH HORN +-01B1; C; 028A; # LATIN CAPITAL LETTER UPSILON +-01B2; C; 028B; # LATIN CAPITAL LETTER V WITH HOOK +-01B3; C; 01B4; # LATIN CAPITAL LETTER Y WITH HOOK +-01B5; C; 01B6; # LATIN CAPITAL LETTER Z WITH STROKE +-01B7; C; 0292; # LATIN CAPITAL LETTER EZH +-01B8; C; 01B9; # LATIN CAPITAL LETTER EZH REVERSED +-01BC; C; 01BD; # LATIN CAPITAL LETTER TONE FIVE +-01C4; C; 01C6; # LATIN CAPITAL LETTER DZ WITH CARON +-01C5; C; 01C6; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +-01C7; C; 01C9; # LATIN CAPITAL LETTER LJ +-01C8; C; 01C9; # LATIN CAPITAL LETTER L WITH SMALL LETTER J +-01CA; C; 01CC; # LATIN CAPITAL LETTER NJ +-01CB; C; 01CC; # LATIN CAPITAL LETTER N WITH SMALL LETTER J +-01CD; C; 01CE; # LATIN CAPITAL LETTER A WITH CARON +-01CF; C; 01D0; # LATIN CAPITAL LETTER I WITH CARON +-01D1; C; 01D2; # LATIN CAPITAL LETTER O WITH CARON +-01D3; C; 01D4; # LATIN CAPITAL LETTER U WITH CARON +-01D5; C; 01D6; # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +-01D7; C; 01D8; # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +-01D9; C; 01DA; # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +-01DB; C; 01DC; # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +-01DE; C; 01DF; # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +-01E0; C; 01E1; # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +-01E2; C; 01E3; # LATIN CAPITAL LETTER AE WITH MACRON +-01E4; C; 01E5; # LATIN CAPITAL LETTER G WITH STROKE +-01E6; C; 01E7; # LATIN CAPITAL LETTER G WITH CARON +-01E8; C; 01E9; # LATIN CAPITAL LETTER K WITH CARON +-01EA; C; 01EB; # LATIN CAPITAL LETTER O WITH OGONEK +-01EC; C; 01ED; # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +-01EE; C; 01EF; # LATIN CAPITAL LETTER EZH WITH CARON +-01F0; F; 006A 030C; # LATIN SMALL LETTER J WITH CARON +-01F1; C; 01F3; # LATIN CAPITAL LETTER DZ +-01F2; C; 01F3; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z +-01F4; C; 01F5; # LATIN CAPITAL LETTER G WITH ACUTE +-01F6; C; 0195; # LATIN CAPITAL LETTER HWAIR +-01F7; C; 01BF; # LATIN CAPITAL LETTER WYNN +-01F8; C; 01F9; # LATIN CAPITAL LETTER N WITH GRAVE +-01FA; C; 01FB; # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +-01FC; C; 01FD; # LATIN CAPITAL LETTER AE WITH ACUTE +-01FE; C; 01FF; # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +-0200; C; 0201; # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +-0202; C; 0203; # LATIN CAPITAL LETTER A WITH INVERTED BREVE +-0204; C; 0205; # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +-0206; C; 0207; # LATIN CAPITAL LETTER E WITH INVERTED BREVE +-0208; C; 0209; # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +-020A; C; 020B; # LATIN CAPITAL LETTER I WITH INVERTED BREVE +-020C; C; 020D; # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +-020E; C; 020F; # LATIN CAPITAL LETTER O WITH INVERTED BREVE +-0210; C; 0211; # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +-0212; C; 0213; # LATIN CAPITAL LETTER R WITH INVERTED BREVE +-0214; C; 0215; # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +-0216; C; 0217; # LATIN CAPITAL LETTER U WITH INVERTED BREVE +-0218; C; 0219; # LATIN CAPITAL LETTER S WITH COMMA BELOW +-021A; C; 021B; # LATIN CAPITAL LETTER T WITH COMMA BELOW +-021C; C; 021D; # LATIN CAPITAL LETTER YOGH +-021E; C; 021F; # LATIN CAPITAL LETTER H WITH CARON +-0220; C; 019E; # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +-0222; C; 0223; # LATIN CAPITAL LETTER OU +-0224; C; 0225; # LATIN CAPITAL LETTER Z WITH HOOK +-0226; C; 0227; # LATIN CAPITAL LETTER A WITH DOT ABOVE +-0228; C; 0229; # LATIN CAPITAL LETTER E WITH CEDILLA +-022A; C; 022B; # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +-022C; C; 022D; # LATIN CAPITAL LETTER O WITH TILDE AND MACRON +-022E; C; 022F; # LATIN CAPITAL LETTER O WITH DOT ABOVE +-0230; C; 0231; # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +-0232; C; 0233; # LATIN CAPITAL LETTER Y WITH MACRON +-023A; C; 2C65; # LATIN CAPITAL LETTER A WITH STROKE +-023B; C; 023C; # LATIN CAPITAL LETTER C WITH STROKE +-023D; C; 019A; # LATIN CAPITAL LETTER L WITH BAR +-023E; C; 2C66; # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE +-0241; C; 0242; # LATIN CAPITAL LETTER GLOTTAL STOP +-0243; C; 0180; # LATIN CAPITAL LETTER B WITH STROKE +-0244; C; 0289; # LATIN CAPITAL LETTER U BAR +-0245; C; 028C; # LATIN CAPITAL LETTER TURNED V +-0246; C; 0247; # LATIN CAPITAL LETTER E WITH STROKE +-0248; C; 0249; # LATIN CAPITAL LETTER J WITH STROKE +-024A; C; 024B; # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL +-024C; C; 024D; # LATIN CAPITAL LETTER R WITH STROKE +-024E; C; 024F; # LATIN CAPITAL LETTER Y WITH STROKE +-0345; C; 03B9; # COMBINING GREEK YPOGEGRAMMENI +-0370; C; 0371; # GREEK CAPITAL LETTER HETA +-0372; C; 0373; # GREEK CAPITAL LETTER ARCHAIC SAMPI +-0376; C; 0377; # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA +-037F; C; 03F3; # GREEK CAPITAL LETTER YOT +-0386; C; 03AC; # GREEK CAPITAL LETTER ALPHA WITH TONOS +-0388; C; 03AD; # GREEK CAPITAL LETTER EPSILON WITH TONOS +-0389; C; 03AE; # GREEK CAPITAL LETTER ETA WITH TONOS +-038A; C; 03AF; # GREEK CAPITAL LETTER IOTA WITH TONOS +-038C; C; 03CC; # GREEK CAPITAL LETTER OMICRON WITH TONOS +-038E; C; 03CD; # GREEK CAPITAL LETTER UPSILON WITH TONOS +-038F; C; 03CE; # GREEK CAPITAL LETTER OMEGA WITH TONOS +-0390; F; 03B9 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +-0391; C; 03B1; # GREEK CAPITAL LETTER ALPHA +-0392; C; 03B2; # GREEK CAPITAL LETTER BETA +-0393; C; 03B3; # GREEK CAPITAL LETTER GAMMA +-0394; C; 03B4; # GREEK CAPITAL LETTER DELTA +-0395; C; 03B5; # GREEK CAPITAL LETTER EPSILON +-0396; C; 03B6; # GREEK CAPITAL LETTER ZETA +-0397; C; 03B7; # GREEK CAPITAL LETTER ETA +-0398; C; 03B8; # GREEK CAPITAL LETTER THETA +-0399; C; 03B9; # GREEK CAPITAL LETTER IOTA +-039A; C; 03BA; # GREEK CAPITAL LETTER KAPPA +-039B; C; 03BB; # GREEK CAPITAL LETTER LAMDA +-039C; C; 03BC; # GREEK CAPITAL LETTER MU +-039D; C; 03BD; # GREEK CAPITAL LETTER NU +-039E; C; 03BE; # GREEK CAPITAL LETTER XI +-039F; C; 03BF; # GREEK CAPITAL LETTER OMICRON +-03A0; C; 03C0; # GREEK CAPITAL LETTER PI +-03A1; C; 03C1; # GREEK CAPITAL LETTER RHO +-03A3; C; 03C3; # GREEK CAPITAL LETTER SIGMA +-03A4; C; 03C4; # GREEK CAPITAL LETTER TAU +-03A5; C; 03C5; # GREEK CAPITAL LETTER UPSILON +-03A6; C; 03C6; # GREEK CAPITAL LETTER PHI +-03A7; C; 03C7; # GREEK CAPITAL LETTER CHI +-03A8; C; 03C8; # GREEK CAPITAL LETTER PSI +-03A9; C; 03C9; # GREEK CAPITAL LETTER OMEGA +-03AA; C; 03CA; # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +-03AB; C; 03CB; # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +-03B0; F; 03C5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +-03C2; C; 03C3; # GREEK SMALL LETTER FINAL SIGMA +-03CF; C; 03D7; # GREEK CAPITAL KAI SYMBOL +-03D0; C; 03B2; # GREEK BETA SYMBOL +-03D1; C; 03B8; # GREEK THETA SYMBOL +-03D5; C; 03C6; # GREEK PHI SYMBOL +-03D6; C; 03C0; # GREEK PI SYMBOL +-03D8; C; 03D9; # GREEK LETTER ARCHAIC KOPPA +-03DA; C; 03DB; # GREEK LETTER STIGMA +-03DC; C; 03DD; # GREEK LETTER DIGAMMA +-03DE; C; 03DF; # GREEK LETTER KOPPA +-03E0; C; 03E1; # GREEK LETTER SAMPI +-03E2; C; 03E3; # COPTIC CAPITAL LETTER SHEI +-03E4; C; 03E5; # COPTIC CAPITAL LETTER FEI +-03E6; C; 03E7; # COPTIC CAPITAL LETTER KHEI +-03E8; C; 03E9; # COPTIC CAPITAL LETTER HORI +-03EA; C; 03EB; # COPTIC CAPITAL LETTER GANGIA +-03EC; C; 03ED; # COPTIC CAPITAL LETTER SHIMA +-03EE; C; 03EF; # COPTIC CAPITAL LETTER DEI +-03F0; C; 03BA; # GREEK KAPPA SYMBOL +-03F1; C; 03C1; # GREEK RHO SYMBOL +-03F4; C; 03B8; # GREEK CAPITAL THETA SYMBOL +-03F5; C; 03B5; # GREEK LUNATE EPSILON SYMBOL +-03F7; C; 03F8; # GREEK CAPITAL LETTER SHO +-03F9; C; 03F2; # GREEK CAPITAL LUNATE SIGMA SYMBOL +-03FA; C; 03FB; # GREEK CAPITAL LETTER SAN +-03FD; C; 037B; # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL +-03FE; C; 037C; # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL +-03FF; C; 037D; # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +-0400; C; 0450; # CYRILLIC CAPITAL LETTER IE WITH GRAVE +-0401; C; 0451; # CYRILLIC CAPITAL LETTER IO +-0402; C; 0452; # CYRILLIC CAPITAL LETTER DJE +-0403; C; 0453; # CYRILLIC CAPITAL LETTER GJE +-0404; C; 0454; # CYRILLIC CAPITAL LETTER UKRAINIAN IE +-0405; C; 0455; # CYRILLIC CAPITAL LETTER DZE +-0406; C; 0456; # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +-0407; C; 0457; # CYRILLIC CAPITAL LETTER YI +-0408; C; 0458; # CYRILLIC CAPITAL LETTER JE +-0409; C; 0459; # CYRILLIC CAPITAL LETTER LJE +-040A; C; 045A; # CYRILLIC CAPITAL LETTER NJE +-040B; C; 045B; # CYRILLIC CAPITAL LETTER TSHE +-040C; C; 045C; # CYRILLIC CAPITAL LETTER KJE +-040D; C; 045D; # CYRILLIC CAPITAL LETTER I WITH GRAVE +-040E; C; 045E; # CYRILLIC CAPITAL LETTER SHORT U +-040F; C; 045F; # CYRILLIC CAPITAL LETTER DZHE +-0410; C; 0430; # CYRILLIC CAPITAL LETTER A +-0411; C; 0431; # CYRILLIC CAPITAL LETTER BE +-0412; C; 0432; # CYRILLIC CAPITAL LETTER VE +-0413; C; 0433; # CYRILLIC CAPITAL LETTER GHE +-0414; C; 0434; # CYRILLIC CAPITAL LETTER DE +-0415; C; 0435; # CYRILLIC CAPITAL LETTER IE +-0416; C; 0436; # CYRILLIC CAPITAL LETTER ZHE +-0417; C; 0437; # CYRILLIC CAPITAL LETTER ZE +-0418; C; 0438; # CYRILLIC CAPITAL LETTER I +-0419; C; 0439; # CYRILLIC CAPITAL LETTER SHORT I +-041A; C; 043A; # CYRILLIC CAPITAL LETTER KA +-041B; C; 043B; # CYRILLIC CAPITAL LETTER EL +-041C; C; 043C; # CYRILLIC CAPITAL LETTER EM +-041D; C; 043D; # CYRILLIC CAPITAL LETTER EN +-041E; C; 043E; # CYRILLIC CAPITAL LETTER O +-041F; C; 043F; # CYRILLIC CAPITAL LETTER PE +-0420; C; 0440; # CYRILLIC CAPITAL LETTER ER +-0421; C; 0441; # CYRILLIC CAPITAL LETTER ES +-0422; C; 0442; # CYRILLIC CAPITAL LETTER TE +-0423; C; 0443; # CYRILLIC CAPITAL LETTER U +-0424; C; 0444; # CYRILLIC CAPITAL LETTER EF +-0425; C; 0445; # CYRILLIC CAPITAL LETTER HA +-0426; C; 0446; # CYRILLIC CAPITAL LETTER TSE +-0427; C; 0447; # CYRILLIC CAPITAL LETTER CHE +-0428; C; 0448; # CYRILLIC CAPITAL LETTER SHA +-0429; C; 0449; # CYRILLIC CAPITAL LETTER SHCHA +-042A; C; 044A; # CYRILLIC CAPITAL LETTER HARD SIGN +-042B; C; 044B; # CYRILLIC CAPITAL LETTER YERU +-042C; C; 044C; # CYRILLIC CAPITAL LETTER SOFT SIGN +-042D; C; 044D; # CYRILLIC CAPITAL LETTER E +-042E; C; 044E; # CYRILLIC CAPITAL LETTER YU +-042F; C; 044F; # CYRILLIC CAPITAL LETTER YA +-0460; C; 0461; # CYRILLIC CAPITAL LETTER OMEGA +-0462; C; 0463; # CYRILLIC CAPITAL LETTER YAT +-0464; C; 0465; # CYRILLIC CAPITAL LETTER IOTIFIED E +-0466; C; 0467; # CYRILLIC CAPITAL LETTER LITTLE YUS +-0468; C; 0469; # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +-046A; C; 046B; # CYRILLIC CAPITAL LETTER BIG YUS +-046C; C; 046D; # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +-046E; C; 046F; # CYRILLIC CAPITAL LETTER KSI +-0470; C; 0471; # CYRILLIC CAPITAL LETTER PSI +-0472; C; 0473; # CYRILLIC CAPITAL LETTER FITA +-0474; C; 0475; # CYRILLIC CAPITAL LETTER IZHITSA +-0476; C; 0477; # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +-0478; C; 0479; # CYRILLIC CAPITAL LETTER UK +-047A; C; 047B; # CYRILLIC CAPITAL LETTER ROUND OMEGA +-047C; C; 047D; # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +-047E; C; 047F; # CYRILLIC CAPITAL LETTER OT +-0480; C; 0481; # CYRILLIC CAPITAL LETTER KOPPA +-048A; C; 048B; # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +-048C; C; 048D; # CYRILLIC CAPITAL LETTER SEMISOFT SIGN +-048E; C; 048F; # CYRILLIC CAPITAL LETTER ER WITH TICK +-0490; C; 0491; # CYRILLIC CAPITAL LETTER GHE WITH UPTURN +-0492; C; 0493; # CYRILLIC CAPITAL LETTER GHE WITH STROKE +-0494; C; 0495; # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +-0496; C; 0497; # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER +-0498; C; 0499; # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +-049A; C; 049B; # CYRILLIC CAPITAL LETTER KA WITH DESCENDER +-049C; C; 049D; # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +-049E; C; 049F; # CYRILLIC CAPITAL LETTER KA WITH STROKE +-04A0; C; 04A1; # CYRILLIC CAPITAL LETTER BASHKIR KA +-04A2; C; 04A3; # CYRILLIC CAPITAL LETTER EN WITH DESCENDER +-04A4; C; 04A5; # CYRILLIC CAPITAL LIGATURE EN GHE +-04A6; C; 04A7; # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK +-04A8; C; 04A9; # CYRILLIC CAPITAL LETTER ABKHASIAN HA +-04AA; C; 04AB; # CYRILLIC CAPITAL LETTER ES WITH DESCENDER +-04AC; C; 04AD; # CYRILLIC CAPITAL LETTER TE WITH DESCENDER +-04AE; C; 04AF; # CYRILLIC CAPITAL LETTER STRAIGHT U +-04B0; C; 04B1; # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +-04B2; C; 04B3; # CYRILLIC CAPITAL LETTER HA WITH DESCENDER +-04B4; C; 04B5; # CYRILLIC CAPITAL LIGATURE TE TSE +-04B6; C; 04B7; # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +-04B8; C; 04B9; # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE +-04BA; C; 04BB; # CYRILLIC CAPITAL LETTER SHHA +-04BC; C; 04BD; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE +-04BE; C; 04BF; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER +-04C0; C; 04CF; # CYRILLIC LETTER PALOCHKA +-04C1; C; 04C2; # CYRILLIC CAPITAL LETTER ZHE WITH BREVE +-04C3; C; 04C4; # CYRILLIC CAPITAL LETTER KA WITH HOOK +-04C5; C; 04C6; # CYRILLIC CAPITAL LETTER EL WITH TAIL +-04C7; C; 04C8; # CYRILLIC CAPITAL LETTER EN WITH HOOK +-04C9; C; 04CA; # CYRILLIC CAPITAL LETTER EN WITH TAIL +-04CB; C; 04CC; # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +-04CD; C; 04CE; # CYRILLIC CAPITAL LETTER EM WITH TAIL +-04D0; C; 04D1; # CYRILLIC CAPITAL LETTER A WITH BREVE +-04D2; C; 04D3; # CYRILLIC CAPITAL LETTER A WITH DIAERESIS +-04D4; C; 04D5; # CYRILLIC CAPITAL LIGATURE A IE +-04D6; C; 04D7; # CYRILLIC CAPITAL LETTER IE WITH BREVE +-04D8; C; 04D9; # CYRILLIC CAPITAL LETTER SCHWA +-04DA; C; 04DB; # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +-04DC; C; 04DD; # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +-04DE; C; 04DF; # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +-04E0; C; 04E1; # CYRILLIC CAPITAL LETTER ABKHASIAN DZE +-04E2; C; 04E3; # CYRILLIC CAPITAL LETTER I WITH MACRON +-04E4; C; 04E5; # CYRILLIC CAPITAL LETTER I WITH DIAERESIS +-04E6; C; 04E7; # CYRILLIC CAPITAL LETTER O WITH DIAERESIS +-04E8; C; 04E9; # CYRILLIC CAPITAL LETTER BARRED O +-04EA; C; 04EB; # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +-04EC; C; 04ED; # CYRILLIC CAPITAL LETTER E WITH DIAERESIS +-04EE; C; 04EF; # CYRILLIC CAPITAL LETTER U WITH MACRON +-04F0; C; 04F1; # CYRILLIC CAPITAL LETTER U WITH DIAERESIS +-04F2; C; 04F3; # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +-04F4; C; 04F5; # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +-04F6; C; 04F7; # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +-04F8; C; 04F9; # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +-04FA; C; 04FB; # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK +-04FC; C; 04FD; # CYRILLIC CAPITAL LETTER HA WITH HOOK +-04FE; C; 04FF; # CYRILLIC CAPITAL LETTER HA WITH STROKE +-0500; C; 0501; # CYRILLIC CAPITAL LETTER KOMI DE +-0502; C; 0503; # CYRILLIC CAPITAL LETTER KOMI DJE +-0504; C; 0505; # CYRILLIC CAPITAL LETTER KOMI ZJE +-0506; C; 0507; # CYRILLIC CAPITAL LETTER KOMI DZJE +-0508; C; 0509; # CYRILLIC CAPITAL LETTER KOMI LJE +-050A; C; 050B; # CYRILLIC CAPITAL LETTER KOMI NJE +-050C; C; 050D; # CYRILLIC CAPITAL LETTER KOMI SJE +-050E; C; 050F; # CYRILLIC CAPITAL LETTER KOMI TJE +-0510; C; 0511; # CYRILLIC CAPITAL LETTER REVERSED ZE +-0512; C; 0513; # CYRILLIC CAPITAL LETTER EL WITH HOOK +-0514; C; 0515; # CYRILLIC CAPITAL LETTER LHA +-0516; C; 0517; # CYRILLIC CAPITAL LETTER RHA +-0518; C; 0519; # CYRILLIC CAPITAL LETTER YAE +-051A; C; 051B; # CYRILLIC CAPITAL LETTER QA +-051C; C; 051D; # CYRILLIC CAPITAL LETTER WE +-051E; C; 051F; # CYRILLIC CAPITAL LETTER ALEUT KA +-0520; C; 0521; # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK +-0522; C; 0523; # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK +-0524; C; 0525; # CYRILLIC CAPITAL LETTER PE WITH DESCENDER +-0526; C; 0527; # CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER +-0528; C; 0529; # CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK +-052A; C; 052B; # CYRILLIC CAPITAL LETTER DZZHE +-052C; C; 052D; # CYRILLIC CAPITAL LETTER DCHE +-052E; C; 052F; # CYRILLIC CAPITAL LETTER EL WITH DESCENDER +-0531; C; 0561; # ARMENIAN CAPITAL LETTER AYB +-0532; C; 0562; # ARMENIAN CAPITAL LETTER BEN +-0533; C; 0563; # ARMENIAN CAPITAL LETTER GIM +-0534; C; 0564; # ARMENIAN CAPITAL LETTER DA +-0535; C; 0565; # ARMENIAN CAPITAL LETTER ECH +-0536; C; 0566; # ARMENIAN CAPITAL LETTER ZA +-0537; C; 0567; # ARMENIAN CAPITAL LETTER EH +-0538; C; 0568; # ARMENIAN CAPITAL LETTER ET +-0539; C; 0569; # ARMENIAN CAPITAL LETTER TO +-053A; C; 056A; # ARMENIAN CAPITAL LETTER ZHE +-053B; C; 056B; # ARMENIAN CAPITAL LETTER INI +-053C; C; 056C; # ARMENIAN CAPITAL LETTER LIWN +-053D; C; 056D; # ARMENIAN CAPITAL LETTER XEH +-053E; C; 056E; # ARMENIAN CAPITAL LETTER CA +-053F; C; 056F; # ARMENIAN CAPITAL LETTER KEN +-0540; C; 0570; # ARMENIAN CAPITAL LETTER HO +-0541; C; 0571; # ARMENIAN CAPITAL LETTER JA +-0542; C; 0572; # ARMENIAN CAPITAL LETTER GHAD +-0543; C; 0573; # ARMENIAN CAPITAL LETTER CHEH +-0544; C; 0574; # ARMENIAN CAPITAL LETTER MEN +-0545; C; 0575; # ARMENIAN CAPITAL LETTER YI +-0546; C; 0576; # ARMENIAN CAPITAL LETTER NOW +-0547; C; 0577; # ARMENIAN CAPITAL LETTER SHA +-0548; C; 0578; # ARMENIAN CAPITAL LETTER VO +-0549; C; 0579; # ARMENIAN CAPITAL LETTER CHA +-054A; C; 057A; # ARMENIAN CAPITAL LETTER PEH +-054B; C; 057B; # ARMENIAN CAPITAL LETTER JHEH +-054C; C; 057C; # ARMENIAN CAPITAL LETTER RA +-054D; C; 057D; # ARMENIAN CAPITAL LETTER SEH +-054E; C; 057E; # ARMENIAN CAPITAL LETTER VEW +-054F; C; 057F; # ARMENIAN CAPITAL LETTER TIWN +-0550; C; 0580; # ARMENIAN CAPITAL LETTER REH +-0551; C; 0581; # ARMENIAN CAPITAL LETTER CO +-0552; C; 0582; # ARMENIAN CAPITAL LETTER YIWN +-0553; C; 0583; # ARMENIAN CAPITAL LETTER PIWR +-0554; C; 0584; # ARMENIAN CAPITAL LETTER KEH +-0555; C; 0585; # ARMENIAN CAPITAL LETTER OH +-0556; C; 0586; # ARMENIAN CAPITAL LETTER FEH +-0587; F; 0565 0582; # ARMENIAN SMALL LIGATURE ECH YIWN +-10A0; C; 2D00; # GEORGIAN CAPITAL LETTER AN +-10A1; C; 2D01; # GEORGIAN CAPITAL LETTER BAN +-10A2; C; 2D02; # GEORGIAN CAPITAL LETTER GAN +-10A3; C; 2D03; # GEORGIAN CAPITAL LETTER DON +-10A4; C; 2D04; # GEORGIAN CAPITAL LETTER EN +-10A5; C; 2D05; # GEORGIAN CAPITAL LETTER VIN +-10A6; C; 2D06; # GEORGIAN CAPITAL LETTER ZEN +-10A7; C; 2D07; # GEORGIAN CAPITAL LETTER TAN +-10A8; C; 2D08; # GEORGIAN CAPITAL LETTER IN +-10A9; C; 2D09; # GEORGIAN CAPITAL LETTER KAN +-10AA; C; 2D0A; # GEORGIAN CAPITAL LETTER LAS +-10AB; C; 2D0B; # GEORGIAN CAPITAL LETTER MAN +-10AC; C; 2D0C; # GEORGIAN CAPITAL LETTER NAR +-10AD; C; 2D0D; # GEORGIAN CAPITAL LETTER ON +-10AE; C; 2D0E; # GEORGIAN CAPITAL LETTER PAR +-10AF; C; 2D0F; # GEORGIAN CAPITAL LETTER ZHAR +-10B0; C; 2D10; # GEORGIAN CAPITAL LETTER RAE +-10B1; C; 2D11; # GEORGIAN CAPITAL LETTER SAN +-10B2; C; 2D12; # GEORGIAN CAPITAL LETTER TAR +-10B3; C; 2D13; # GEORGIAN CAPITAL LETTER UN +-10B4; C; 2D14; # GEORGIAN CAPITAL LETTER PHAR +-10B5; C; 2D15; # GEORGIAN CAPITAL LETTER KHAR +-10B6; C; 2D16; # GEORGIAN CAPITAL LETTER GHAN +-10B7; C; 2D17; # GEORGIAN CAPITAL LETTER QAR +-10B8; C; 2D18; # GEORGIAN CAPITAL LETTER SHIN +-10B9; C; 2D19; # GEORGIAN CAPITAL LETTER CHIN +-10BA; C; 2D1A; # GEORGIAN CAPITAL LETTER CAN +-10BB; C; 2D1B; # GEORGIAN CAPITAL LETTER JIL +-10BC; C; 2D1C; # GEORGIAN CAPITAL LETTER CIL +-10BD; C; 2D1D; # GEORGIAN CAPITAL LETTER CHAR +-10BE; C; 2D1E; # GEORGIAN CAPITAL LETTER XAN +-10BF; C; 2D1F; # GEORGIAN CAPITAL LETTER JHAN +-10C0; C; 2D20; # GEORGIAN CAPITAL LETTER HAE +-10C1; C; 2D21; # GEORGIAN CAPITAL LETTER HE +-10C2; C; 2D22; # GEORGIAN CAPITAL LETTER HIE +-10C3; C; 2D23; # GEORGIAN CAPITAL LETTER WE +-10C4; C; 2D24; # GEORGIAN CAPITAL LETTER HAR +-10C5; C; 2D25; # GEORGIAN CAPITAL LETTER HOE +-10C7; C; 2D27; # GEORGIAN CAPITAL LETTER YN +-10CD; C; 2D2D; # GEORGIAN CAPITAL LETTER AEN +-13F8; C; 13F0; # CHEROKEE SMALL LETTER YE +-13F9; C; 13F1; # CHEROKEE SMALL LETTER YI +-13FA; C; 13F2; # CHEROKEE SMALL LETTER YO +-13FB; C; 13F3; # CHEROKEE SMALL LETTER YU +-13FC; C; 13F4; # CHEROKEE SMALL LETTER YV +-13FD; C; 13F5; # CHEROKEE SMALL LETTER MV +-1C80; C; 0432; # CYRILLIC SMALL LETTER ROUNDED VE +-1C81; C; 0434; # CYRILLIC SMALL LETTER LONG-LEGGED DE +-1C82; C; 043E; # CYRILLIC SMALL LETTER NARROW O +-1C83; C; 0441; # CYRILLIC SMALL LETTER WIDE ES +-1C84; C; 0442; # CYRILLIC SMALL LETTER TALL TE +-1C85; C; 0442; # CYRILLIC SMALL LETTER THREE-LEGGED TE +-1C86; C; 044A; # CYRILLIC SMALL LETTER TALL HARD SIGN +-1C87; C; 0463; # CYRILLIC SMALL LETTER TALL YAT +-1C88; C; A64B; # CYRILLIC SMALL LETTER UNBLENDED UK +-1C90; C; 10D0; # GEORGIAN MTAVRULI CAPITAL LETTER AN +-1C91; C; 10D1; # GEORGIAN MTAVRULI CAPITAL LETTER BAN +-1C92; C; 10D2; # GEORGIAN MTAVRULI CAPITAL LETTER GAN +-1C93; C; 10D3; # GEORGIAN MTAVRULI CAPITAL LETTER DON +-1C94; C; 10D4; # GEORGIAN MTAVRULI CAPITAL LETTER EN +-1C95; C; 10D5; # GEORGIAN MTAVRULI CAPITAL LETTER VIN +-1C96; C; 10D6; # GEORGIAN MTAVRULI CAPITAL LETTER ZEN +-1C97; C; 10D7; # GEORGIAN MTAVRULI CAPITAL LETTER TAN +-1C98; C; 10D8; # GEORGIAN MTAVRULI CAPITAL LETTER IN +-1C99; C; 10D9; # GEORGIAN MTAVRULI CAPITAL LETTER KAN +-1C9A; C; 10DA; # GEORGIAN MTAVRULI CAPITAL LETTER LAS +-1C9B; C; 10DB; # GEORGIAN MTAVRULI CAPITAL LETTER MAN +-1C9C; C; 10DC; # GEORGIAN MTAVRULI CAPITAL LETTER NAR +-1C9D; C; 10DD; # GEORGIAN MTAVRULI CAPITAL LETTER ON +-1C9E; C; 10DE; # GEORGIAN MTAVRULI CAPITAL LETTER PAR +-1C9F; C; 10DF; # GEORGIAN MTAVRULI CAPITAL LETTER ZHAR +-1CA0; C; 10E0; # GEORGIAN MTAVRULI CAPITAL LETTER RAE +-1CA1; C; 10E1; # GEORGIAN MTAVRULI CAPITAL LETTER SAN +-1CA2; C; 10E2; # GEORGIAN MTAVRULI CAPITAL LETTER TAR +-1CA3; C; 10E3; # GEORGIAN MTAVRULI CAPITAL LETTER UN +-1CA4; C; 10E4; # GEORGIAN MTAVRULI CAPITAL LETTER PHAR +-1CA5; C; 10E5; # GEORGIAN MTAVRULI CAPITAL LETTER KHAR +-1CA6; C; 10E6; # GEORGIAN MTAVRULI CAPITAL LETTER GHAN +-1CA7; C; 10E7; # GEORGIAN MTAVRULI CAPITAL LETTER QAR +-1CA8; C; 10E8; # GEORGIAN MTAVRULI CAPITAL LETTER SHIN +-1CA9; C; 10E9; # GEORGIAN MTAVRULI CAPITAL LETTER CHIN +-1CAA; C; 10EA; # GEORGIAN MTAVRULI CAPITAL LETTER CAN +-1CAB; C; 10EB; # GEORGIAN MTAVRULI CAPITAL LETTER JIL +-1CAC; C; 10EC; # GEORGIAN MTAVRULI CAPITAL LETTER CIL +-1CAD; C; 10ED; # GEORGIAN MTAVRULI CAPITAL LETTER CHAR +-1CAE; C; 10EE; # GEORGIAN MTAVRULI CAPITAL LETTER XAN +-1CAF; C; 10EF; # GEORGIAN MTAVRULI CAPITAL LETTER JHAN +-1CB0; C; 10F0; # GEORGIAN MTAVRULI CAPITAL LETTER HAE +-1CB1; C; 10F1; # GEORGIAN MTAVRULI CAPITAL LETTER HE +-1CB2; C; 10F2; # GEORGIAN MTAVRULI CAPITAL LETTER HIE +-1CB3; C; 10F3; # GEORGIAN MTAVRULI CAPITAL LETTER WE +-1CB4; C; 10F4; # GEORGIAN MTAVRULI CAPITAL LETTER HAR +-1CB5; C; 10F5; # GEORGIAN MTAVRULI CAPITAL LETTER HOE +-1CB6; C; 10F6; # GEORGIAN MTAVRULI CAPITAL LETTER FI +-1CB7; C; 10F7; # GEORGIAN MTAVRULI CAPITAL LETTER YN +-1CB8; C; 10F8; # GEORGIAN MTAVRULI CAPITAL LETTER ELIFI +-1CB9; C; 10F9; # GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN +-1CBA; C; 10FA; # GEORGIAN MTAVRULI CAPITAL LETTER AIN +-1CBD; C; 10FD; # GEORGIAN MTAVRULI CAPITAL LETTER AEN +-1CBE; C; 10FE; # GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN +-1CBF; C; 10FF; # GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +-1E00; C; 1E01; # LATIN CAPITAL LETTER A WITH RING BELOW +-1E02; C; 1E03; # LATIN CAPITAL LETTER B WITH DOT ABOVE +-1E04; C; 1E05; # LATIN CAPITAL LETTER B WITH DOT BELOW +-1E06; C; 1E07; # LATIN CAPITAL LETTER B WITH LINE BELOW +-1E08; C; 1E09; # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +-1E0A; C; 1E0B; # LATIN CAPITAL LETTER D WITH DOT ABOVE +-1E0C; C; 1E0D; # LATIN CAPITAL LETTER D WITH DOT BELOW +-1E0E; C; 1E0F; # LATIN CAPITAL LETTER D WITH LINE BELOW +-1E10; C; 1E11; # LATIN CAPITAL LETTER D WITH CEDILLA +-1E12; C; 1E13; # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +-1E14; C; 1E15; # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +-1E16; C; 1E17; # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +-1E18; C; 1E19; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +-1E1A; C; 1E1B; # LATIN CAPITAL LETTER E WITH TILDE BELOW +-1E1C; C; 1E1D; # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +-1E1E; C; 1E1F; # LATIN CAPITAL LETTER F WITH DOT ABOVE +-1E20; C; 1E21; # LATIN CAPITAL LETTER G WITH MACRON +-1E22; C; 1E23; # LATIN CAPITAL LETTER H WITH DOT ABOVE +-1E24; C; 1E25; # LATIN CAPITAL LETTER H WITH DOT BELOW +-1E26; C; 1E27; # LATIN CAPITAL LETTER H WITH DIAERESIS +-1E28; C; 1E29; # LATIN CAPITAL LETTER H WITH CEDILLA +-1E2A; C; 1E2B; # LATIN CAPITAL LETTER H WITH BREVE BELOW +-1E2C; C; 1E2D; # LATIN CAPITAL LETTER I WITH TILDE BELOW +-1E2E; C; 1E2F; # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +-1E30; C; 1E31; # LATIN CAPITAL LETTER K WITH ACUTE +-1E32; C; 1E33; # LATIN CAPITAL LETTER K WITH DOT BELOW +-1E34; C; 1E35; # LATIN CAPITAL LETTER K WITH LINE BELOW +-1E36; C; 1E37; # LATIN CAPITAL LETTER L WITH DOT BELOW +-1E38; C; 1E39; # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +-1E3A; C; 1E3B; # LATIN CAPITAL LETTER L WITH LINE BELOW +-1E3C; C; 1E3D; # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +-1E3E; C; 1E3F; # LATIN CAPITAL LETTER M WITH ACUTE +-1E40; C; 1E41; # LATIN CAPITAL LETTER M WITH DOT ABOVE +-1E42; C; 1E43; # LATIN CAPITAL LETTER M WITH DOT BELOW +-1E44; C; 1E45; # LATIN CAPITAL LETTER N WITH DOT ABOVE +-1E46; C; 1E47; # LATIN CAPITAL LETTER N WITH DOT BELOW +-1E48; C; 1E49; # LATIN CAPITAL LETTER N WITH LINE BELOW +-1E4A; C; 1E4B; # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +-1E4C; C; 1E4D; # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +-1E4E; C; 1E4F; # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +-1E50; C; 1E51; # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +-1E52; C; 1E53; # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +-1E54; C; 1E55; # LATIN CAPITAL LETTER P WITH ACUTE +-1E56; C; 1E57; # LATIN CAPITAL LETTER P WITH DOT ABOVE +-1E58; C; 1E59; # LATIN CAPITAL LETTER R WITH DOT ABOVE +-1E5A; C; 1E5B; # LATIN CAPITAL LETTER R WITH DOT BELOW +-1E5C; C; 1E5D; # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +-1E5E; C; 1E5F; # LATIN CAPITAL LETTER R WITH LINE BELOW +-1E60; C; 1E61; # LATIN CAPITAL LETTER S WITH DOT ABOVE +-1E62; C; 1E63; # LATIN CAPITAL LETTER S WITH DOT BELOW +-1E64; C; 1E65; # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +-1E66; C; 1E67; # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +-1E68; C; 1E69; # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +-1E6A; C; 1E6B; # LATIN CAPITAL LETTER T WITH DOT ABOVE +-1E6C; C; 1E6D; # LATIN CAPITAL LETTER T WITH DOT BELOW +-1E6E; C; 1E6F; # LATIN CAPITAL LETTER T WITH LINE BELOW +-1E70; C; 1E71; # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +-1E72; C; 1E73; # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +-1E74; C; 1E75; # LATIN CAPITAL LETTER U WITH TILDE BELOW +-1E76; C; 1E77; # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +-1E78; C; 1E79; # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +-1E7A; C; 1E7B; # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +-1E7C; C; 1E7D; # LATIN CAPITAL LETTER V WITH TILDE +-1E7E; C; 1E7F; # LATIN CAPITAL LETTER V WITH DOT BELOW +-1E80; C; 1E81; # LATIN CAPITAL LETTER W WITH GRAVE +-1E82; C; 1E83; # LATIN CAPITAL LETTER W WITH ACUTE +-1E84; C; 1E85; # LATIN CAPITAL LETTER W WITH DIAERESIS +-1E86; C; 1E87; # LATIN CAPITAL LETTER W WITH DOT ABOVE +-1E88; C; 1E89; # LATIN CAPITAL LETTER W WITH DOT BELOW +-1E8A; C; 1E8B; # LATIN CAPITAL LETTER X WITH DOT ABOVE +-1E8C; C; 1E8D; # LATIN CAPITAL LETTER X WITH DIAERESIS +-1E8E; C; 1E8F; # LATIN CAPITAL LETTER Y WITH DOT ABOVE +-1E90; C; 1E91; # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +-1E92; C; 1E93; # LATIN CAPITAL LETTER Z WITH DOT BELOW +-1E94; C; 1E95; # LATIN CAPITAL LETTER Z WITH LINE BELOW +-1E96; F; 0068 0331; # LATIN SMALL LETTER H WITH LINE BELOW +-1E97; F; 0074 0308; # LATIN SMALL LETTER T WITH DIAERESIS +-1E98; F; 0077 030A; # LATIN SMALL LETTER W WITH RING ABOVE +-1E99; F; 0079 030A; # LATIN SMALL LETTER Y WITH RING ABOVE +-1E9A; F; 0061 02BE; # LATIN SMALL LETTER A WITH RIGHT HALF RING +-1E9B; C; 1E61; # LATIN SMALL LETTER LONG S WITH DOT ABOVE +-1E9E; F; 0073 0073; # LATIN CAPITAL LETTER SHARP S +-1E9E; S; 00DF; # LATIN CAPITAL LETTER SHARP S +-1EA0; C; 1EA1; # LATIN CAPITAL LETTER A WITH DOT BELOW +-1EA2; C; 1EA3; # LATIN CAPITAL LETTER A WITH HOOK ABOVE +-1EA4; C; 1EA5; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +-1EA6; C; 1EA7; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +-1EA8; C; 1EA9; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +-1EAA; C; 1EAB; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +-1EAC; C; 1EAD; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +-1EAE; C; 1EAF; # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +-1EB0; C; 1EB1; # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +-1EB2; C; 1EB3; # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +-1EB4; C; 1EB5; # LATIN CAPITAL LETTER A WITH BREVE AND TILDE +-1EB6; C; 1EB7; # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +-1EB8; C; 1EB9; # LATIN CAPITAL LETTER E WITH DOT BELOW +-1EBA; C; 1EBB; # LATIN CAPITAL LETTER E WITH HOOK ABOVE +-1EBC; C; 1EBD; # LATIN CAPITAL LETTER E WITH TILDE +-1EBE; C; 1EBF; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +-1EC0; C; 1EC1; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +-1EC2; C; 1EC3; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +-1EC4; C; 1EC5; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +-1EC6; C; 1EC7; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +-1EC8; C; 1EC9; # LATIN CAPITAL LETTER I WITH HOOK ABOVE +-1ECA; C; 1ECB; # LATIN CAPITAL LETTER I WITH DOT BELOW +-1ECC; C; 1ECD; # LATIN CAPITAL LETTER O WITH DOT BELOW +-1ECE; C; 1ECF; # LATIN CAPITAL LETTER O WITH HOOK ABOVE +-1ED0; C; 1ED1; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +-1ED2; C; 1ED3; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +-1ED4; C; 1ED5; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +-1ED6; C; 1ED7; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +-1ED8; C; 1ED9; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +-1EDA; C; 1EDB; # LATIN CAPITAL LETTER O WITH HORN AND ACUTE +-1EDC; C; 1EDD; # LATIN CAPITAL LETTER O WITH HORN AND GRAVE +-1EDE; C; 1EDF; # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +-1EE0; C; 1EE1; # LATIN CAPITAL LETTER O WITH HORN AND TILDE +-1EE2; C; 1EE3; # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +-1EE4; C; 1EE5; # LATIN CAPITAL LETTER U WITH DOT BELOW +-1EE6; C; 1EE7; # LATIN CAPITAL LETTER U WITH HOOK ABOVE +-1EE8; C; 1EE9; # LATIN CAPITAL LETTER U WITH HORN AND ACUTE +-1EEA; C; 1EEB; # LATIN CAPITAL LETTER U WITH HORN AND GRAVE +-1EEC; C; 1EED; # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +-1EEE; C; 1EEF; # LATIN CAPITAL LETTER U WITH HORN AND TILDE +-1EF0; C; 1EF1; # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +-1EF2; C; 1EF3; # LATIN CAPITAL LETTER Y WITH GRAVE +-1EF4; C; 1EF5; # LATIN CAPITAL LETTER Y WITH DOT BELOW +-1EF6; C; 1EF7; # LATIN CAPITAL LETTER Y WITH HOOK ABOVE +-1EF8; C; 1EF9; # LATIN CAPITAL LETTER Y WITH TILDE +-1EFA; C; 1EFB; # LATIN CAPITAL LETTER MIDDLE-WELSH LL +-1EFC; C; 1EFD; # LATIN CAPITAL LETTER MIDDLE-WELSH V +-1EFE; C; 1EFF; # LATIN CAPITAL LETTER Y WITH LOOP +-1F08; C; 1F00; # GREEK CAPITAL LETTER ALPHA WITH PSILI +-1F09; C; 1F01; # GREEK CAPITAL LETTER ALPHA WITH DASIA +-1F0A; C; 1F02; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA +-1F0B; C; 1F03; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA +-1F0C; C; 1F04; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA +-1F0D; C; 1F05; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA +-1F0E; C; 1F06; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI +-1F0F; C; 1F07; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +-1F18; C; 1F10; # GREEK CAPITAL LETTER EPSILON WITH PSILI +-1F19; C; 1F11; # GREEK CAPITAL LETTER EPSILON WITH DASIA +-1F1A; C; 1F12; # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA +-1F1B; C; 1F13; # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA +-1F1C; C; 1F14; # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA +-1F1D; C; 1F15; # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +-1F28; C; 1F20; # GREEK CAPITAL LETTER ETA WITH PSILI +-1F29; C; 1F21; # GREEK CAPITAL LETTER ETA WITH DASIA +-1F2A; C; 1F22; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA +-1F2B; C; 1F23; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA +-1F2C; C; 1F24; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA +-1F2D; C; 1F25; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA +-1F2E; C; 1F26; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI +-1F2F; C; 1F27; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +-1F38; C; 1F30; # GREEK CAPITAL LETTER IOTA WITH PSILI +-1F39; C; 1F31; # GREEK CAPITAL LETTER IOTA WITH DASIA +-1F3A; C; 1F32; # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA +-1F3B; C; 1F33; # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA +-1F3C; C; 1F34; # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA +-1F3D; C; 1F35; # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA +-1F3E; C; 1F36; # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI +-1F3F; C; 1F37; # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +-1F48; C; 1F40; # GREEK CAPITAL LETTER OMICRON WITH PSILI +-1F49; C; 1F41; # GREEK CAPITAL LETTER OMICRON WITH DASIA +-1F4A; C; 1F42; # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA +-1F4B; C; 1F43; # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA +-1F4C; C; 1F44; # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA +-1F4D; C; 1F45; # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +-1F50; F; 03C5 0313; # GREEK SMALL LETTER UPSILON WITH PSILI +-1F52; F; 03C5 0313 0300; # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +-1F54; F; 03C5 0313 0301; # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +-1F56; F; 03C5 0313 0342; # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +-1F59; C; 1F51; # GREEK CAPITAL LETTER UPSILON WITH DASIA +-1F5B; C; 1F53; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +-1F5D; C; 1F55; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +-1F5F; C; 1F57; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +-1F68; C; 1F60; # GREEK CAPITAL LETTER OMEGA WITH PSILI +-1F69; C; 1F61; # GREEK CAPITAL LETTER OMEGA WITH DASIA +-1F6A; C; 1F62; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA +-1F6B; C; 1F63; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA +-1F6C; C; 1F64; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA +-1F6D; C; 1F65; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA +-1F6E; C; 1F66; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI +-1F6F; C; 1F67; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +-1F80; F; 1F00 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +-1F81; F; 1F01 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +-1F82; F; 1F02 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +-1F83; F; 1F03 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +-1F84; F; 1F04 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +-1F85; F; 1F05 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +-1F86; F; 1F06 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +-1F87; F; 1F07 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +-1F88; F; 1F00 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +-1F88; S; 1F80; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +-1F89; F; 1F01 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +-1F89; S; 1F81; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +-1F8A; F; 1F02 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +-1F8A; S; 1F82; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +-1F8B; F; 1F03 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +-1F8B; S; 1F83; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +-1F8C; F; 1F04 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +-1F8C; S; 1F84; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +-1F8D; F; 1F05 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +-1F8D; S; 1F85; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +-1F8E; F; 1F06 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +-1F8E; S; 1F86; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +-1F8F; F; 1F07 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +-1F8F; S; 1F87; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +-1F90; F; 1F20 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +-1F91; F; 1F21 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +-1F92; F; 1F22 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +-1F93; F; 1F23 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +-1F94; F; 1F24 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +-1F95; F; 1F25 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +-1F96; F; 1F26 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +-1F97; F; 1F27 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +-1F98; F; 1F20 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +-1F98; S; 1F90; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +-1F99; F; 1F21 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +-1F99; S; 1F91; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +-1F9A; F; 1F22 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +-1F9A; S; 1F92; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +-1F9B; F; 1F23 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +-1F9B; S; 1F93; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +-1F9C; F; 1F24 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +-1F9C; S; 1F94; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +-1F9D; F; 1F25 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +-1F9D; S; 1F95; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +-1F9E; F; 1F26 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +-1F9E; S; 1F96; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +-1F9F; F; 1F27 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +-1F9F; S; 1F97; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +-1FA0; F; 1F60 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +-1FA1; F; 1F61 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +-1FA2; F; 1F62 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +-1FA3; F; 1F63 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +-1FA4; F; 1F64 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +-1FA5; F; 1F65 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +-1FA6; F; 1F66 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +-1FA7; F; 1F67 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +-1FA8; F; 1F60 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +-1FA8; S; 1FA0; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +-1FA9; F; 1F61 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +-1FA9; S; 1FA1; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +-1FAA; F; 1F62 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +-1FAA; S; 1FA2; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +-1FAB; F; 1F63 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +-1FAB; S; 1FA3; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +-1FAC; F; 1F64 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +-1FAC; S; 1FA4; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +-1FAD; F; 1F65 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +-1FAD; S; 1FA5; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +-1FAE; F; 1F66 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +-1FAE; S; 1FA6; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +-1FAF; F; 1F67 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +-1FAF; S; 1FA7; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +-1FB2; F; 1F70 03B9; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +-1FB3; F; 03B1 03B9; # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +-1FB4; F; 03AC 03B9; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +-1FB6; F; 03B1 0342; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI +-1FB7; F; 03B1 0342 03B9; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +-1FB8; C; 1FB0; # GREEK CAPITAL LETTER ALPHA WITH VRACHY +-1FB9; C; 1FB1; # GREEK CAPITAL LETTER ALPHA WITH MACRON +-1FBA; C; 1F70; # GREEK CAPITAL LETTER ALPHA WITH VARIA +-1FBB; C; 1F71; # GREEK CAPITAL LETTER ALPHA WITH OXIA +-1FBC; F; 03B1 03B9; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +-1FBC; S; 1FB3; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +-1FBE; C; 03B9; # GREEK PROSGEGRAMMENI +-1FC2; F; 1F74 03B9; # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +-1FC3; F; 03B7 03B9; # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +-1FC4; F; 03AE 03B9; # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +-1FC6; F; 03B7 0342; # GREEK SMALL LETTER ETA WITH PERISPOMENI +-1FC7; F; 03B7 0342 03B9; # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +-1FC8; C; 1F72; # GREEK CAPITAL LETTER EPSILON WITH VARIA +-1FC9; C; 1F73; # GREEK CAPITAL LETTER EPSILON WITH OXIA +-1FCA; C; 1F74; # GREEK CAPITAL LETTER ETA WITH VARIA +-1FCB; C; 1F75; # GREEK CAPITAL LETTER ETA WITH OXIA +-1FCC; F; 03B7 03B9; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +-1FCC; S; 1FC3; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +-1FD2; F; 03B9 0308 0300; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +-1FD3; F; 03B9 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +-1FD6; F; 03B9 0342; # GREEK SMALL LETTER IOTA WITH PERISPOMENI +-1FD7; F; 03B9 0308 0342; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +-1FD8; C; 1FD0; # GREEK CAPITAL LETTER IOTA WITH VRACHY +-1FD9; C; 1FD1; # GREEK CAPITAL LETTER IOTA WITH MACRON +-1FDA; C; 1F76; # GREEK CAPITAL LETTER IOTA WITH VARIA +-1FDB; C; 1F77; # GREEK CAPITAL LETTER IOTA WITH OXIA +-1FE2; F; 03C5 0308 0300; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +-1FE3; F; 03C5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +-1FE4; F; 03C1 0313; # GREEK SMALL LETTER RHO WITH PSILI +-1FE6; F; 03C5 0342; # GREEK SMALL LETTER UPSILON WITH PERISPOMENI +-1FE7; F; 03C5 0308 0342; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +-1FE8; C; 1FE0; # GREEK CAPITAL LETTER UPSILON WITH VRACHY +-1FE9; C; 1FE1; # GREEK CAPITAL LETTER UPSILON WITH MACRON +-1FEA; C; 1F7A; # GREEK CAPITAL LETTER UPSILON WITH VARIA +-1FEB; C; 1F7B; # GREEK CAPITAL LETTER UPSILON WITH OXIA +-1FEC; C; 1FE5; # GREEK CAPITAL LETTER RHO WITH DASIA +-1FF2; F; 1F7C 03B9; # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +-1FF3; F; 03C9 03B9; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +-1FF4; F; 03CE 03B9; # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +-1FF6; F; 03C9 0342; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI +-1FF7; F; 03C9 0342 03B9; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +-1FF8; C; 1F78; # GREEK CAPITAL LETTER OMICRON WITH VARIA +-1FF9; C; 1F79; # GREEK CAPITAL LETTER OMICRON WITH OXIA +-1FFA; C; 1F7C; # GREEK CAPITAL LETTER OMEGA WITH VARIA +-1FFB; C; 1F7D; # GREEK CAPITAL LETTER OMEGA WITH OXIA +-1FFC; F; 03C9 03B9; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +-1FFC; S; 1FF3; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +-2126; C; 03C9; # OHM SIGN +-212A; C; 006B; # KELVIN SIGN +-212B; C; 00E5; # ANGSTROM SIGN +-2132; C; 214E; # TURNED CAPITAL F +-2160; C; 2170; # ROMAN NUMERAL ONE +-2161; C; 2171; # ROMAN NUMERAL TWO +-2162; C; 2172; # ROMAN NUMERAL THREE +-2163; C; 2173; # ROMAN NUMERAL FOUR +-2164; C; 2174; # ROMAN NUMERAL FIVE +-2165; C; 2175; # ROMAN NUMERAL SIX +-2166; C; 2176; # ROMAN NUMERAL SEVEN +-2167; C; 2177; # ROMAN NUMERAL EIGHT +-2168; C; 2178; # ROMAN NUMERAL NINE +-2169; C; 2179; # ROMAN NUMERAL TEN +-216A; C; 217A; # ROMAN NUMERAL ELEVEN +-216B; C; 217B; # ROMAN NUMERAL TWELVE +-216C; C; 217C; # ROMAN NUMERAL FIFTY +-216D; C; 217D; # ROMAN NUMERAL ONE HUNDRED +-216E; C; 217E; # ROMAN NUMERAL FIVE HUNDRED +-216F; C; 217F; # ROMAN NUMERAL ONE THOUSAND +-2183; C; 2184; # ROMAN NUMERAL REVERSED ONE HUNDRED +-24B6; C; 24D0; # CIRCLED LATIN CAPITAL LETTER A +-24B7; C; 24D1; # CIRCLED LATIN CAPITAL LETTER B +-24B8; C; 24D2; # CIRCLED LATIN CAPITAL LETTER C +-24B9; C; 24D3; # CIRCLED LATIN CAPITAL LETTER D +-24BA; C; 24D4; # CIRCLED LATIN CAPITAL LETTER E +-24BB; C; 24D5; # CIRCLED LATIN CAPITAL LETTER F +-24BC; C; 24D6; # CIRCLED LATIN CAPITAL LETTER G +-24BD; C; 24D7; # CIRCLED LATIN CAPITAL LETTER H +-24BE; C; 24D8; # CIRCLED LATIN CAPITAL LETTER I +-24BF; C; 24D9; # CIRCLED LATIN CAPITAL LETTER J +-24C0; C; 24DA; # CIRCLED LATIN CAPITAL LETTER K +-24C1; C; 24DB; # CIRCLED LATIN CAPITAL LETTER L +-24C2; C; 24DC; # CIRCLED LATIN CAPITAL LETTER M +-24C3; C; 24DD; # CIRCLED LATIN CAPITAL LETTER N +-24C4; C; 24DE; # CIRCLED LATIN CAPITAL LETTER O +-24C5; C; 24DF; # CIRCLED LATIN CAPITAL LETTER P +-24C6; C; 24E0; # CIRCLED LATIN CAPITAL LETTER Q +-24C7; C; 24E1; # CIRCLED LATIN CAPITAL LETTER R +-24C8; C; 24E2; # CIRCLED LATIN CAPITAL LETTER S +-24C9; C; 24E3; # CIRCLED LATIN CAPITAL LETTER T +-24CA; C; 24E4; # CIRCLED LATIN CAPITAL LETTER U +-24CB; C; 24E5; # CIRCLED LATIN CAPITAL LETTER V +-24CC; C; 24E6; # CIRCLED LATIN CAPITAL LETTER W +-24CD; C; 24E7; # CIRCLED LATIN CAPITAL LETTER X +-24CE; C; 24E8; # CIRCLED LATIN CAPITAL LETTER Y +-24CF; C; 24E9; # CIRCLED LATIN CAPITAL LETTER Z +-2C00; C; 2C30; # GLAGOLITIC CAPITAL LETTER AZU +-2C01; C; 2C31; # GLAGOLITIC CAPITAL LETTER BUKY +-2C02; C; 2C32; # GLAGOLITIC CAPITAL LETTER VEDE +-2C03; C; 2C33; # GLAGOLITIC CAPITAL LETTER GLAGOLI +-2C04; C; 2C34; # GLAGOLITIC CAPITAL LETTER DOBRO +-2C05; C; 2C35; # GLAGOLITIC CAPITAL LETTER YESTU +-2C06; C; 2C36; # GLAGOLITIC CAPITAL LETTER ZHIVETE +-2C07; C; 2C37; # GLAGOLITIC CAPITAL LETTER DZELO +-2C08; C; 2C38; # GLAGOLITIC CAPITAL LETTER ZEMLJA +-2C09; C; 2C39; # GLAGOLITIC CAPITAL LETTER IZHE +-2C0A; C; 2C3A; # GLAGOLITIC CAPITAL LETTER INITIAL IZHE +-2C0B; C; 2C3B; # GLAGOLITIC CAPITAL LETTER I +-2C0C; C; 2C3C; # GLAGOLITIC CAPITAL LETTER DJERVI +-2C0D; C; 2C3D; # GLAGOLITIC CAPITAL LETTER KAKO +-2C0E; C; 2C3E; # GLAGOLITIC CAPITAL LETTER LJUDIJE +-2C0F; C; 2C3F; # GLAGOLITIC CAPITAL LETTER MYSLITE +-2C10; C; 2C40; # GLAGOLITIC CAPITAL LETTER NASHI +-2C11; C; 2C41; # GLAGOLITIC CAPITAL LETTER ONU +-2C12; C; 2C42; # GLAGOLITIC CAPITAL LETTER POKOJI +-2C13; C; 2C43; # GLAGOLITIC CAPITAL LETTER RITSI +-2C14; C; 2C44; # GLAGOLITIC CAPITAL LETTER SLOVO +-2C15; C; 2C45; # GLAGOLITIC CAPITAL LETTER TVRIDO +-2C16; C; 2C46; # GLAGOLITIC CAPITAL LETTER UKU +-2C17; C; 2C47; # GLAGOLITIC CAPITAL LETTER FRITU +-2C18; C; 2C48; # GLAGOLITIC CAPITAL LETTER HERU +-2C19; C; 2C49; # GLAGOLITIC CAPITAL LETTER OTU +-2C1A; C; 2C4A; # GLAGOLITIC CAPITAL LETTER PE +-2C1B; C; 2C4B; # GLAGOLITIC CAPITAL LETTER SHTA +-2C1C; C; 2C4C; # GLAGOLITIC CAPITAL LETTER TSI +-2C1D; C; 2C4D; # GLAGOLITIC CAPITAL LETTER CHRIVI +-2C1E; C; 2C4E; # GLAGOLITIC CAPITAL LETTER SHA +-2C1F; C; 2C4F; # GLAGOLITIC CAPITAL LETTER YERU +-2C20; C; 2C50; # GLAGOLITIC CAPITAL LETTER YERI +-2C21; C; 2C51; # GLAGOLITIC CAPITAL LETTER YATI +-2C22; C; 2C52; # GLAGOLITIC CAPITAL LETTER SPIDERY HA +-2C23; C; 2C53; # GLAGOLITIC CAPITAL LETTER YU +-2C24; C; 2C54; # GLAGOLITIC CAPITAL LETTER SMALL YUS +-2C25; C; 2C55; # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL +-2C26; C; 2C56; # GLAGOLITIC CAPITAL LETTER YO +-2C27; C; 2C57; # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS +-2C28; C; 2C58; # GLAGOLITIC CAPITAL LETTER BIG YUS +-2C29; C; 2C59; # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS +-2C2A; C; 2C5A; # GLAGOLITIC CAPITAL LETTER FITA +-2C2B; C; 2C5B; # GLAGOLITIC CAPITAL LETTER IZHITSA +-2C2C; C; 2C5C; # GLAGOLITIC CAPITAL LETTER SHTAPIC +-2C2D; C; 2C5D; # GLAGOLITIC CAPITAL LETTER TROKUTASTI A +-2C2E; C; 2C5E; # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +-2C60; C; 2C61; # LATIN CAPITAL LETTER L WITH DOUBLE BAR +-2C62; C; 026B; # LATIN CAPITAL LETTER L WITH MIDDLE TILDE +-2C63; C; 1D7D; # LATIN CAPITAL LETTER P WITH STROKE +-2C64; C; 027D; # LATIN CAPITAL LETTER R WITH TAIL +-2C67; C; 2C68; # LATIN CAPITAL LETTER H WITH DESCENDER +-2C69; C; 2C6A; # LATIN CAPITAL LETTER K WITH DESCENDER +-2C6B; C; 2C6C; # LATIN CAPITAL LETTER Z WITH DESCENDER +-2C6D; C; 0251; # LATIN CAPITAL LETTER ALPHA +-2C6E; C; 0271; # LATIN CAPITAL LETTER M WITH HOOK +-2C6F; C; 0250; # LATIN CAPITAL LETTER TURNED A +-2C70; C; 0252; # LATIN CAPITAL LETTER TURNED ALPHA +-2C72; C; 2C73; # LATIN CAPITAL LETTER W WITH HOOK +-2C75; C; 2C76; # LATIN CAPITAL LETTER HALF H +-2C7E; C; 023F; # LATIN CAPITAL LETTER S WITH SWASH TAIL +-2C7F; C; 0240; # LATIN CAPITAL LETTER Z WITH SWASH TAIL +-2C80; C; 2C81; # COPTIC CAPITAL LETTER ALFA +-2C82; C; 2C83; # COPTIC CAPITAL LETTER VIDA +-2C84; C; 2C85; # COPTIC CAPITAL LETTER GAMMA +-2C86; C; 2C87; # COPTIC CAPITAL LETTER DALDA +-2C88; C; 2C89; # COPTIC CAPITAL LETTER EIE +-2C8A; C; 2C8B; # COPTIC CAPITAL LETTER SOU +-2C8C; C; 2C8D; # COPTIC CAPITAL LETTER ZATA +-2C8E; C; 2C8F; # COPTIC CAPITAL LETTER HATE +-2C90; C; 2C91; # COPTIC CAPITAL LETTER THETHE +-2C92; C; 2C93; # COPTIC CAPITAL LETTER IAUDA +-2C94; C; 2C95; # COPTIC CAPITAL LETTER KAPA +-2C96; C; 2C97; # COPTIC CAPITAL LETTER LAULA +-2C98; C; 2C99; # COPTIC CAPITAL LETTER MI +-2C9A; C; 2C9B; # COPTIC CAPITAL LETTER NI +-2C9C; C; 2C9D; # COPTIC CAPITAL LETTER KSI +-2C9E; C; 2C9F; # COPTIC CAPITAL LETTER O +-2CA0; C; 2CA1; # COPTIC CAPITAL LETTER PI +-2CA2; C; 2CA3; # COPTIC CAPITAL LETTER RO +-2CA4; C; 2CA5; # COPTIC CAPITAL LETTER SIMA +-2CA6; C; 2CA7; # COPTIC CAPITAL LETTER TAU +-2CA8; C; 2CA9; # COPTIC CAPITAL LETTER UA +-2CAA; C; 2CAB; # COPTIC CAPITAL LETTER FI +-2CAC; C; 2CAD; # COPTIC CAPITAL LETTER KHI +-2CAE; C; 2CAF; # COPTIC CAPITAL LETTER PSI +-2CB0; C; 2CB1; # COPTIC CAPITAL LETTER OOU +-2CB2; C; 2CB3; # COPTIC CAPITAL LETTER DIALECT-P ALEF +-2CB4; C; 2CB5; # COPTIC CAPITAL LETTER OLD COPTIC AIN +-2CB6; C; 2CB7; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +-2CB8; C; 2CB9; # COPTIC CAPITAL LETTER DIALECT-P KAPA +-2CBA; C; 2CBB; # COPTIC CAPITAL LETTER DIALECT-P NI +-2CBC; C; 2CBD; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +-2CBE; C; 2CBF; # COPTIC CAPITAL LETTER OLD COPTIC OOU +-2CC0; C; 2CC1; # COPTIC CAPITAL LETTER SAMPI +-2CC2; C; 2CC3; # COPTIC CAPITAL LETTER CROSSED SHEI +-2CC4; C; 2CC5; # COPTIC CAPITAL LETTER OLD COPTIC SHEI +-2CC6; C; 2CC7; # COPTIC CAPITAL LETTER OLD COPTIC ESH +-2CC8; C; 2CC9; # COPTIC CAPITAL LETTER AKHMIMIC KHEI +-2CCA; C; 2CCB; # COPTIC CAPITAL LETTER DIALECT-P HORI +-2CCC; C; 2CCD; # COPTIC CAPITAL LETTER OLD COPTIC HORI +-2CCE; C; 2CCF; # COPTIC CAPITAL LETTER OLD COPTIC HA +-2CD0; C; 2CD1; # COPTIC CAPITAL LETTER L-SHAPED HA +-2CD2; C; 2CD3; # COPTIC CAPITAL LETTER OLD COPTIC HEI +-2CD4; C; 2CD5; # COPTIC CAPITAL LETTER OLD COPTIC HAT +-2CD6; C; 2CD7; # COPTIC CAPITAL LETTER OLD COPTIC GANGIA +-2CD8; C; 2CD9; # COPTIC CAPITAL LETTER OLD COPTIC DJA +-2CDA; C; 2CDB; # COPTIC CAPITAL LETTER OLD COPTIC SHIMA +-2CDC; C; 2CDD; # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +-2CDE; C; 2CDF; # COPTIC CAPITAL LETTER OLD NUBIAN NGI +-2CE0; C; 2CE1; # COPTIC CAPITAL LETTER OLD NUBIAN NYI +-2CE2; C; 2CE3; # COPTIC CAPITAL LETTER OLD NUBIAN WAU +-2CEB; C; 2CEC; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI +-2CED; C; 2CEE; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA +-2CF2; C; 2CF3; # COPTIC CAPITAL LETTER BOHAIRIC KHEI +-A640; C; A641; # CYRILLIC CAPITAL LETTER ZEMLYA +-A642; C; A643; # CYRILLIC CAPITAL LETTER DZELO +-A644; C; A645; # CYRILLIC CAPITAL LETTER REVERSED DZE +-A646; C; A647; # CYRILLIC CAPITAL LETTER IOTA +-A648; C; A649; # CYRILLIC CAPITAL LETTER DJERV +-A64A; C; A64B; # CYRILLIC CAPITAL LETTER MONOGRAPH UK +-A64C; C; A64D; # CYRILLIC CAPITAL LETTER BROAD OMEGA +-A64E; C; A64F; # CYRILLIC CAPITAL LETTER NEUTRAL YER +-A650; C; A651; # CYRILLIC CAPITAL LETTER YERU WITH BACK YER +-A652; C; A653; # CYRILLIC CAPITAL LETTER IOTIFIED YAT +-A654; C; A655; # CYRILLIC CAPITAL LETTER REVERSED YU +-A656; C; A657; # CYRILLIC CAPITAL LETTER IOTIFIED A +-A658; C; A659; # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS +-A65A; C; A65B; # CYRILLIC CAPITAL LETTER BLENDED YUS +-A65C; C; A65D; # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS +-A65E; C; A65F; # CYRILLIC CAPITAL LETTER YN +-A660; C; A661; # CYRILLIC CAPITAL LETTER REVERSED TSE +-A662; C; A663; # CYRILLIC CAPITAL LETTER SOFT DE +-A664; C; A665; # CYRILLIC CAPITAL LETTER SOFT EL +-A666; C; A667; # CYRILLIC CAPITAL LETTER SOFT EM +-A668; C; A669; # CYRILLIC CAPITAL LETTER MONOCULAR O +-A66A; C; A66B; # CYRILLIC CAPITAL LETTER BINOCULAR O +-A66C; C; A66D; # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O +-A680; C; A681; # CYRILLIC CAPITAL LETTER DWE +-A682; C; A683; # CYRILLIC CAPITAL LETTER DZWE +-A684; C; A685; # CYRILLIC CAPITAL LETTER ZHWE +-A686; C; A687; # CYRILLIC CAPITAL LETTER CCHE +-A688; C; A689; # CYRILLIC CAPITAL LETTER DZZE +-A68A; C; A68B; # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK +-A68C; C; A68D; # CYRILLIC CAPITAL LETTER TWE +-A68E; C; A68F; # CYRILLIC CAPITAL LETTER TSWE +-A690; C; A691; # CYRILLIC CAPITAL LETTER TSSE +-A692; C; A693; # CYRILLIC CAPITAL LETTER TCHE +-A694; C; A695; # CYRILLIC CAPITAL LETTER HWE +-A696; C; A697; # CYRILLIC CAPITAL LETTER SHWE +-A698; C; A699; # CYRILLIC CAPITAL LETTER DOUBLE O +-A69A; C; A69B; # CYRILLIC CAPITAL LETTER CROSSED O +-A722; C; A723; # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF +-A724; C; A725; # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN +-A726; C; A727; # LATIN CAPITAL LETTER HENG +-A728; C; A729; # LATIN CAPITAL LETTER TZ +-A72A; C; A72B; # LATIN CAPITAL LETTER TRESILLO +-A72C; C; A72D; # LATIN CAPITAL LETTER CUATRILLO +-A72E; C; A72F; # LATIN CAPITAL LETTER CUATRILLO WITH COMMA +-A732; C; A733; # LATIN CAPITAL LETTER AA +-A734; C; A735; # LATIN CAPITAL LETTER AO +-A736; C; A737; # LATIN CAPITAL LETTER AU +-A738; C; A739; # LATIN CAPITAL LETTER AV +-A73A; C; A73B; # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR +-A73C; C; A73D; # LATIN CAPITAL LETTER AY +-A73E; C; A73F; # LATIN CAPITAL LETTER REVERSED C WITH DOT +-A740; C; A741; # LATIN CAPITAL LETTER K WITH STROKE +-A742; C; A743; # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE +-A744; C; A745; # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE +-A746; C; A747; # LATIN CAPITAL LETTER BROKEN L +-A748; C; A749; # LATIN CAPITAL LETTER L WITH HIGH STROKE +-A74A; C; A74B; # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY +-A74C; C; A74D; # LATIN CAPITAL LETTER O WITH LOOP +-A74E; C; A74F; # LATIN CAPITAL LETTER OO +-A750; C; A751; # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER +-A752; C; A753; # LATIN CAPITAL LETTER P WITH FLOURISH +-A754; C; A755; # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL +-A756; C; A757; # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER +-A758; C; A759; # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE +-A75A; C; A75B; # LATIN CAPITAL LETTER R ROTUNDA +-A75C; C; A75D; # LATIN CAPITAL LETTER RUM ROTUNDA +-A75E; C; A75F; # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE +-A760; C; A761; # LATIN CAPITAL LETTER VY +-A762; C; A763; # LATIN CAPITAL LETTER VISIGOTHIC Z +-A764; C; A765; # LATIN CAPITAL LETTER THORN WITH STROKE +-A766; C; A767; # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER +-A768; C; A769; # LATIN CAPITAL LETTER VEND +-A76A; C; A76B; # LATIN CAPITAL LETTER ET +-A76C; C; A76D; # LATIN CAPITAL LETTER IS +-A76E; C; A76F; # LATIN CAPITAL LETTER CON +-A779; C; A77A; # LATIN CAPITAL LETTER INSULAR D +-A77B; C; A77C; # LATIN CAPITAL LETTER INSULAR F +-A77D; C; 1D79; # LATIN CAPITAL LETTER INSULAR G +-A77E; C; A77F; # LATIN CAPITAL LETTER TURNED INSULAR G +-A780; C; A781; # LATIN CAPITAL LETTER TURNED L +-A782; C; A783; # LATIN CAPITAL LETTER INSULAR R +-A784; C; A785; # LATIN CAPITAL LETTER INSULAR S +-A786; C; A787; # LATIN CAPITAL LETTER INSULAR T +-A78B; C; A78C; # LATIN CAPITAL LETTER SALTILLO +-A78D; C; 0265; # LATIN CAPITAL LETTER TURNED H +-A790; C; A791; # LATIN CAPITAL LETTER N WITH DESCENDER +-A792; C; A793; # LATIN CAPITAL LETTER C WITH BAR +-A796; C; A797; # LATIN CAPITAL LETTER B WITH FLOURISH +-A798; C; A799; # LATIN CAPITAL LETTER F WITH STROKE +-A79A; C; A79B; # LATIN CAPITAL LETTER VOLAPUK AE +-A79C; C; A79D; # LATIN CAPITAL LETTER VOLAPUK OE +-A79E; C; A79F; # LATIN CAPITAL LETTER VOLAPUK UE +-A7A0; C; A7A1; # LATIN CAPITAL LETTER G WITH OBLIQUE STROKE +-A7A2; C; A7A3; # LATIN CAPITAL LETTER K WITH OBLIQUE STROKE +-A7A4; C; A7A5; # LATIN CAPITAL LETTER N WITH OBLIQUE STROKE +-A7A6; C; A7A7; # LATIN CAPITAL LETTER R WITH OBLIQUE STROKE +-A7A8; C; A7A9; # LATIN CAPITAL LETTER S WITH OBLIQUE STROKE +-A7AA; C; 0266; # LATIN CAPITAL LETTER H WITH HOOK +-A7AB; C; 025C; # LATIN CAPITAL LETTER REVERSED OPEN E +-A7AC; C; 0261; # LATIN CAPITAL LETTER SCRIPT G +-A7AD; C; 026C; # LATIN CAPITAL LETTER L WITH BELT +-A7AE; C; 026A; # LATIN CAPITAL LETTER SMALL CAPITAL I +-A7B0; C; 029E; # LATIN CAPITAL LETTER TURNED K +-A7B1; C; 0287; # LATIN CAPITAL LETTER TURNED T +-A7B2; C; 029D; # LATIN CAPITAL LETTER J WITH CROSSED-TAIL +-A7B3; C; AB53; # LATIN CAPITAL LETTER CHI +-A7B4; C; A7B5; # LATIN CAPITAL LETTER BETA +-A7B6; C; A7B7; # LATIN CAPITAL LETTER OMEGA +-A7B8; C; A7B9; # LATIN CAPITAL LETTER U WITH STROKE +-A7BA; C; A7BB; # LATIN CAPITAL LETTER GLOTTAL A +-A7BC; C; A7BD; # LATIN CAPITAL LETTER GLOTTAL I +-A7BE; C; A7BF; # LATIN CAPITAL LETTER GLOTTAL U +-A7C2; C; A7C3; # LATIN CAPITAL LETTER ANGLICANA W +-A7C4; C; A794; # LATIN CAPITAL LETTER C WITH PALATAL HOOK +-A7C5; C; 0282; # LATIN CAPITAL LETTER S WITH HOOK +-A7C6; C; 1D8E; # LATIN CAPITAL LETTER Z WITH PALATAL HOOK +-A7C7; C; A7C8; # LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY +-A7C9; C; A7CA; # LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY +-A7F5; C; A7F6; # LATIN CAPITAL LETTER REVERSED HALF H +-AB70; C; 13A0; # CHEROKEE SMALL LETTER A +-AB71; C; 13A1; # CHEROKEE SMALL LETTER E +-AB72; C; 13A2; # CHEROKEE SMALL LETTER I +-AB73; C; 13A3; # CHEROKEE SMALL LETTER O +-AB74; C; 13A4; # CHEROKEE SMALL LETTER U +-AB75; C; 13A5; # CHEROKEE SMALL LETTER V +-AB76; C; 13A6; # CHEROKEE SMALL LETTER GA +-AB77; C; 13A7; # CHEROKEE SMALL LETTER KA +-AB78; C; 13A8; # CHEROKEE SMALL LETTER GE +-AB79; C; 13A9; # CHEROKEE SMALL LETTER GI +-AB7A; C; 13AA; # CHEROKEE SMALL LETTER GO +-AB7B; C; 13AB; # CHEROKEE SMALL LETTER GU +-AB7C; C; 13AC; # CHEROKEE SMALL LETTER GV +-AB7D; C; 13AD; # CHEROKEE SMALL LETTER HA +-AB7E; C; 13AE; # CHEROKEE SMALL LETTER HE +-AB7F; C; 13AF; # CHEROKEE SMALL LETTER HI +-AB80; C; 13B0; # CHEROKEE SMALL LETTER HO +-AB81; C; 13B1; # CHEROKEE SMALL LETTER HU +-AB82; C; 13B2; # CHEROKEE SMALL LETTER HV +-AB83; C; 13B3; # CHEROKEE SMALL LETTER LA +-AB84; C; 13B4; # CHEROKEE SMALL LETTER LE +-AB85; C; 13B5; # CHEROKEE SMALL LETTER LI +-AB86; C; 13B6; # CHEROKEE SMALL LETTER LO +-AB87; C; 13B7; # CHEROKEE SMALL LETTER LU +-AB88; C; 13B8; # CHEROKEE SMALL LETTER LV +-AB89; C; 13B9; # CHEROKEE SMALL LETTER MA +-AB8A; C; 13BA; # CHEROKEE SMALL LETTER ME +-AB8B; C; 13BB; # CHEROKEE SMALL LETTER MI +-AB8C; C; 13BC; # CHEROKEE SMALL LETTER MO +-AB8D; C; 13BD; # CHEROKEE SMALL LETTER MU +-AB8E; C; 13BE; # CHEROKEE SMALL LETTER NA +-AB8F; C; 13BF; # CHEROKEE SMALL LETTER HNA +-AB90; C; 13C0; # CHEROKEE SMALL LETTER NAH +-AB91; C; 13C1; # CHEROKEE SMALL LETTER NE +-AB92; C; 13C2; # CHEROKEE SMALL LETTER NI +-AB93; C; 13C3; # CHEROKEE SMALL LETTER NO +-AB94; C; 13C4; # CHEROKEE SMALL LETTER NU +-AB95; C; 13C5; # CHEROKEE SMALL LETTER NV +-AB96; C; 13C6; # CHEROKEE SMALL LETTER QUA +-AB97; C; 13C7; # CHEROKEE SMALL LETTER QUE +-AB98; C; 13C8; # CHEROKEE SMALL LETTER QUI +-AB99; C; 13C9; # CHEROKEE SMALL LETTER QUO +-AB9A; C; 13CA; # CHEROKEE SMALL LETTER QUU +-AB9B; C; 13CB; # CHEROKEE SMALL LETTER QUV +-AB9C; C; 13CC; # CHEROKEE SMALL LETTER SA +-AB9D; C; 13CD; # CHEROKEE SMALL LETTER S +-AB9E; C; 13CE; # CHEROKEE SMALL LETTER SE +-AB9F; C; 13CF; # CHEROKEE SMALL LETTER SI +-ABA0; C; 13D0; # CHEROKEE SMALL LETTER SO +-ABA1; C; 13D1; # CHEROKEE SMALL LETTER SU +-ABA2; C; 13D2; # CHEROKEE SMALL LETTER SV +-ABA3; C; 13D3; # CHEROKEE SMALL LETTER DA +-ABA4; C; 13D4; # CHEROKEE SMALL LETTER TA +-ABA5; C; 13D5; # CHEROKEE SMALL LETTER DE +-ABA6; C; 13D6; # CHEROKEE SMALL LETTER TE +-ABA7; C; 13D7; # CHEROKEE SMALL LETTER DI +-ABA8; C; 13D8; # CHEROKEE SMALL LETTER TI +-ABA9; C; 13D9; # CHEROKEE SMALL LETTER DO +-ABAA; C; 13DA; # CHEROKEE SMALL LETTER DU +-ABAB; C; 13DB; # CHEROKEE SMALL LETTER DV +-ABAC; C; 13DC; # CHEROKEE SMALL LETTER DLA +-ABAD; C; 13DD; # CHEROKEE SMALL LETTER TLA +-ABAE; C; 13DE; # CHEROKEE SMALL LETTER TLE +-ABAF; C; 13DF; # CHEROKEE SMALL LETTER TLI +-ABB0; C; 13E0; # CHEROKEE SMALL LETTER TLO +-ABB1; C; 13E1; # CHEROKEE SMALL LETTER TLU +-ABB2; C; 13E2; # CHEROKEE SMALL LETTER TLV +-ABB3; C; 13E3; # CHEROKEE SMALL LETTER TSA +-ABB4; C; 13E4; # CHEROKEE SMALL LETTER TSE +-ABB5; C; 13E5; # CHEROKEE SMALL LETTER TSI +-ABB6; C; 13E6; # CHEROKEE SMALL LETTER TSO +-ABB7; C; 13E7; # CHEROKEE SMALL LETTER TSU +-ABB8; C; 13E8; # CHEROKEE SMALL LETTER TSV +-ABB9; C; 13E9; # CHEROKEE SMALL LETTER WA +-ABBA; C; 13EA; # CHEROKEE SMALL LETTER WE +-ABBB; C; 13EB; # CHEROKEE SMALL LETTER WI +-ABBC; C; 13EC; # CHEROKEE SMALL LETTER WO +-ABBD; C; 13ED; # CHEROKEE SMALL LETTER WU +-ABBE; C; 13EE; # CHEROKEE SMALL LETTER WV +-ABBF; C; 13EF; # CHEROKEE SMALL LETTER YA +-FB00; F; 0066 0066; # LATIN SMALL LIGATURE FF +-FB01; F; 0066 0069; # LATIN SMALL LIGATURE FI +-FB02; F; 0066 006C; # LATIN SMALL LIGATURE FL +-FB03; F; 0066 0066 0069; # LATIN SMALL LIGATURE FFI +-FB04; F; 0066 0066 006C; # LATIN SMALL LIGATURE FFL +-FB05; F; 0073 0074; # LATIN SMALL LIGATURE LONG S T +-FB06; F; 0073 0074; # LATIN SMALL LIGATURE ST +-FB13; F; 0574 0576; # ARMENIAN SMALL LIGATURE MEN NOW +-FB14; F; 0574 0565; # ARMENIAN SMALL LIGATURE MEN ECH +-FB15; F; 0574 056B; # ARMENIAN SMALL LIGATURE MEN INI +-FB16; F; 057E 0576; # ARMENIAN SMALL LIGATURE VEW NOW +-FB17; F; 0574 056D; # ARMENIAN SMALL LIGATURE MEN XEH +-FF21; C; FF41; # FULLWIDTH LATIN CAPITAL LETTER A +-FF22; C; FF42; # FULLWIDTH LATIN CAPITAL LETTER B +-FF23; C; FF43; # FULLWIDTH LATIN CAPITAL LETTER C +-FF24; C; FF44; # FULLWIDTH LATIN CAPITAL LETTER D +-FF25; C; FF45; # FULLWIDTH LATIN CAPITAL LETTER E +-FF26; C; FF46; # FULLWIDTH LATIN CAPITAL LETTER F +-FF27; C; FF47; # FULLWIDTH LATIN CAPITAL LETTER G +-FF28; C; FF48; # FULLWIDTH LATIN CAPITAL LETTER H +-FF29; C; FF49; # FULLWIDTH LATIN CAPITAL LETTER I +-FF2A; C; FF4A; # FULLWIDTH LATIN CAPITAL LETTER J +-FF2B; C; FF4B; # FULLWIDTH LATIN CAPITAL LETTER K +-FF2C; C; FF4C; # FULLWIDTH LATIN CAPITAL LETTER L +-FF2D; C; FF4D; # FULLWIDTH LATIN CAPITAL LETTER M +-FF2E; C; FF4E; # FULLWIDTH LATIN CAPITAL LETTER N +-FF2F; C; FF4F; # FULLWIDTH LATIN CAPITAL LETTER O +-FF30; C; FF50; # FULLWIDTH LATIN CAPITAL LETTER P +-FF31; C; FF51; # FULLWIDTH LATIN CAPITAL LETTER Q +-FF32; C; FF52; # FULLWIDTH LATIN CAPITAL LETTER R +-FF33; C; FF53; # FULLWIDTH LATIN CAPITAL LETTER S +-FF34; C; FF54; # FULLWIDTH LATIN CAPITAL LETTER T +-FF35; C; FF55; # FULLWIDTH LATIN CAPITAL LETTER U +-FF36; C; FF56; # FULLWIDTH LATIN CAPITAL LETTER V +-FF37; C; FF57; # FULLWIDTH LATIN CAPITAL LETTER W +-FF38; C; FF58; # FULLWIDTH LATIN CAPITAL LETTER X +-FF39; C; FF59; # FULLWIDTH LATIN CAPITAL LETTER Y +-FF3A; C; FF5A; # FULLWIDTH LATIN CAPITAL LETTER Z +-10400; C; 10428; # DESERET CAPITAL LETTER LONG I +-10401; C; 10429; # DESERET CAPITAL LETTER LONG E +-10402; C; 1042A; # DESERET CAPITAL LETTER LONG A +-10403; C; 1042B; # DESERET CAPITAL LETTER LONG AH +-10404; C; 1042C; # DESERET CAPITAL LETTER LONG O +-10405; C; 1042D; # DESERET CAPITAL LETTER LONG OO +-10406; C; 1042E; # DESERET CAPITAL LETTER SHORT I +-10407; C; 1042F; # DESERET CAPITAL LETTER SHORT E +-10408; C; 10430; # DESERET CAPITAL LETTER SHORT A +-10409; C; 10431; # DESERET CAPITAL LETTER SHORT AH +-1040A; C; 10432; # DESERET CAPITAL LETTER SHORT O +-1040B; C; 10433; # DESERET CAPITAL LETTER SHORT OO +-1040C; C; 10434; # DESERET CAPITAL LETTER AY +-1040D; C; 10435; # DESERET CAPITAL LETTER OW +-1040E; C; 10436; # DESERET CAPITAL LETTER WU +-1040F; C; 10437; # DESERET CAPITAL LETTER YEE +-10410; C; 10438; # DESERET CAPITAL LETTER H +-10411; C; 10439; # DESERET CAPITAL LETTER PEE +-10412; C; 1043A; # DESERET CAPITAL LETTER BEE +-10413; C; 1043B; # DESERET CAPITAL LETTER TEE +-10414; C; 1043C; # DESERET CAPITAL LETTER DEE +-10415; C; 1043D; # DESERET CAPITAL LETTER CHEE +-10416; C; 1043E; # DESERET CAPITAL LETTER JEE +-10417; C; 1043F; # DESERET CAPITAL LETTER KAY +-10418; C; 10440; # DESERET CAPITAL LETTER GAY +-10419; C; 10441; # DESERET CAPITAL LETTER EF +-1041A; C; 10442; # DESERET CAPITAL LETTER VEE +-1041B; C; 10443; # DESERET CAPITAL LETTER ETH +-1041C; C; 10444; # DESERET CAPITAL LETTER THEE +-1041D; C; 10445; # DESERET CAPITAL LETTER ES +-1041E; C; 10446; # DESERET CAPITAL LETTER ZEE +-1041F; C; 10447; # DESERET CAPITAL LETTER ESH +-10420; C; 10448; # DESERET CAPITAL LETTER ZHEE +-10421; C; 10449; # DESERET CAPITAL LETTER ER +-10422; C; 1044A; # DESERET CAPITAL LETTER EL +-10423; C; 1044B; # DESERET CAPITAL LETTER EM +-10424; C; 1044C; # DESERET CAPITAL LETTER EN +-10425; C; 1044D; # DESERET CAPITAL LETTER ENG +-10426; C; 1044E; # DESERET CAPITAL LETTER OI +-10427; C; 1044F; # DESERET CAPITAL LETTER EW +-104B0; C; 104D8; # OSAGE CAPITAL LETTER A +-104B1; C; 104D9; # OSAGE CAPITAL LETTER AI +-104B2; C; 104DA; # OSAGE CAPITAL LETTER AIN +-104B3; C; 104DB; # OSAGE CAPITAL LETTER AH +-104B4; C; 104DC; # OSAGE CAPITAL LETTER BRA +-104B5; C; 104DD; # OSAGE CAPITAL LETTER CHA +-104B6; C; 104DE; # OSAGE CAPITAL LETTER EHCHA +-104B7; C; 104DF; # OSAGE CAPITAL LETTER E +-104B8; C; 104E0; # OSAGE CAPITAL LETTER EIN +-104B9; C; 104E1; # OSAGE CAPITAL LETTER HA +-104BA; C; 104E2; # OSAGE CAPITAL LETTER HYA +-104BB; C; 104E3; # OSAGE CAPITAL LETTER I +-104BC; C; 104E4; # OSAGE CAPITAL LETTER KA +-104BD; C; 104E5; # OSAGE CAPITAL LETTER EHKA +-104BE; C; 104E6; # OSAGE CAPITAL LETTER KYA +-104BF; C; 104E7; # OSAGE CAPITAL LETTER LA +-104C0; C; 104E8; # OSAGE CAPITAL LETTER MA +-104C1; C; 104E9; # OSAGE CAPITAL LETTER NA +-104C2; C; 104EA; # OSAGE CAPITAL LETTER O +-104C3; C; 104EB; # OSAGE CAPITAL LETTER OIN +-104C4; C; 104EC; # OSAGE CAPITAL LETTER PA +-104C5; C; 104ED; # OSAGE CAPITAL LETTER EHPA +-104C6; C; 104EE; # OSAGE CAPITAL LETTER SA +-104C7; C; 104EF; # OSAGE CAPITAL LETTER SHA +-104C8; C; 104F0; # OSAGE CAPITAL LETTER TA +-104C9; C; 104F1; # OSAGE CAPITAL LETTER EHTA +-104CA; C; 104F2; # OSAGE CAPITAL LETTER TSA +-104CB; C; 104F3; # OSAGE CAPITAL LETTER EHTSA +-104CC; C; 104F4; # OSAGE CAPITAL LETTER TSHA +-104CD; C; 104F5; # OSAGE CAPITAL LETTER DHA +-104CE; C; 104F6; # OSAGE CAPITAL LETTER U +-104CF; C; 104F7; # OSAGE CAPITAL LETTER WA +-104D0; C; 104F8; # OSAGE CAPITAL LETTER KHA +-104D1; C; 104F9; # OSAGE CAPITAL LETTER GHA +-104D2; C; 104FA; # OSAGE CAPITAL LETTER ZA +-104D3; C; 104FB; # OSAGE CAPITAL LETTER ZHA +-10C80; C; 10CC0; # OLD HUNGARIAN CAPITAL LETTER A +-10C81; C; 10CC1; # OLD HUNGARIAN CAPITAL LETTER AA +-10C82; C; 10CC2; # OLD HUNGARIAN CAPITAL LETTER EB +-10C83; C; 10CC3; # OLD HUNGARIAN CAPITAL LETTER AMB +-10C84; C; 10CC4; # OLD HUNGARIAN CAPITAL LETTER EC +-10C85; C; 10CC5; # OLD HUNGARIAN CAPITAL LETTER ENC +-10C86; C; 10CC6; # OLD HUNGARIAN CAPITAL LETTER ECS +-10C87; C; 10CC7; # OLD HUNGARIAN CAPITAL LETTER ED +-10C88; C; 10CC8; # OLD HUNGARIAN CAPITAL LETTER AND +-10C89; C; 10CC9; # OLD HUNGARIAN CAPITAL LETTER E +-10C8A; C; 10CCA; # OLD HUNGARIAN CAPITAL LETTER CLOSE E +-10C8B; C; 10CCB; # OLD HUNGARIAN CAPITAL LETTER EE +-10C8C; C; 10CCC; # OLD HUNGARIAN CAPITAL LETTER EF +-10C8D; C; 10CCD; # OLD HUNGARIAN CAPITAL LETTER EG +-10C8E; C; 10CCE; # OLD HUNGARIAN CAPITAL LETTER EGY +-10C8F; C; 10CCF; # OLD HUNGARIAN CAPITAL LETTER EH +-10C90; C; 10CD0; # OLD HUNGARIAN CAPITAL LETTER I +-10C91; C; 10CD1; # OLD HUNGARIAN CAPITAL LETTER II +-10C92; C; 10CD2; # OLD HUNGARIAN CAPITAL LETTER EJ +-10C93; C; 10CD3; # OLD HUNGARIAN CAPITAL LETTER EK +-10C94; C; 10CD4; # OLD HUNGARIAN CAPITAL LETTER AK +-10C95; C; 10CD5; # OLD HUNGARIAN CAPITAL LETTER UNK +-10C96; C; 10CD6; # OLD HUNGARIAN CAPITAL LETTER EL +-10C97; C; 10CD7; # OLD HUNGARIAN CAPITAL LETTER ELY +-10C98; C; 10CD8; # OLD HUNGARIAN CAPITAL LETTER EM +-10C99; C; 10CD9; # OLD HUNGARIAN CAPITAL LETTER EN +-10C9A; C; 10CDA; # OLD HUNGARIAN CAPITAL LETTER ENY +-10C9B; C; 10CDB; # OLD HUNGARIAN CAPITAL LETTER O +-10C9C; C; 10CDC; # OLD HUNGARIAN CAPITAL LETTER OO +-10C9D; C; 10CDD; # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE +-10C9E; C; 10CDE; # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE +-10C9F; C; 10CDF; # OLD HUNGARIAN CAPITAL LETTER OEE +-10CA0; C; 10CE0; # OLD HUNGARIAN CAPITAL LETTER EP +-10CA1; C; 10CE1; # OLD HUNGARIAN CAPITAL LETTER EMP +-10CA2; C; 10CE2; # OLD HUNGARIAN CAPITAL LETTER ER +-10CA3; C; 10CE3; # OLD HUNGARIAN CAPITAL LETTER SHORT ER +-10CA4; C; 10CE4; # OLD HUNGARIAN CAPITAL LETTER ES +-10CA5; C; 10CE5; # OLD HUNGARIAN CAPITAL LETTER ESZ +-10CA6; C; 10CE6; # OLD HUNGARIAN CAPITAL LETTER ET +-10CA7; C; 10CE7; # OLD HUNGARIAN CAPITAL LETTER ENT +-10CA8; C; 10CE8; # OLD HUNGARIAN CAPITAL LETTER ETY +-10CA9; C; 10CE9; # OLD HUNGARIAN CAPITAL LETTER ECH +-10CAA; C; 10CEA; # OLD HUNGARIAN CAPITAL LETTER U +-10CAB; C; 10CEB; # OLD HUNGARIAN CAPITAL LETTER UU +-10CAC; C; 10CEC; # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE +-10CAD; C; 10CED; # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE +-10CAE; C; 10CEE; # OLD HUNGARIAN CAPITAL LETTER EV +-10CAF; C; 10CEF; # OLD HUNGARIAN CAPITAL LETTER EZ +-10CB0; C; 10CF0; # OLD HUNGARIAN CAPITAL LETTER EZS +-10CB1; C; 10CF1; # OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN +-10CB2; C; 10CF2; # OLD HUNGARIAN CAPITAL LETTER US +-118A0; C; 118C0; # WARANG CITI CAPITAL LETTER NGAA +-118A1; C; 118C1; # WARANG CITI CAPITAL LETTER A +-118A2; C; 118C2; # WARANG CITI CAPITAL LETTER WI +-118A3; C; 118C3; # WARANG CITI CAPITAL LETTER YU +-118A4; C; 118C4; # WARANG CITI CAPITAL LETTER YA +-118A5; C; 118C5; # WARANG CITI CAPITAL LETTER YO +-118A6; C; 118C6; # WARANG CITI CAPITAL LETTER II +-118A7; C; 118C7; # WARANG CITI CAPITAL LETTER UU +-118A8; C; 118C8; # WARANG CITI CAPITAL LETTER E +-118A9; C; 118C9; # WARANG CITI CAPITAL LETTER O +-118AA; C; 118CA; # WARANG CITI CAPITAL LETTER ANG +-118AB; C; 118CB; # WARANG CITI CAPITAL LETTER GA +-118AC; C; 118CC; # WARANG CITI CAPITAL LETTER KO +-118AD; C; 118CD; # WARANG CITI CAPITAL LETTER ENY +-118AE; C; 118CE; # WARANG CITI CAPITAL LETTER YUJ +-118AF; C; 118CF; # WARANG CITI CAPITAL LETTER UC +-118B0; C; 118D0; # WARANG CITI CAPITAL LETTER ENN +-118B1; C; 118D1; # WARANG CITI CAPITAL LETTER ODD +-118B2; C; 118D2; # WARANG CITI CAPITAL LETTER TTE +-118B3; C; 118D3; # WARANG CITI CAPITAL LETTER NUNG +-118B4; C; 118D4; # WARANG CITI CAPITAL LETTER DA +-118B5; C; 118D5; # WARANG CITI CAPITAL LETTER AT +-118B6; C; 118D6; # WARANG CITI CAPITAL LETTER AM +-118B7; C; 118D7; # WARANG CITI CAPITAL LETTER BU +-118B8; C; 118D8; # WARANG CITI CAPITAL LETTER PU +-118B9; C; 118D9; # WARANG CITI CAPITAL LETTER HIYO +-118BA; C; 118DA; # WARANG CITI CAPITAL LETTER HOLO +-118BB; C; 118DB; # WARANG CITI CAPITAL LETTER HORR +-118BC; C; 118DC; # WARANG CITI CAPITAL LETTER HAR +-118BD; C; 118DD; # WARANG CITI CAPITAL LETTER SSUU +-118BE; C; 118DE; # WARANG CITI CAPITAL LETTER SII +-118BF; C; 118DF; # WARANG CITI CAPITAL LETTER VIYO +-16E40; C; 16E60; # MEDEFAIDRIN CAPITAL LETTER M +-16E41; C; 16E61; # MEDEFAIDRIN CAPITAL LETTER S +-16E42; C; 16E62; # MEDEFAIDRIN CAPITAL LETTER V +-16E43; C; 16E63; # MEDEFAIDRIN CAPITAL LETTER W +-16E44; C; 16E64; # MEDEFAIDRIN CAPITAL LETTER ATIU +-16E45; C; 16E65; # MEDEFAIDRIN CAPITAL LETTER Z +-16E46; C; 16E66; # MEDEFAIDRIN CAPITAL LETTER KP +-16E47; C; 16E67; # MEDEFAIDRIN CAPITAL LETTER P +-16E48; C; 16E68; # MEDEFAIDRIN CAPITAL LETTER T +-16E49; C; 16E69; # MEDEFAIDRIN CAPITAL LETTER G +-16E4A; C; 16E6A; # MEDEFAIDRIN CAPITAL LETTER F +-16E4B; C; 16E6B; # MEDEFAIDRIN CAPITAL LETTER I +-16E4C; C; 16E6C; # MEDEFAIDRIN CAPITAL LETTER K +-16E4D; C; 16E6D; # MEDEFAIDRIN CAPITAL LETTER A +-16E4E; C; 16E6E; # MEDEFAIDRIN CAPITAL LETTER J +-16E4F; C; 16E6F; # MEDEFAIDRIN CAPITAL LETTER E +-16E50; C; 16E70; # MEDEFAIDRIN CAPITAL LETTER B +-16E51; C; 16E71; # MEDEFAIDRIN CAPITAL LETTER C +-16E52; C; 16E72; # MEDEFAIDRIN CAPITAL LETTER U +-16E53; C; 16E73; # MEDEFAIDRIN CAPITAL LETTER YU +-16E54; C; 16E74; # MEDEFAIDRIN CAPITAL LETTER L +-16E55; C; 16E75; # MEDEFAIDRIN CAPITAL LETTER Q +-16E56; C; 16E76; # MEDEFAIDRIN CAPITAL LETTER HP +-16E57; C; 16E77; # MEDEFAIDRIN CAPITAL LETTER NY +-16E58; C; 16E78; # MEDEFAIDRIN CAPITAL LETTER X +-16E59; C; 16E79; # MEDEFAIDRIN CAPITAL LETTER D +-16E5A; C; 16E7A; # MEDEFAIDRIN CAPITAL LETTER OE +-16E5B; C; 16E7B; # MEDEFAIDRIN CAPITAL LETTER N +-16E5C; C; 16E7C; # MEDEFAIDRIN CAPITAL LETTER R +-16E5D; C; 16E7D; # MEDEFAIDRIN CAPITAL LETTER O +-16E5E; C; 16E7E; # MEDEFAIDRIN CAPITAL LETTER AI +-16E5F; C; 16E7F; # MEDEFAIDRIN CAPITAL LETTER Y +-1E900; C; 1E922; # ADLAM CAPITAL LETTER ALIF +-1E901; C; 1E923; # ADLAM CAPITAL LETTER DAALI +-1E902; C; 1E924; # ADLAM CAPITAL LETTER LAAM +-1E903; C; 1E925; # ADLAM CAPITAL LETTER MIIM +-1E904; C; 1E926; # ADLAM CAPITAL LETTER BA +-1E905; C; 1E927; # ADLAM CAPITAL LETTER SINNYIIYHE +-1E906; C; 1E928; # ADLAM CAPITAL LETTER PE +-1E907; C; 1E929; # ADLAM CAPITAL LETTER BHE +-1E908; C; 1E92A; # ADLAM CAPITAL LETTER RA +-1E909; C; 1E92B; # ADLAM CAPITAL LETTER E +-1E90A; C; 1E92C; # ADLAM CAPITAL LETTER FA +-1E90B; C; 1E92D; # ADLAM CAPITAL LETTER I +-1E90C; C; 1E92E; # ADLAM CAPITAL LETTER O +-1E90D; C; 1E92F; # ADLAM CAPITAL LETTER DHA +-1E90E; C; 1E930; # ADLAM CAPITAL LETTER YHE +-1E90F; C; 1E931; # ADLAM CAPITAL LETTER WAW +-1E910; C; 1E932; # ADLAM CAPITAL LETTER NUN +-1E911; C; 1E933; # ADLAM CAPITAL LETTER KAF +-1E912; C; 1E934; # ADLAM CAPITAL LETTER YA +-1E913; C; 1E935; # ADLAM CAPITAL LETTER U +-1E914; C; 1E936; # ADLAM CAPITAL LETTER JIIM +-1E915; C; 1E937; # ADLAM CAPITAL LETTER CHI +-1E916; C; 1E938; # ADLAM CAPITAL LETTER HA +-1E917; C; 1E939; # ADLAM CAPITAL LETTER QAAF +-1E918; C; 1E93A; # ADLAM CAPITAL LETTER GA +-1E919; C; 1E93B; # ADLAM CAPITAL LETTER NYA +-1E91A; C; 1E93C; # ADLAM CAPITAL LETTER TU +-1E91B; C; 1E93D; # ADLAM CAPITAL LETTER NHA +-1E91C; C; 1E93E; # ADLAM CAPITAL LETTER VA +-1E91D; C; 1E93F; # ADLAM CAPITAL LETTER KHA +-1E91E; C; 1E940; # ADLAM CAPITAL LETTER GBE +-1E91F; C; 1E941; # ADLAM CAPITAL LETTER ZAL +-1E920; C; 1E942; # ADLAM CAPITAL LETTER KPO +-1E921; C; 1E943; # ADLAM CAPITAL LETTER SHA +-# +-# EOF +diff --git a/tests/DerivedGeneralCategory.txt b/tests/DerivedGeneralCategory.txt +deleted file mode 100644 +index 3e82c7fc..00000000 +--- a/tests/DerivedGeneralCategory.txt ++++ /dev/null +@@ -1,4100 +0,0 @@ +-# DerivedGeneralCategory-13.0.0.txt +-# Date: 2019-10-21, 14:30:32 GMT +-# © 2019 Unicode®, Inc. +-# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +-# For terms of use, see http://www.unicode.org/terms_of_use.html +-# +-# Unicode Character Database +-# For documentation, see http://www.unicode.org/reports/tr44/ +- +-# ================================================ +- +-# Property: General_Category +- +-# ================================================ +- +-# General_Category=Unassigned +- +-0378..0379 ; Cn # [2] .. +-0380..0383 ; Cn # [4] .. +-038B ; Cn # +-038D ; Cn # +-03A2 ; Cn # +-0530 ; Cn # +-0557..0558 ; Cn # [2] .. +-058B..058C ; Cn # [2] .. +-0590 ; Cn # +-05C8..05CF ; Cn # [8] .. +-05EB..05EE ; Cn # [4] .. +-05F5..05FF ; Cn # [11] .. +-061D ; Cn # +-070E ; Cn # +-074B..074C ; Cn # [2] .. +-07B2..07BF ; Cn # [14] .. +-07FB..07FC ; Cn # [2] .. +-082E..082F ; Cn # [2] .. +-083F ; Cn # +-085C..085D ; Cn # [2] .. +-085F ; Cn # +-086B..089F ; Cn # [53] .. +-08B5 ; Cn # +-08C8..08D2 ; Cn # [11] .. +-0984 ; Cn # +-098D..098E ; Cn # [2] .. +-0991..0992 ; Cn # [2] .. +-09A9 ; Cn # +-09B1 ; Cn # +-09B3..09B5 ; Cn # [3] .. +-09BA..09BB ; Cn # [2] .. +-09C5..09C6 ; Cn # [2] .. +-09C9..09CA ; Cn # [2] .. +-09CF..09D6 ; Cn # [8] .. +-09D8..09DB ; Cn # [4] .. +-09DE ; Cn # +-09E4..09E5 ; Cn # [2] .. +-09FF..0A00 ; Cn # [2] .. +-0A04 ; Cn # +-0A0B..0A0E ; Cn # [4] .. +-0A11..0A12 ; Cn # [2] .. +-0A29 ; Cn # +-0A31 ; Cn # +-0A34 ; Cn # +-0A37 ; Cn # +-0A3A..0A3B ; Cn # [2] .. +-0A3D ; Cn # +-0A43..0A46 ; Cn # [4] .. +-0A49..0A4A ; Cn # [2] .. +-0A4E..0A50 ; Cn # [3] .. +-0A52..0A58 ; Cn # [7] .. +-0A5D ; Cn # +-0A5F..0A65 ; Cn # [7] .. +-0A77..0A80 ; Cn # [10] .. +-0A84 ; Cn # +-0A8E ; Cn # +-0A92 ; Cn # +-0AA9 ; Cn # +-0AB1 ; Cn # +-0AB4 ; Cn # +-0ABA..0ABB ; Cn # [2] .. +-0AC6 ; Cn # +-0ACA ; Cn # +-0ACE..0ACF ; Cn # [2] .. +-0AD1..0ADF ; Cn # [15] .. +-0AE4..0AE5 ; Cn # [2] .. +-0AF2..0AF8 ; Cn # [7] .. +-0B00 ; Cn # +-0B04 ; Cn # +-0B0D..0B0E ; Cn # [2] .. +-0B11..0B12 ; Cn # [2] .. +-0B29 ; Cn # +-0B31 ; Cn # +-0B34 ; Cn # +-0B3A..0B3B ; Cn # [2] .. +-0B45..0B46 ; Cn # [2] .. +-0B49..0B4A ; Cn # [2] .. +-0B4E..0B54 ; Cn # [7] .. +-0B58..0B5B ; Cn # [4] .. +-0B5E ; Cn # +-0B64..0B65 ; Cn # [2] .. +-0B78..0B81 ; Cn # [10] .. +-0B84 ; Cn # +-0B8B..0B8D ; Cn # [3] .. +-0B91 ; Cn # +-0B96..0B98 ; Cn # [3] .. +-0B9B ; Cn # +-0B9D ; Cn # +-0BA0..0BA2 ; Cn # [3] .. +-0BA5..0BA7 ; Cn # [3] .. +-0BAB..0BAD ; Cn # [3] .. +-0BBA..0BBD ; Cn # [4] .. +-0BC3..0BC5 ; Cn # [3] .. +-0BC9 ; Cn # +-0BCE..0BCF ; Cn # [2] .. +-0BD1..0BD6 ; Cn # [6] .. +-0BD8..0BE5 ; Cn # [14] .. +-0BFB..0BFF ; Cn # [5] .. +-0C0D ; Cn # +-0C11 ; Cn # +-0C29 ; Cn # +-0C3A..0C3C ; Cn # [3] .. +-0C45 ; Cn # +-0C49 ; Cn # +-0C4E..0C54 ; Cn # [7] .. +-0C57 ; Cn # +-0C5B..0C5F ; Cn # [5] .. +-0C64..0C65 ; Cn # [2] .. +-0C70..0C76 ; Cn # [7] .. +-0C8D ; Cn # +-0C91 ; Cn # +-0CA9 ; Cn # +-0CB4 ; Cn # +-0CBA..0CBB ; Cn # [2] .. +-0CC5 ; Cn # +-0CC9 ; Cn # +-0CCE..0CD4 ; Cn # [7] .. +-0CD7..0CDD ; Cn # [7] .. +-0CDF ; Cn # +-0CE4..0CE5 ; Cn # [2] .. +-0CF0 ; Cn # +-0CF3..0CFF ; Cn # [13] .. +-0D0D ; Cn # +-0D11 ; Cn # +-0D45 ; Cn # +-0D49 ; Cn # +-0D50..0D53 ; Cn # [4] .. +-0D64..0D65 ; Cn # [2] .. +-0D80 ; Cn # +-0D84 ; Cn # +-0D97..0D99 ; Cn # [3] .. +-0DB2 ; Cn # +-0DBC ; Cn # +-0DBE..0DBF ; Cn # [2] .. +-0DC7..0DC9 ; Cn # [3] .. +-0DCB..0DCE ; Cn # [4] .. +-0DD5 ; Cn # +-0DD7 ; Cn # +-0DE0..0DE5 ; Cn # [6] .. +-0DF0..0DF1 ; Cn # [2] .. +-0DF5..0E00 ; Cn # [12] .. +-0E3B..0E3E ; Cn # [4] .. +-0E5C..0E80 ; Cn # [37] .. +-0E83 ; Cn # +-0E85 ; Cn # +-0E8B ; Cn # +-0EA4 ; Cn # +-0EA6 ; Cn # +-0EBE..0EBF ; Cn # [2] .. +-0EC5 ; Cn # +-0EC7 ; Cn # +-0ECE..0ECF ; Cn # [2] .. +-0EDA..0EDB ; Cn # [2] .. +-0EE0..0EFF ; Cn # [32] .. +-0F48 ; Cn # +-0F6D..0F70 ; Cn # [4] .. +-0F98 ; Cn # +-0FBD ; Cn # +-0FCD ; Cn # +-0FDB..0FFF ; Cn # [37] .. +-10C6 ; Cn # +-10C8..10CC ; Cn # [5] .. +-10CE..10CF ; Cn # [2] .. +-1249 ; Cn # +-124E..124F ; Cn # [2] .. +-1257 ; Cn # +-1259 ; Cn # +-125E..125F ; Cn # [2] .. +-1289 ; Cn # +-128E..128F ; Cn # [2] .. +-12B1 ; Cn # +-12B6..12B7 ; Cn # [2] .. +-12BF ; Cn # +-12C1 ; Cn # +-12C6..12C7 ; Cn # [2] .. +-12D7 ; Cn # +-1311 ; Cn # +-1316..1317 ; Cn # [2] .. +-135B..135C ; Cn # [2] .. +-137D..137F ; Cn # [3] .. +-139A..139F ; Cn # [6] .. +-13F6..13F7 ; Cn # [2] .. +-13FE..13FF ; Cn # [2] .. +-169D..169F ; Cn # [3] .. +-16F9..16FF ; Cn # [7] .. +-170D ; Cn # +-1715..171F ; Cn # [11] .. +-1737..173F ; Cn # [9] .. +-1754..175F ; Cn # [12] .. +-176D ; Cn # +-1771 ; Cn # +-1774..177F ; Cn # [12] .. +-17DE..17DF ; Cn # [2] .. +-17EA..17EF ; Cn # [6] .. +-17FA..17FF ; Cn # [6] .. +-180F ; Cn # +-181A..181F ; Cn # [6] .. +-1879..187F ; Cn # [7] .. +-18AB..18AF ; Cn # [5] .. +-18F6..18FF ; Cn # [10] .. +-191F ; Cn # +-192C..192F ; Cn # [4] .. +-193C..193F ; Cn # [4] .. +-1941..1943 ; Cn # [3] .. +-196E..196F ; Cn # [2] .. +-1975..197F ; Cn # [11] .. +-19AC..19AF ; Cn # [4] .. +-19CA..19CF ; Cn # [6] .. +-19DB..19DD ; Cn # [3] .. +-1A1C..1A1D ; Cn # [2] .. +-1A5F ; Cn # +-1A7D..1A7E ; Cn # [2] .. +-1A8A..1A8F ; Cn # [6] .. +-1A9A..1A9F ; Cn # [6] .. +-1AAE..1AAF ; Cn # [2] .. +-1AC1..1AFF ; Cn # [63] .. +-1B4C..1B4F ; Cn # [4] .. +-1B7D..1B7F ; Cn # [3] .. +-1BF4..1BFB ; Cn # [8] .. +-1C38..1C3A ; Cn # [3] .. +-1C4A..1C4C ; Cn # [3] .. +-1C89..1C8F ; Cn # [7] .. +-1CBB..1CBC ; Cn # [2] .. +-1CC8..1CCF ; Cn # [8] .. +-1CFB..1CFF ; Cn # [5] .. +-1DFA ; Cn # +-1F16..1F17 ; Cn # [2] .. +-1F1E..1F1F ; Cn # [2] .. +-1F46..1F47 ; Cn # [2] .. +-1F4E..1F4F ; Cn # [2] .. +-1F58 ; Cn # +-1F5A ; Cn # +-1F5C ; Cn # +-1F5E ; Cn # +-1F7E..1F7F ; Cn # [2] .. +-1FB5 ; Cn # +-1FC5 ; Cn # +-1FD4..1FD5 ; Cn # [2] .. +-1FDC ; Cn # +-1FF0..1FF1 ; Cn # [2] .. +-1FF5 ; Cn # +-1FFF ; Cn # +-2065 ; Cn # +-2072..2073 ; Cn # [2] .. +-208F ; Cn # +-209D..209F ; Cn # [3] .. +-20C0..20CF ; Cn # [16] .. +-20F1..20FF ; Cn # [15] .. +-218C..218F ; Cn # [4] .. +-2427..243F ; Cn # [25] .. +-244B..245F ; Cn # [21] .. +-2B74..2B75 ; Cn # [2] .. +-2B96 ; Cn # +-2C2F ; Cn # +-2C5F ; Cn # +-2CF4..2CF8 ; Cn # [5] .. +-2D26 ; Cn # +-2D28..2D2C ; Cn # [5] .. +-2D2E..2D2F ; Cn # [2] .. +-2D68..2D6E ; Cn # [7] .. +-2D71..2D7E ; Cn # [14] .. +-2D97..2D9F ; Cn # [9] .. +-2DA7 ; Cn # +-2DAF ; Cn # +-2DB7 ; Cn # +-2DBF ; Cn # +-2DC7 ; Cn # +-2DCF ; Cn # +-2DD7 ; Cn # +-2DDF ; Cn # +-2E53..2E7F ; Cn # [45] .. +-2E9A ; Cn # +-2EF4..2EFF ; Cn # [12] .. +-2FD6..2FEF ; Cn # [26] .. +-2FFC..2FFF ; Cn # [4] .. +-3040 ; Cn # +-3097..3098 ; Cn # [2] .. +-3100..3104 ; Cn # [5] .. +-3130 ; Cn # +-318F ; Cn # +-31E4..31EF ; Cn # [12] .. +-321F ; Cn # +-9FFD..9FFF ; Cn # [3] .. +-A48D..A48F ; Cn # [3] .. +-A4C7..A4CF ; Cn # [9] .. +-A62C..A63F ; Cn # [20] .. +-A6F8..A6FF ; Cn # [8] .. +-A7C0..A7C1 ; Cn # [2] .. +-A7CB..A7F4 ; Cn # [42] .. +-A82D..A82F ; Cn # [3] .. +-A83A..A83F ; Cn # [6] .. +-A878..A87F ; Cn # [8] .. +-A8C6..A8CD ; Cn # [8] .. +-A8DA..A8DF ; Cn # [6] .. +-A954..A95E ; Cn # [11] .. +-A97D..A97F ; Cn # [3] .. +-A9CE ; Cn # +-A9DA..A9DD ; Cn # [4] .. +-A9FF ; Cn # +-AA37..AA3F ; Cn # [9] .. +-AA4E..AA4F ; Cn # [2] .. +-AA5A..AA5B ; Cn # [2] .. +-AAC3..AADA ; Cn # [24] .. +-AAF7..AB00 ; Cn # [10] .. +-AB07..AB08 ; Cn # [2] .. +-AB0F..AB10 ; Cn # [2] .. +-AB17..AB1F ; Cn # [9] .. +-AB27 ; Cn # +-AB2F ; Cn # +-AB6C..AB6F ; Cn # [4] .. +-ABEE..ABEF ; Cn # [2] .. +-ABFA..ABFF ; Cn # [6] .. +-D7A4..D7AF ; Cn # [12] .. +-D7C7..D7CA ; Cn # [4] .. +-D7FC..D7FF ; Cn # [4] .. +-FA6E..FA6F ; Cn # [2] .. +-FADA..FAFF ; Cn # [38] .. +-FB07..FB12 ; Cn # [12] .. +-FB18..FB1C ; Cn # [5] .. +-FB37 ; Cn # +-FB3D ; Cn # +-FB3F ; Cn # +-FB42 ; Cn # +-FB45 ; Cn # +-FBC2..FBD2 ; Cn # [17] .. +-FD40..FD4F ; Cn # [16] .. +-FD90..FD91 ; Cn # [2] .. +-FDC8..FDEF ; Cn # [40] .. +-FDFE..FDFF ; Cn # [2] .. +-FE1A..FE1F ; Cn # [6] .. +-FE53 ; Cn # +-FE67 ; Cn # +-FE6C..FE6F ; Cn # [4] .. +-FE75 ; Cn # +-FEFD..FEFE ; Cn # [2] .. +-FF00 ; Cn # +-FFBF..FFC1 ; Cn # [3] .. +-FFC8..FFC9 ; Cn # [2] .. +-FFD0..FFD1 ; Cn # [2] .. +-FFD8..FFD9 ; Cn # [2] .. +-FFDD..FFDF ; Cn # [3] .. +-FFE7 ; Cn # +-FFEF..FFF8 ; Cn # [10] .. +-FFFE..FFFF ; Cn # [2] .. +-1000C ; Cn # +-10027 ; Cn # +-1003B ; Cn # +-1003E ; Cn # +-1004E..1004F ; Cn # [2] .. +-1005E..1007F ; Cn # [34] .. +-100FB..100FF ; Cn # [5] .. +-10103..10106 ; Cn # [4] .. +-10134..10136 ; Cn # [3] .. +-1018F ; Cn # +-1019D..1019F ; Cn # [3] .. +-101A1..101CF ; Cn # [47] .. +-101FE..1027F ; Cn # [130] .. +-1029D..1029F ; Cn # [3] .. +-102D1..102DF ; Cn # [15] .. +-102FC..102FF ; Cn # [4] .. +-10324..1032C ; Cn # [9] .. +-1034B..1034F ; Cn # [5] .. +-1037B..1037F ; Cn # [5] .. +-1039E ; Cn # +-103C4..103C7 ; Cn # [4] .. +-103D6..103FF ; Cn # [42] .. +-1049E..1049F ; Cn # [2] .. +-104AA..104AF ; Cn # [6] .. +-104D4..104D7 ; Cn # [4] .. +-104FC..104FF ; Cn # [4] .. +-10528..1052F ; Cn # [8] .. +-10564..1056E ; Cn # [11] .. +-10570..105FF ; Cn # [144] .. +-10737..1073F ; Cn # [9] .. +-10756..1075F ; Cn # [10] .. +-10768..107FF ; Cn # [152] .. +-10806..10807 ; Cn # [2] .. +-10809 ; Cn # +-10836 ; Cn # +-10839..1083B ; Cn # [3] .. +-1083D..1083E ; Cn # [2] .. +-10856 ; Cn # +-1089F..108A6 ; Cn # [8] .. +-108B0..108DF ; Cn # [48] .. +-108F3 ; Cn # +-108F6..108FA ; Cn # [5] .. +-1091C..1091E ; Cn # [3] .. +-1093A..1093E ; Cn # [5] .. +-10940..1097F ; Cn # [64] .. +-109B8..109BB ; Cn # [4] .. +-109D0..109D1 ; Cn # [2] .. +-10A04 ; Cn # +-10A07..10A0B ; Cn # [5] .. +-10A14 ; Cn # +-10A18 ; Cn # +-10A36..10A37 ; Cn # [2] .. +-10A3B..10A3E ; Cn # [4] .. +-10A49..10A4F ; Cn # [7] .. +-10A59..10A5F ; Cn # [7] .. +-10AA0..10ABF ; Cn # [32] .. +-10AE7..10AEA ; Cn # [4] .. +-10AF7..10AFF ; Cn # [9] .. +-10B36..10B38 ; Cn # [3] .. +-10B56..10B57 ; Cn # [2] .. +-10B73..10B77 ; Cn # [5] .. +-10B92..10B98 ; Cn # [7] .. +-10B9D..10BA8 ; Cn # [12] .. +-10BB0..10BFF ; Cn # [80] .. +-10C49..10C7F ; Cn # [55] .. +-10CB3..10CBF ; Cn # [13] .. +-10CF3..10CF9 ; Cn # [7] .. +-10D28..10D2F ; Cn # [8] .. +-10D3A..10E5F ; Cn # [294] .. +-10E7F ; Cn # +-10EAA ; Cn # +-10EAE..10EAF ; Cn # [2] .. +-10EB2..10EFF ; Cn # [78] .. +-10F28..10F2F ; Cn # [8] .. +-10F5A..10FAF ; Cn # [86] .. +-10FCC..10FDF ; Cn # [20] .. +-10FF7..10FFF ; Cn # [9] .. +-1104E..11051 ; Cn # [4] .. +-11070..1107E ; Cn # [15] .. +-110C2..110CC ; Cn # [11] .. +-110CE..110CF ; Cn # [2] .. +-110E9..110EF ; Cn # [7] .. +-110FA..110FF ; Cn # [6] .. +-11135 ; Cn # +-11148..1114F ; Cn # [8] .. +-11177..1117F ; Cn # [9] .. +-111E0 ; Cn # +-111F5..111FF ; Cn # [11] .. +-11212 ; Cn # +-1123F..1127F ; Cn # [65] .. +-11287 ; Cn # +-11289 ; Cn # +-1128E ; Cn # +-1129E ; Cn # +-112AA..112AF ; Cn # [6] .. +-112EB..112EF ; Cn # [5] .. +-112FA..112FF ; Cn # [6] .. +-11304 ; Cn # +-1130D..1130E ; Cn # [2] .. +-11311..11312 ; Cn # [2] .. +-11329 ; Cn # +-11331 ; Cn # +-11334 ; Cn # +-1133A ; Cn # +-11345..11346 ; Cn # [2] .. +-11349..1134A ; Cn # [2] .. +-1134E..1134F ; Cn # [2] .. +-11351..11356 ; Cn # [6] .. +-11358..1135C ; Cn # [5] .. +-11364..11365 ; Cn # [2] .. +-1136D..1136F ; Cn # [3] .. +-11375..113FF ; Cn # [139] .. +-1145C ; Cn # +-11462..1147F ; Cn # [30] .. +-114C8..114CF ; Cn # [8] .. +-114DA..1157F ; Cn # [166] .. +-115B6..115B7 ; Cn # [2] .. +-115DE..115FF ; Cn # [34] .. +-11645..1164F ; Cn # [11] .. +-1165A..1165F ; Cn # [6] .. +-1166D..1167F ; Cn # [19] .. +-116B9..116BF ; Cn # [7] .. +-116CA..116FF ; Cn # [54] .. +-1171B..1171C ; Cn # [2] .. +-1172C..1172F ; Cn # [4] .. +-11740..117FF ; Cn # [192] .. +-1183C..1189F ; Cn # [100] .. +-118F3..118FE ; Cn # [12] .. +-11907..11908 ; Cn # [2] .. +-1190A..1190B ; Cn # [2] .. +-11914 ; Cn # +-11917 ; Cn # +-11936 ; Cn # +-11939..1193A ; Cn # [2] .. +-11947..1194F ; Cn # [9] .. +-1195A..1199F ; Cn # [70] .. +-119A8..119A9 ; Cn # [2] .. +-119D8..119D9 ; Cn # [2] .. +-119E5..119FF ; Cn # [27] .. +-11A48..11A4F ; Cn # [8] .. +-11AA3..11ABF ; Cn # [29] .. +-11AF9..11BFF ; Cn # [263] .. +-11C09 ; Cn # +-11C37 ; Cn # +-11C46..11C4F ; Cn # [10] .. +-11C6D..11C6F ; Cn # [3] .. +-11C90..11C91 ; Cn # [2] .. +-11CA8 ; Cn # +-11CB7..11CFF ; Cn # [73] .. +-11D07 ; Cn # +-11D0A ; Cn # +-11D37..11D39 ; Cn # [3] .. +-11D3B ; Cn # +-11D3E ; Cn # +-11D48..11D4F ; Cn # [8] .. +-11D5A..11D5F ; Cn # [6] .. +-11D66 ; Cn # +-11D69 ; Cn # +-11D8F ; Cn # +-11D92 ; Cn # +-11D99..11D9F ; Cn # [7] .. +-11DAA..11EDF ; Cn # [310] .. +-11EF9..11FAF ; Cn # [183] .. +-11FB1..11FBF ; Cn # [15] .. +-11FF2..11FFE ; Cn # [13] .. +-1239A..123FF ; Cn # [102] .. +-1246F ; Cn # +-12475..1247F ; Cn # [11] .. +-12544..12FFF ; Cn # [2748] .. +-1342F ; Cn # +-13439..143FF ; Cn # [4039] .. +-14647..167FF ; Cn # [8633] .. +-16A39..16A3F ; Cn # [7] .. +-16A5F ; Cn # +-16A6A..16A6D ; Cn # [4] .. +-16A70..16ACF ; Cn # [96] .. +-16AEE..16AEF ; Cn # [2] .. +-16AF6..16AFF ; Cn # [10] .. +-16B46..16B4F ; Cn # [10] .. +-16B5A ; Cn # +-16B62 ; Cn # +-16B78..16B7C ; Cn # [5] .. +-16B90..16E3F ; Cn # [688] .. +-16E9B..16EFF ; Cn # [101] .. +-16F4B..16F4E ; Cn # [4] .. +-16F88..16F8E ; Cn # [7] .. +-16FA0..16FDF ; Cn # [64] .. +-16FE5..16FEF ; Cn # [11] .. +-16FF2..16FFF ; Cn # [14] .. +-187F8..187FF ; Cn # [8] .. +-18CD6..18CFF ; Cn # [42] .. +-18D09..1AFFF ; Cn # [8951] .. +-1B11F..1B14F ; Cn # [49] .. +-1B153..1B163 ; Cn # [17] .. +-1B168..1B16F ; Cn # [8] .. +-1B2FC..1BBFF ; Cn # [2308] .. +-1BC6B..1BC6F ; Cn # [5] .. +-1BC7D..1BC7F ; Cn # [3] .. +-1BC89..1BC8F ; Cn # [7] .. +-1BC9A..1BC9B ; Cn # [2] .. +-1BCA4..1CFFF ; Cn # [4956] .. +-1D0F6..1D0FF ; Cn # [10] .. +-1D127..1D128 ; Cn # [2] .. +-1D1E9..1D1FF ; Cn # [23] .. +-1D246..1D2DF ; Cn # [154] .. +-1D2F4..1D2FF ; Cn # [12] .. +-1D357..1D35F ; Cn # [9] .. +-1D379..1D3FF ; Cn # [135] .. +-1D455 ; Cn # +-1D49D ; Cn # +-1D4A0..1D4A1 ; Cn # [2] .. +-1D4A3..1D4A4 ; Cn # [2] .. +-1D4A7..1D4A8 ; Cn # [2] .. +-1D4AD ; Cn # +-1D4BA ; Cn # +-1D4BC ; Cn # +-1D4C4 ; Cn # +-1D506 ; Cn # +-1D50B..1D50C ; Cn # [2] .. +-1D515 ; Cn # +-1D51D ; Cn # +-1D53A ; Cn # +-1D53F ; Cn # +-1D545 ; Cn # +-1D547..1D549 ; Cn # [3] .. +-1D551 ; Cn # +-1D6A6..1D6A7 ; Cn # [2] .. +-1D7CC..1D7CD ; Cn # [2] .. +-1DA8C..1DA9A ; Cn # [15] .. +-1DAA0 ; Cn # +-1DAB0..1DFFF ; Cn # [1360] .. +-1E007 ; Cn # +-1E019..1E01A ; Cn # [2] .. +-1E022 ; Cn # +-1E025 ; Cn # +-1E02B..1E0FF ; Cn # [213] .. +-1E12D..1E12F ; Cn # [3] .. +-1E13E..1E13F ; Cn # [2] .. +-1E14A..1E14D ; Cn # [4] .. +-1E150..1E2BF ; Cn # [368] .. +-1E2FA..1E2FE ; Cn # [5] .. +-1E300..1E7FF ; Cn # [1280] .. +-1E8C5..1E8C6 ; Cn # [2] .. +-1E8D7..1E8FF ; Cn # [41] .. +-1E94C..1E94F ; Cn # [4] .. +-1E95A..1E95D ; Cn # [4] .. +-1E960..1EC70 ; Cn # [785] .. +-1ECB5..1ED00 ; Cn # [76] .. +-1ED3E..1EDFF ; Cn # [194] .. +-1EE04 ; Cn # +-1EE20 ; Cn # +-1EE23 ; Cn # +-1EE25..1EE26 ; Cn # [2] .. +-1EE28 ; Cn # +-1EE33 ; Cn # +-1EE38 ; Cn # +-1EE3A ; Cn # +-1EE3C..1EE41 ; Cn # [6] .. +-1EE43..1EE46 ; Cn # [4] .. +-1EE48 ; Cn # +-1EE4A ; Cn # +-1EE4C ; Cn # +-1EE50 ; Cn # +-1EE53 ; Cn # +-1EE55..1EE56 ; Cn # [2] .. +-1EE58 ; Cn # +-1EE5A ; Cn # +-1EE5C ; Cn # +-1EE5E ; Cn # +-1EE60 ; Cn # +-1EE63 ; Cn # +-1EE65..1EE66 ; Cn # [2] .. +-1EE6B ; Cn # +-1EE73 ; Cn # +-1EE78 ; Cn # +-1EE7D ; Cn # +-1EE7F ; Cn # +-1EE8A ; Cn # +-1EE9C..1EEA0 ; Cn # [5] .. +-1EEA4 ; Cn # +-1EEAA ; Cn # +-1EEBC..1EEEF ; Cn # [52] .. +-1EEF2..1EFFF ; Cn # [270] .. +-1F02C..1F02F ; Cn # [4] .. +-1F094..1F09F ; Cn # [12] .. +-1F0AF..1F0B0 ; Cn # [2] .. +-1F0C0 ; Cn # +-1F0D0 ; Cn # +-1F0F6..1F0FF ; Cn # [10] .. +-1F1AE..1F1E5 ; Cn # [56] .. +-1F203..1F20F ; Cn # [13] .. +-1F23C..1F23F ; Cn # [4] .. +-1F249..1F24F ; Cn # [7] .. +-1F252..1F25F ; Cn # [14] .. +-1F266..1F2FF ; Cn # [154] .. +-1F6D8..1F6DF ; Cn # [8] .. +-1F6ED..1F6EF ; Cn # [3] .. +-1F6FD..1F6FF ; Cn # [3] .. +-1F774..1F77F ; Cn # [12] .. +-1F7D9..1F7DF ; Cn # [7] .. +-1F7EC..1F7FF ; Cn # [20] .. +-1F80C..1F80F ; Cn # [4] .. +-1F848..1F84F ; Cn # [8] .. +-1F85A..1F85F ; Cn # [6] .. +-1F888..1F88F ; Cn # [8] .. +-1F8AE..1F8AF ; Cn # [2] .. +-1F8B2..1F8FF ; Cn # [78] .. +-1F979 ; Cn # +-1F9CC ; Cn # +-1FA54..1FA5F ; Cn # [12] .. +-1FA6E..1FA6F ; Cn # [2] .. +-1FA75..1FA77 ; Cn # [3] .. +-1FA7B..1FA7F ; Cn # [5] .. +-1FA87..1FA8F ; Cn # [9] .. +-1FAA9..1FAAF ; Cn # [7] .. +-1FAB7..1FABF ; Cn # [9] .. +-1FAC3..1FACF ; Cn # [13] .. +-1FAD7..1FAFF ; Cn # [41] .. +-1FB93 ; Cn # +-1FBCB..1FBEF ; Cn # [37] .. +-1FBFA..1FFFF ; Cn # [1030] .. +-2A6DE..2A6FF ; Cn # [34] .. +-2B735..2B73F ; Cn # [11] .. +-2B81E..2B81F ; Cn # [2] .. +-2CEA2..2CEAF ; Cn # [14] .. +-2EBE1..2F7FF ; Cn # [3103] .. +-2FA1E..2FFFF ; Cn # [1506] .. +-3134B..E0000 ; Cn # [715958] .. +-E0002..E001F ; Cn # [30] .. +-E0080..E00FF ; Cn # [128] .. +-E01F0..EFFFF ; Cn # [65040] .. +-FFFFE..FFFFF ; Cn # [2] .. +-10FFFE..10FFFF; Cn # [2] .. +- +-# Total code points: 830672 +- +-# ================================================ +- +-# General_Category=Uppercase_Letter +- +-0041..005A ; Lu # [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +-00C0..00D6 ; Lu # [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS +-00D8..00DE ; Lu # [7] LATIN CAPITAL LETTER O WITH STROKE..LATIN CAPITAL LETTER THORN +-0100 ; Lu # LATIN CAPITAL LETTER A WITH MACRON +-0102 ; Lu # LATIN CAPITAL LETTER A WITH BREVE +-0104 ; Lu # LATIN CAPITAL LETTER A WITH OGONEK +-0106 ; Lu # LATIN CAPITAL LETTER C WITH ACUTE +-0108 ; Lu # LATIN CAPITAL LETTER C WITH CIRCUMFLEX +-010A ; Lu # LATIN CAPITAL LETTER C WITH DOT ABOVE +-010C ; Lu # LATIN CAPITAL LETTER C WITH CARON +-010E ; Lu # LATIN CAPITAL LETTER D WITH CARON +-0110 ; Lu # LATIN CAPITAL LETTER D WITH STROKE +-0112 ; Lu # LATIN CAPITAL LETTER E WITH MACRON +-0114 ; Lu # LATIN CAPITAL LETTER E WITH BREVE +-0116 ; Lu # LATIN CAPITAL LETTER E WITH DOT ABOVE +-0118 ; Lu # LATIN CAPITAL LETTER E WITH OGONEK +-011A ; Lu # LATIN CAPITAL LETTER E WITH CARON +-011C ; Lu # LATIN CAPITAL LETTER G WITH CIRCUMFLEX +-011E ; Lu # LATIN CAPITAL LETTER G WITH BREVE +-0120 ; Lu # LATIN CAPITAL LETTER G WITH DOT ABOVE +-0122 ; Lu # LATIN CAPITAL LETTER G WITH CEDILLA +-0124 ; Lu # LATIN CAPITAL LETTER H WITH CIRCUMFLEX +-0126 ; Lu # LATIN CAPITAL LETTER H WITH STROKE +-0128 ; Lu # LATIN CAPITAL LETTER I WITH TILDE +-012A ; Lu # LATIN CAPITAL LETTER I WITH MACRON +-012C ; Lu # LATIN CAPITAL LETTER I WITH BREVE +-012E ; Lu # LATIN CAPITAL LETTER I WITH OGONEK +-0130 ; Lu # LATIN CAPITAL LETTER I WITH DOT ABOVE +-0132 ; Lu # LATIN CAPITAL LIGATURE IJ +-0134 ; Lu # LATIN CAPITAL LETTER J WITH CIRCUMFLEX +-0136 ; Lu # LATIN CAPITAL LETTER K WITH CEDILLA +-0139 ; Lu # LATIN CAPITAL LETTER L WITH ACUTE +-013B ; Lu # LATIN CAPITAL LETTER L WITH CEDILLA +-013D ; Lu # LATIN CAPITAL LETTER L WITH CARON +-013F ; Lu # LATIN CAPITAL LETTER L WITH MIDDLE DOT +-0141 ; Lu # LATIN CAPITAL LETTER L WITH STROKE +-0143 ; Lu # LATIN CAPITAL LETTER N WITH ACUTE +-0145 ; Lu # LATIN CAPITAL LETTER N WITH CEDILLA +-0147 ; Lu # LATIN CAPITAL LETTER N WITH CARON +-014A ; Lu # LATIN CAPITAL LETTER ENG +-014C ; Lu # LATIN CAPITAL LETTER O WITH MACRON +-014E ; Lu # LATIN CAPITAL LETTER O WITH BREVE +-0150 ; Lu # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +-0152 ; Lu # LATIN CAPITAL LIGATURE OE +-0154 ; Lu # LATIN CAPITAL LETTER R WITH ACUTE +-0156 ; Lu # LATIN CAPITAL LETTER R WITH CEDILLA +-0158 ; Lu # LATIN CAPITAL LETTER R WITH CARON +-015A ; Lu # LATIN CAPITAL LETTER S WITH ACUTE +-015C ; Lu # LATIN CAPITAL LETTER S WITH CIRCUMFLEX +-015E ; Lu # LATIN CAPITAL LETTER S WITH CEDILLA +-0160 ; Lu # LATIN CAPITAL LETTER S WITH CARON +-0162 ; Lu # LATIN CAPITAL LETTER T WITH CEDILLA +-0164 ; Lu # LATIN CAPITAL LETTER T WITH CARON +-0166 ; Lu # LATIN CAPITAL LETTER T WITH STROKE +-0168 ; Lu # LATIN CAPITAL LETTER U WITH TILDE +-016A ; Lu # LATIN CAPITAL LETTER U WITH MACRON +-016C ; Lu # LATIN CAPITAL LETTER U WITH BREVE +-016E ; Lu # LATIN CAPITAL LETTER U WITH RING ABOVE +-0170 ; Lu # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +-0172 ; Lu # LATIN CAPITAL LETTER U WITH OGONEK +-0174 ; Lu # LATIN CAPITAL LETTER W WITH CIRCUMFLEX +-0176 ; Lu # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +-0178..0179 ; Lu # [2] LATIN CAPITAL LETTER Y WITH DIAERESIS..LATIN CAPITAL LETTER Z WITH ACUTE +-017B ; Lu # LATIN CAPITAL LETTER Z WITH DOT ABOVE +-017D ; Lu # LATIN CAPITAL LETTER Z WITH CARON +-0181..0182 ; Lu # [2] LATIN CAPITAL LETTER B WITH HOOK..LATIN CAPITAL LETTER B WITH TOPBAR +-0184 ; Lu # LATIN CAPITAL LETTER TONE SIX +-0186..0187 ; Lu # [2] LATIN CAPITAL LETTER OPEN O..LATIN CAPITAL LETTER C WITH HOOK +-0189..018B ; Lu # [3] LATIN CAPITAL LETTER AFRICAN D..LATIN CAPITAL LETTER D WITH TOPBAR +-018E..0191 ; Lu # [4] LATIN CAPITAL LETTER REVERSED E..LATIN CAPITAL LETTER F WITH HOOK +-0193..0194 ; Lu # [2] LATIN CAPITAL LETTER G WITH HOOK..LATIN CAPITAL LETTER GAMMA +-0196..0198 ; Lu # [3] LATIN CAPITAL LETTER IOTA..LATIN CAPITAL LETTER K WITH HOOK +-019C..019D ; Lu # [2] LATIN CAPITAL LETTER TURNED M..LATIN CAPITAL LETTER N WITH LEFT HOOK +-019F..01A0 ; Lu # [2] LATIN CAPITAL LETTER O WITH MIDDLE TILDE..LATIN CAPITAL LETTER O WITH HORN +-01A2 ; Lu # LATIN CAPITAL LETTER OI +-01A4 ; Lu # LATIN CAPITAL LETTER P WITH HOOK +-01A6..01A7 ; Lu # [2] LATIN LETTER YR..LATIN CAPITAL LETTER TONE TWO +-01A9 ; Lu # LATIN CAPITAL LETTER ESH +-01AC ; Lu # LATIN CAPITAL LETTER T WITH HOOK +-01AE..01AF ; Lu # [2] LATIN CAPITAL LETTER T WITH RETROFLEX HOOK..LATIN CAPITAL LETTER U WITH HORN +-01B1..01B3 ; Lu # [3] LATIN CAPITAL LETTER UPSILON..LATIN CAPITAL LETTER Y WITH HOOK +-01B5 ; Lu # LATIN CAPITAL LETTER Z WITH STROKE +-01B7..01B8 ; Lu # [2] LATIN CAPITAL LETTER EZH..LATIN CAPITAL LETTER EZH REVERSED +-01BC ; Lu # LATIN CAPITAL LETTER TONE FIVE +-01C4 ; Lu # LATIN CAPITAL LETTER DZ WITH CARON +-01C7 ; Lu # LATIN CAPITAL LETTER LJ +-01CA ; Lu # LATIN CAPITAL LETTER NJ +-01CD ; Lu # LATIN CAPITAL LETTER A WITH CARON +-01CF ; Lu # LATIN CAPITAL LETTER I WITH CARON +-01D1 ; Lu # LATIN CAPITAL LETTER O WITH CARON +-01D3 ; Lu # LATIN CAPITAL LETTER U WITH CARON +-01D5 ; Lu # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +-01D7 ; Lu # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +-01D9 ; Lu # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +-01DB ; Lu # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +-01DE ; Lu # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +-01E0 ; Lu # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +-01E2 ; Lu # LATIN CAPITAL LETTER AE WITH MACRON +-01E4 ; Lu # LATIN CAPITAL LETTER G WITH STROKE +-01E6 ; Lu # LATIN CAPITAL LETTER G WITH CARON +-01E8 ; Lu # LATIN CAPITAL LETTER K WITH CARON +-01EA ; Lu # LATIN CAPITAL LETTER O WITH OGONEK +-01EC ; Lu # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +-01EE ; Lu # LATIN CAPITAL LETTER EZH WITH CARON +-01F1 ; Lu # LATIN CAPITAL LETTER DZ +-01F4 ; Lu # LATIN CAPITAL LETTER G WITH ACUTE +-01F6..01F8 ; Lu # [3] LATIN CAPITAL LETTER HWAIR..LATIN CAPITAL LETTER N WITH GRAVE +-01FA ; Lu # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +-01FC ; Lu # LATIN CAPITAL LETTER AE WITH ACUTE +-01FE ; Lu # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +-0200 ; Lu # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +-0202 ; Lu # LATIN CAPITAL LETTER A WITH INVERTED BREVE +-0204 ; Lu # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +-0206 ; Lu # LATIN CAPITAL LETTER E WITH INVERTED BREVE +-0208 ; Lu # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +-020A ; Lu # LATIN CAPITAL LETTER I WITH INVERTED BREVE +-020C ; Lu # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +-020E ; Lu # LATIN CAPITAL LETTER O WITH INVERTED BREVE +-0210 ; Lu # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +-0212 ; Lu # LATIN CAPITAL LETTER R WITH INVERTED BREVE +-0214 ; Lu # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +-0216 ; Lu # LATIN CAPITAL LETTER U WITH INVERTED BREVE +-0218 ; Lu # LATIN CAPITAL LETTER S WITH COMMA BELOW +-021A ; Lu # LATIN CAPITAL LETTER T WITH COMMA BELOW +-021C ; Lu # LATIN CAPITAL LETTER YOGH +-021E ; Lu # LATIN CAPITAL LETTER H WITH CARON +-0220 ; Lu # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +-0222 ; Lu # LATIN CAPITAL LETTER OU +-0224 ; Lu # LATIN CAPITAL LETTER Z WITH HOOK +-0226 ; Lu # LATIN CAPITAL LETTER A WITH DOT ABOVE +-0228 ; Lu # LATIN CAPITAL LETTER E WITH CEDILLA +-022A ; Lu # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +-022C ; Lu # LATIN CAPITAL LETTER O WITH TILDE AND MACRON +-022E ; Lu # LATIN CAPITAL LETTER O WITH DOT ABOVE +-0230 ; Lu # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +-0232 ; Lu # LATIN CAPITAL LETTER Y WITH MACRON +-023A..023B ; Lu # [2] LATIN CAPITAL LETTER A WITH STROKE..LATIN CAPITAL LETTER C WITH STROKE +-023D..023E ; Lu # [2] LATIN CAPITAL LETTER L WITH BAR..LATIN CAPITAL LETTER T WITH DIAGONAL STROKE +-0241 ; Lu # LATIN CAPITAL LETTER GLOTTAL STOP +-0243..0246 ; Lu # [4] LATIN CAPITAL LETTER B WITH STROKE..LATIN CAPITAL LETTER E WITH STROKE +-0248 ; Lu # LATIN CAPITAL LETTER J WITH STROKE +-024A ; Lu # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL +-024C ; Lu # LATIN CAPITAL LETTER R WITH STROKE +-024E ; Lu # LATIN CAPITAL LETTER Y WITH STROKE +-0370 ; Lu # GREEK CAPITAL LETTER HETA +-0372 ; Lu # GREEK CAPITAL LETTER ARCHAIC SAMPI +-0376 ; Lu # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA +-037F ; Lu # GREEK CAPITAL LETTER YOT +-0386 ; Lu # GREEK CAPITAL LETTER ALPHA WITH TONOS +-0388..038A ; Lu # [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +-038C ; Lu # GREEK CAPITAL LETTER OMICRON WITH TONOS +-038E..038F ; Lu # [2] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER OMEGA WITH TONOS +-0391..03A1 ; Lu # [17] GREEK CAPITAL LETTER ALPHA..GREEK CAPITAL LETTER RHO +-03A3..03AB ; Lu # [9] GREEK CAPITAL LETTER SIGMA..GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +-03CF ; Lu # GREEK CAPITAL KAI SYMBOL +-03D2..03D4 ; Lu # [3] GREEK UPSILON WITH HOOK SYMBOL..GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL +-03D8 ; Lu # GREEK LETTER ARCHAIC KOPPA +-03DA ; Lu # GREEK LETTER STIGMA +-03DC ; Lu # GREEK LETTER DIGAMMA +-03DE ; Lu # GREEK LETTER KOPPA +-03E0 ; Lu # GREEK LETTER SAMPI +-03E2 ; Lu # COPTIC CAPITAL LETTER SHEI +-03E4 ; Lu # COPTIC CAPITAL LETTER FEI +-03E6 ; Lu # COPTIC CAPITAL LETTER KHEI +-03E8 ; Lu # COPTIC CAPITAL LETTER HORI +-03EA ; Lu # COPTIC CAPITAL LETTER GANGIA +-03EC ; Lu # COPTIC CAPITAL LETTER SHIMA +-03EE ; Lu # COPTIC CAPITAL LETTER DEI +-03F4 ; Lu # GREEK CAPITAL THETA SYMBOL +-03F7 ; Lu # GREEK CAPITAL LETTER SHO +-03F9..03FA ; Lu # [2] GREEK CAPITAL LUNATE SIGMA SYMBOL..GREEK CAPITAL LETTER SAN +-03FD..042F ; Lu # [51] GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL..CYRILLIC CAPITAL LETTER YA +-0460 ; Lu # CYRILLIC CAPITAL LETTER OMEGA +-0462 ; Lu # CYRILLIC CAPITAL LETTER YAT +-0464 ; Lu # CYRILLIC CAPITAL LETTER IOTIFIED E +-0466 ; Lu # CYRILLIC CAPITAL LETTER LITTLE YUS +-0468 ; Lu # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +-046A ; Lu # CYRILLIC CAPITAL LETTER BIG YUS +-046C ; Lu # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +-046E ; Lu # CYRILLIC CAPITAL LETTER KSI +-0470 ; Lu # CYRILLIC CAPITAL LETTER PSI +-0472 ; Lu # CYRILLIC CAPITAL LETTER FITA +-0474 ; Lu # CYRILLIC CAPITAL LETTER IZHITSA +-0476 ; Lu # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +-0478 ; Lu # CYRILLIC CAPITAL LETTER UK +-047A ; Lu # CYRILLIC CAPITAL LETTER ROUND OMEGA +-047C ; Lu # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +-047E ; Lu # CYRILLIC CAPITAL LETTER OT +-0480 ; Lu # CYRILLIC CAPITAL LETTER KOPPA +-048A ; Lu # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +-048C ; Lu # CYRILLIC CAPITAL LETTER SEMISOFT SIGN +-048E ; Lu # CYRILLIC CAPITAL LETTER ER WITH TICK +-0490 ; Lu # CYRILLIC CAPITAL LETTER GHE WITH UPTURN +-0492 ; Lu # CYRILLIC CAPITAL LETTER GHE WITH STROKE +-0494 ; Lu # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +-0496 ; Lu # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER +-0498 ; Lu # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +-049A ; Lu # CYRILLIC CAPITAL LETTER KA WITH DESCENDER +-049C ; Lu # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +-049E ; Lu # CYRILLIC CAPITAL LETTER KA WITH STROKE +-04A0 ; Lu # CYRILLIC CAPITAL LETTER BASHKIR KA +-04A2 ; Lu # CYRILLIC CAPITAL LETTER EN WITH DESCENDER +-04A4 ; Lu # CYRILLIC CAPITAL LIGATURE EN GHE +-04A6 ; Lu # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK +-04A8 ; Lu # CYRILLIC CAPITAL LETTER ABKHASIAN HA +-04AA ; Lu # CYRILLIC CAPITAL LETTER ES WITH DESCENDER +-04AC ; Lu # CYRILLIC CAPITAL LETTER TE WITH DESCENDER +-04AE ; Lu # CYRILLIC CAPITAL LETTER STRAIGHT U +-04B0 ; Lu # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +-04B2 ; Lu # CYRILLIC CAPITAL LETTER HA WITH DESCENDER +-04B4 ; Lu # CYRILLIC CAPITAL LIGATURE TE TSE +-04B6 ; Lu # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +-04B8 ; Lu # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE +-04BA ; Lu # CYRILLIC CAPITAL LETTER SHHA +-04BC ; Lu # CYRILLIC CAPITAL LETTER ABKHASIAN CHE +-04BE ; Lu # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER +-04C0..04C1 ; Lu # [2] CYRILLIC LETTER PALOCHKA..CYRILLIC CAPITAL LETTER ZHE WITH BREVE +-04C3 ; Lu # CYRILLIC CAPITAL LETTER KA WITH HOOK +-04C5 ; Lu # CYRILLIC CAPITAL LETTER EL WITH TAIL +-04C7 ; Lu # CYRILLIC CAPITAL LETTER EN WITH HOOK +-04C9 ; Lu # CYRILLIC CAPITAL LETTER EN WITH TAIL +-04CB ; Lu # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +-04CD ; Lu # CYRILLIC CAPITAL LETTER EM WITH TAIL +-04D0 ; Lu # CYRILLIC CAPITAL LETTER A WITH BREVE +-04D2 ; Lu # CYRILLIC CAPITAL LETTER A WITH DIAERESIS +-04D4 ; Lu # CYRILLIC CAPITAL LIGATURE A IE +-04D6 ; Lu # CYRILLIC CAPITAL LETTER IE WITH BREVE +-04D8 ; Lu # CYRILLIC CAPITAL LETTER SCHWA +-04DA ; Lu # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +-04DC ; Lu # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +-04DE ; Lu # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +-04E0 ; Lu # CYRILLIC CAPITAL LETTER ABKHASIAN DZE +-04E2 ; Lu # CYRILLIC CAPITAL LETTER I WITH MACRON +-04E4 ; Lu # CYRILLIC CAPITAL LETTER I WITH DIAERESIS +-04E6 ; Lu # CYRILLIC CAPITAL LETTER O WITH DIAERESIS +-04E8 ; Lu # CYRILLIC CAPITAL LETTER BARRED O +-04EA ; Lu # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +-04EC ; Lu # CYRILLIC CAPITAL LETTER E WITH DIAERESIS +-04EE ; Lu # CYRILLIC CAPITAL LETTER U WITH MACRON +-04F0 ; Lu # CYRILLIC CAPITAL LETTER U WITH DIAERESIS +-04F2 ; Lu # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +-04F4 ; Lu # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +-04F6 ; Lu # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +-04F8 ; Lu # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +-04FA ; Lu # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK +-04FC ; Lu # CYRILLIC CAPITAL LETTER HA WITH HOOK +-04FE ; Lu # CYRILLIC CAPITAL LETTER HA WITH STROKE +-0500 ; Lu # CYRILLIC CAPITAL LETTER KOMI DE +-0502 ; Lu # CYRILLIC CAPITAL LETTER KOMI DJE +-0504 ; Lu # CYRILLIC CAPITAL LETTER KOMI ZJE +-0506 ; Lu # CYRILLIC CAPITAL LETTER KOMI DZJE +-0508 ; Lu # CYRILLIC CAPITAL LETTER KOMI LJE +-050A ; Lu # CYRILLIC CAPITAL LETTER KOMI NJE +-050C ; Lu # CYRILLIC CAPITAL LETTER KOMI SJE +-050E ; Lu # CYRILLIC CAPITAL LETTER KOMI TJE +-0510 ; Lu # CYRILLIC CAPITAL LETTER REVERSED ZE +-0512 ; Lu # CYRILLIC CAPITAL LETTER EL WITH HOOK +-0514 ; Lu # CYRILLIC CAPITAL LETTER LHA +-0516 ; Lu # CYRILLIC CAPITAL LETTER RHA +-0518 ; Lu # CYRILLIC CAPITAL LETTER YAE +-051A ; Lu # CYRILLIC CAPITAL LETTER QA +-051C ; Lu # CYRILLIC CAPITAL LETTER WE +-051E ; Lu # CYRILLIC CAPITAL LETTER ALEUT KA +-0520 ; Lu # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK +-0522 ; Lu # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK +-0524 ; Lu # CYRILLIC CAPITAL LETTER PE WITH DESCENDER +-0526 ; Lu # CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER +-0528 ; Lu # CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK +-052A ; Lu # CYRILLIC CAPITAL LETTER DZZHE +-052C ; Lu # CYRILLIC CAPITAL LETTER DCHE +-052E ; Lu # CYRILLIC CAPITAL LETTER EL WITH DESCENDER +-0531..0556 ; Lu # [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +-10A0..10C5 ; Lu # [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +-10C7 ; Lu # GEORGIAN CAPITAL LETTER YN +-10CD ; Lu # GEORGIAN CAPITAL LETTER AEN +-13A0..13F5 ; Lu # [86] CHEROKEE LETTER A..CHEROKEE LETTER MV +-1C90..1CBA ; Lu # [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN +-1CBD..1CBF ; Lu # [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +-1E00 ; Lu # LATIN CAPITAL LETTER A WITH RING BELOW +-1E02 ; Lu # LATIN CAPITAL LETTER B WITH DOT ABOVE +-1E04 ; Lu # LATIN CAPITAL LETTER B WITH DOT BELOW +-1E06 ; Lu # LATIN CAPITAL LETTER B WITH LINE BELOW +-1E08 ; Lu # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +-1E0A ; Lu # LATIN CAPITAL LETTER D WITH DOT ABOVE +-1E0C ; Lu # LATIN CAPITAL LETTER D WITH DOT BELOW +-1E0E ; Lu # LATIN CAPITAL LETTER D WITH LINE BELOW +-1E10 ; Lu # LATIN CAPITAL LETTER D WITH CEDILLA +-1E12 ; Lu # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +-1E14 ; Lu # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +-1E16 ; Lu # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +-1E18 ; Lu # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +-1E1A ; Lu # LATIN CAPITAL LETTER E WITH TILDE BELOW +-1E1C ; Lu # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +-1E1E ; Lu # LATIN CAPITAL LETTER F WITH DOT ABOVE +-1E20 ; Lu # LATIN CAPITAL LETTER G WITH MACRON +-1E22 ; Lu # LATIN CAPITAL LETTER H WITH DOT ABOVE +-1E24 ; Lu # LATIN CAPITAL LETTER H WITH DOT BELOW +-1E26 ; Lu # LATIN CAPITAL LETTER H WITH DIAERESIS +-1E28 ; Lu # LATIN CAPITAL LETTER H WITH CEDILLA +-1E2A ; Lu # LATIN CAPITAL LETTER H WITH BREVE BELOW +-1E2C ; Lu # LATIN CAPITAL LETTER I WITH TILDE BELOW +-1E2E ; Lu # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +-1E30 ; Lu # LATIN CAPITAL LETTER K WITH ACUTE +-1E32 ; Lu # LATIN CAPITAL LETTER K WITH DOT BELOW +-1E34 ; Lu # LATIN CAPITAL LETTER K WITH LINE BELOW +-1E36 ; Lu # LATIN CAPITAL LETTER L WITH DOT BELOW +-1E38 ; Lu # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +-1E3A ; Lu # LATIN CAPITAL LETTER L WITH LINE BELOW +-1E3C ; Lu # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +-1E3E ; Lu # LATIN CAPITAL LETTER M WITH ACUTE +-1E40 ; Lu # LATIN CAPITAL LETTER M WITH DOT ABOVE +-1E42 ; Lu # LATIN CAPITAL LETTER M WITH DOT BELOW +-1E44 ; Lu # LATIN CAPITAL LETTER N WITH DOT ABOVE +-1E46 ; Lu # LATIN CAPITAL LETTER N WITH DOT BELOW +-1E48 ; Lu # LATIN CAPITAL LETTER N WITH LINE BELOW +-1E4A ; Lu # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +-1E4C ; Lu # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +-1E4E ; Lu # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +-1E50 ; Lu # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +-1E52 ; Lu # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +-1E54 ; Lu # LATIN CAPITAL LETTER P WITH ACUTE +-1E56 ; Lu # LATIN CAPITAL LETTER P WITH DOT ABOVE +-1E58 ; Lu # LATIN CAPITAL LETTER R WITH DOT ABOVE +-1E5A ; Lu # LATIN CAPITAL LETTER R WITH DOT BELOW +-1E5C ; Lu # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +-1E5E ; Lu # LATIN CAPITAL LETTER R WITH LINE BELOW +-1E60 ; Lu # LATIN CAPITAL LETTER S WITH DOT ABOVE +-1E62 ; Lu # LATIN CAPITAL LETTER S WITH DOT BELOW +-1E64 ; Lu # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +-1E66 ; Lu # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +-1E68 ; Lu # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +-1E6A ; Lu # LATIN CAPITAL LETTER T WITH DOT ABOVE +-1E6C ; Lu # LATIN CAPITAL LETTER T WITH DOT BELOW +-1E6E ; Lu # LATIN CAPITAL LETTER T WITH LINE BELOW +-1E70 ; Lu # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +-1E72 ; Lu # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +-1E74 ; Lu # LATIN CAPITAL LETTER U WITH TILDE BELOW +-1E76 ; Lu # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +-1E78 ; Lu # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +-1E7A ; Lu # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +-1E7C ; Lu # LATIN CAPITAL LETTER V WITH TILDE +-1E7E ; Lu # LATIN CAPITAL LETTER V WITH DOT BELOW +-1E80 ; Lu # LATIN CAPITAL LETTER W WITH GRAVE +-1E82 ; Lu # LATIN CAPITAL LETTER W WITH ACUTE +-1E84 ; Lu # LATIN CAPITAL LETTER W WITH DIAERESIS +-1E86 ; Lu # LATIN CAPITAL LETTER W WITH DOT ABOVE +-1E88 ; Lu # LATIN CAPITAL LETTER W WITH DOT BELOW +-1E8A ; Lu # LATIN CAPITAL LETTER X WITH DOT ABOVE +-1E8C ; Lu # LATIN CAPITAL LETTER X WITH DIAERESIS +-1E8E ; Lu # LATIN CAPITAL LETTER Y WITH DOT ABOVE +-1E90 ; Lu # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +-1E92 ; Lu # LATIN CAPITAL LETTER Z WITH DOT BELOW +-1E94 ; Lu # LATIN CAPITAL LETTER Z WITH LINE BELOW +-1E9E ; Lu # LATIN CAPITAL LETTER SHARP S +-1EA0 ; Lu # LATIN CAPITAL LETTER A WITH DOT BELOW +-1EA2 ; Lu # LATIN CAPITAL LETTER A WITH HOOK ABOVE +-1EA4 ; Lu # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +-1EA6 ; Lu # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +-1EA8 ; Lu # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +-1EAA ; Lu # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +-1EAC ; Lu # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +-1EAE ; Lu # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +-1EB0 ; Lu # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +-1EB2 ; Lu # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +-1EB4 ; Lu # LATIN CAPITAL LETTER A WITH BREVE AND TILDE +-1EB6 ; Lu # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +-1EB8 ; Lu # LATIN CAPITAL LETTER E WITH DOT BELOW +-1EBA ; Lu # LATIN CAPITAL LETTER E WITH HOOK ABOVE +-1EBC ; Lu # LATIN CAPITAL LETTER E WITH TILDE +-1EBE ; Lu # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +-1EC0 ; Lu # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +-1EC2 ; Lu # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +-1EC4 ; Lu # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +-1EC6 ; Lu # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +-1EC8 ; Lu # LATIN CAPITAL LETTER I WITH HOOK ABOVE +-1ECA ; Lu # LATIN CAPITAL LETTER I WITH DOT BELOW +-1ECC ; Lu # LATIN CAPITAL LETTER O WITH DOT BELOW +-1ECE ; Lu # LATIN CAPITAL LETTER O WITH HOOK ABOVE +-1ED0 ; Lu # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +-1ED2 ; Lu # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +-1ED4 ; Lu # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +-1ED6 ; Lu # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +-1ED8 ; Lu # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +-1EDA ; Lu # LATIN CAPITAL LETTER O WITH HORN AND ACUTE +-1EDC ; Lu # LATIN CAPITAL LETTER O WITH HORN AND GRAVE +-1EDE ; Lu # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +-1EE0 ; Lu # LATIN CAPITAL LETTER O WITH HORN AND TILDE +-1EE2 ; Lu # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +-1EE4 ; Lu # LATIN CAPITAL LETTER U WITH DOT BELOW +-1EE6 ; Lu # LATIN CAPITAL LETTER U WITH HOOK ABOVE +-1EE8 ; Lu # LATIN CAPITAL LETTER U WITH HORN AND ACUTE +-1EEA ; Lu # LATIN CAPITAL LETTER U WITH HORN AND GRAVE +-1EEC ; Lu # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +-1EEE ; Lu # LATIN CAPITAL LETTER U WITH HORN AND TILDE +-1EF0 ; Lu # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +-1EF2 ; Lu # LATIN CAPITAL LETTER Y WITH GRAVE +-1EF4 ; Lu # LATIN CAPITAL LETTER Y WITH DOT BELOW +-1EF6 ; Lu # LATIN CAPITAL LETTER Y WITH HOOK ABOVE +-1EF8 ; Lu # LATIN CAPITAL LETTER Y WITH TILDE +-1EFA ; Lu # LATIN CAPITAL LETTER MIDDLE-WELSH LL +-1EFC ; Lu # LATIN CAPITAL LETTER MIDDLE-WELSH V +-1EFE ; Lu # LATIN CAPITAL LETTER Y WITH LOOP +-1F08..1F0F ; Lu # [8] GREEK CAPITAL LETTER ALPHA WITH PSILI..GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +-1F18..1F1D ; Lu # [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +-1F28..1F2F ; Lu # [8] GREEK CAPITAL LETTER ETA WITH PSILI..GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +-1F38..1F3F ; Lu # [8] GREEK CAPITAL LETTER IOTA WITH PSILI..GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +-1F48..1F4D ; Lu # [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +-1F59 ; Lu # GREEK CAPITAL LETTER UPSILON WITH DASIA +-1F5B ; Lu # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +-1F5D ; Lu # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +-1F5F ; Lu # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +-1F68..1F6F ; Lu # [8] GREEK CAPITAL LETTER OMEGA WITH PSILI..GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +-1FB8..1FBB ; Lu # [4] GREEK CAPITAL LETTER ALPHA WITH VRACHY..GREEK CAPITAL LETTER ALPHA WITH OXIA +-1FC8..1FCB ; Lu # [4] GREEK CAPITAL LETTER EPSILON WITH VARIA..GREEK CAPITAL LETTER ETA WITH OXIA +-1FD8..1FDB ; Lu # [4] GREEK CAPITAL LETTER IOTA WITH VRACHY..GREEK CAPITAL LETTER IOTA WITH OXIA +-1FE8..1FEC ; Lu # [5] GREEK CAPITAL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +-1FF8..1FFB ; Lu # [4] GREEK CAPITAL LETTER OMICRON WITH VARIA..GREEK CAPITAL LETTER OMEGA WITH OXIA +-2102 ; Lu # DOUBLE-STRUCK CAPITAL C +-2107 ; Lu # EULER CONSTANT +-210B..210D ; Lu # [3] SCRIPT CAPITAL H..DOUBLE-STRUCK CAPITAL H +-2110..2112 ; Lu # [3] SCRIPT CAPITAL I..SCRIPT CAPITAL L +-2115 ; Lu # DOUBLE-STRUCK CAPITAL N +-2119..211D ; Lu # [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +-2124 ; Lu # DOUBLE-STRUCK CAPITAL Z +-2126 ; Lu # OHM SIGN +-2128 ; Lu # BLACK-LETTER CAPITAL Z +-212A..212D ; Lu # [4] KELVIN SIGN..BLACK-LETTER CAPITAL C +-2130..2133 ; Lu # [4] SCRIPT CAPITAL E..SCRIPT CAPITAL M +-213E..213F ; Lu # [2] DOUBLE-STRUCK CAPITAL GAMMA..DOUBLE-STRUCK CAPITAL PI +-2145 ; Lu # DOUBLE-STRUCK ITALIC CAPITAL D +-2183 ; Lu # ROMAN NUMERAL REVERSED ONE HUNDRED +-2C00..2C2E ; Lu # [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +-2C60 ; Lu # LATIN CAPITAL LETTER L WITH DOUBLE BAR +-2C62..2C64 ; Lu # [3] LATIN CAPITAL LETTER L WITH MIDDLE TILDE..LATIN CAPITAL LETTER R WITH TAIL +-2C67 ; Lu # LATIN CAPITAL LETTER H WITH DESCENDER +-2C69 ; Lu # LATIN CAPITAL LETTER K WITH DESCENDER +-2C6B ; Lu # LATIN CAPITAL LETTER Z WITH DESCENDER +-2C6D..2C70 ; Lu # [4] LATIN CAPITAL LETTER ALPHA..LATIN CAPITAL LETTER TURNED ALPHA +-2C72 ; Lu # LATIN CAPITAL LETTER W WITH HOOK +-2C75 ; Lu # LATIN CAPITAL LETTER HALF H +-2C7E..2C80 ; Lu # [3] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC CAPITAL LETTER ALFA +-2C82 ; Lu # COPTIC CAPITAL LETTER VIDA +-2C84 ; Lu # COPTIC CAPITAL LETTER GAMMA +-2C86 ; Lu # COPTIC CAPITAL LETTER DALDA +-2C88 ; Lu # COPTIC CAPITAL LETTER EIE +-2C8A ; Lu # COPTIC CAPITAL LETTER SOU +-2C8C ; Lu # COPTIC CAPITAL LETTER ZATA +-2C8E ; Lu # COPTIC CAPITAL LETTER HATE +-2C90 ; Lu # COPTIC CAPITAL LETTER THETHE +-2C92 ; Lu # COPTIC CAPITAL LETTER IAUDA +-2C94 ; Lu # COPTIC CAPITAL LETTER KAPA +-2C96 ; Lu # COPTIC CAPITAL LETTER LAULA +-2C98 ; Lu # COPTIC CAPITAL LETTER MI +-2C9A ; Lu # COPTIC CAPITAL LETTER NI +-2C9C ; Lu # COPTIC CAPITAL LETTER KSI +-2C9E ; Lu # COPTIC CAPITAL LETTER O +-2CA0 ; Lu # COPTIC CAPITAL LETTER PI +-2CA2 ; Lu # COPTIC CAPITAL LETTER RO +-2CA4 ; Lu # COPTIC CAPITAL LETTER SIMA +-2CA6 ; Lu # COPTIC CAPITAL LETTER TAU +-2CA8 ; Lu # COPTIC CAPITAL LETTER UA +-2CAA ; Lu # COPTIC CAPITAL LETTER FI +-2CAC ; Lu # COPTIC CAPITAL LETTER KHI +-2CAE ; Lu # COPTIC CAPITAL LETTER PSI +-2CB0 ; Lu # COPTIC CAPITAL LETTER OOU +-2CB2 ; Lu # COPTIC CAPITAL LETTER DIALECT-P ALEF +-2CB4 ; Lu # COPTIC CAPITAL LETTER OLD COPTIC AIN +-2CB6 ; Lu # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +-2CB8 ; Lu # COPTIC CAPITAL LETTER DIALECT-P KAPA +-2CBA ; Lu # COPTIC CAPITAL LETTER DIALECT-P NI +-2CBC ; Lu # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +-2CBE ; Lu # COPTIC CAPITAL LETTER OLD COPTIC OOU +-2CC0 ; Lu # COPTIC CAPITAL LETTER SAMPI +-2CC2 ; Lu # COPTIC CAPITAL LETTER CROSSED SHEI +-2CC4 ; Lu # COPTIC CAPITAL LETTER OLD COPTIC SHEI +-2CC6 ; Lu # COPTIC CAPITAL LETTER OLD COPTIC ESH +-2CC8 ; Lu # COPTIC CAPITAL LETTER AKHMIMIC KHEI +-2CCA ; Lu # COPTIC CAPITAL LETTER DIALECT-P HORI +-2CCC ; Lu # COPTIC CAPITAL LETTER OLD COPTIC HORI +-2CCE ; Lu # COPTIC CAPITAL LETTER OLD COPTIC HA +-2CD0 ; Lu # COPTIC CAPITAL LETTER L-SHAPED HA +-2CD2 ; Lu # COPTIC CAPITAL LETTER OLD COPTIC HEI +-2CD4 ; Lu # COPTIC CAPITAL LETTER OLD COPTIC HAT +-2CD6 ; Lu # COPTIC CAPITAL LETTER OLD COPTIC GANGIA +-2CD8 ; Lu # COPTIC CAPITAL LETTER OLD COPTIC DJA +-2CDA ; Lu # COPTIC CAPITAL LETTER OLD COPTIC SHIMA +-2CDC ; Lu # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +-2CDE ; Lu # COPTIC CAPITAL LETTER OLD NUBIAN NGI +-2CE0 ; Lu # COPTIC CAPITAL LETTER OLD NUBIAN NYI +-2CE2 ; Lu # COPTIC CAPITAL LETTER OLD NUBIAN WAU +-2CEB ; Lu # COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI +-2CED ; Lu # COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA +-2CF2 ; Lu # COPTIC CAPITAL LETTER BOHAIRIC KHEI +-A640 ; Lu # CYRILLIC CAPITAL LETTER ZEMLYA +-A642 ; Lu # CYRILLIC CAPITAL LETTER DZELO +-A644 ; Lu # CYRILLIC CAPITAL LETTER REVERSED DZE +-A646 ; Lu # CYRILLIC CAPITAL LETTER IOTA +-A648 ; Lu # CYRILLIC CAPITAL LETTER DJERV +-A64A ; Lu # CYRILLIC CAPITAL LETTER MONOGRAPH UK +-A64C ; Lu # CYRILLIC CAPITAL LETTER BROAD OMEGA +-A64E ; Lu # CYRILLIC CAPITAL LETTER NEUTRAL YER +-A650 ; Lu # CYRILLIC CAPITAL LETTER YERU WITH BACK YER +-A652 ; Lu # CYRILLIC CAPITAL LETTER IOTIFIED YAT +-A654 ; Lu # CYRILLIC CAPITAL LETTER REVERSED YU +-A656 ; Lu # CYRILLIC CAPITAL LETTER IOTIFIED A +-A658 ; Lu # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS +-A65A ; Lu # CYRILLIC CAPITAL LETTER BLENDED YUS +-A65C ; Lu # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS +-A65E ; Lu # CYRILLIC CAPITAL LETTER YN +-A660 ; Lu # CYRILLIC CAPITAL LETTER REVERSED TSE +-A662 ; Lu # CYRILLIC CAPITAL LETTER SOFT DE +-A664 ; Lu # CYRILLIC CAPITAL LETTER SOFT EL +-A666 ; Lu # CYRILLIC CAPITAL LETTER SOFT EM +-A668 ; Lu # CYRILLIC CAPITAL LETTER MONOCULAR O +-A66A ; Lu # CYRILLIC CAPITAL LETTER BINOCULAR O +-A66C ; Lu # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O +-A680 ; Lu # CYRILLIC CAPITAL LETTER DWE +-A682 ; Lu # CYRILLIC CAPITAL LETTER DZWE +-A684 ; Lu # CYRILLIC CAPITAL LETTER ZHWE +-A686 ; Lu # CYRILLIC CAPITAL LETTER CCHE +-A688 ; Lu # CYRILLIC CAPITAL LETTER DZZE +-A68A ; Lu # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK +-A68C ; Lu # CYRILLIC CAPITAL LETTER TWE +-A68E ; Lu # CYRILLIC CAPITAL LETTER TSWE +-A690 ; Lu # CYRILLIC CAPITAL LETTER TSSE +-A692 ; Lu # CYRILLIC CAPITAL LETTER TCHE +-A694 ; Lu # CYRILLIC CAPITAL LETTER HWE +-A696 ; Lu # CYRILLIC CAPITAL LETTER SHWE +-A698 ; Lu # CYRILLIC CAPITAL LETTER DOUBLE O +-A69A ; Lu # CYRILLIC CAPITAL LETTER CROSSED O +-A722 ; Lu # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF +-A724 ; Lu # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN +-A726 ; Lu # LATIN CAPITAL LETTER HENG +-A728 ; Lu # LATIN CAPITAL LETTER TZ +-A72A ; Lu # LATIN CAPITAL LETTER TRESILLO +-A72C ; Lu # LATIN CAPITAL LETTER CUATRILLO +-A72E ; Lu # LATIN CAPITAL LETTER CUATRILLO WITH COMMA +-A732 ; Lu # LATIN CAPITAL LETTER AA +-A734 ; Lu # LATIN CAPITAL LETTER AO +-A736 ; Lu # LATIN CAPITAL LETTER AU +-A738 ; Lu # LATIN CAPITAL LETTER AV +-A73A ; Lu # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR +-A73C ; Lu # LATIN CAPITAL LETTER AY +-A73E ; Lu # LATIN CAPITAL LETTER REVERSED C WITH DOT +-A740 ; Lu # LATIN CAPITAL LETTER K WITH STROKE +-A742 ; Lu # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE +-A744 ; Lu # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE +-A746 ; Lu # LATIN CAPITAL LETTER BROKEN L +-A748 ; Lu # LATIN CAPITAL LETTER L WITH HIGH STROKE +-A74A ; Lu # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY +-A74C ; Lu # LATIN CAPITAL LETTER O WITH LOOP +-A74E ; Lu # LATIN CAPITAL LETTER OO +-A750 ; Lu # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER +-A752 ; Lu # LATIN CAPITAL LETTER P WITH FLOURISH +-A754 ; Lu # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL +-A756 ; Lu # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER +-A758 ; Lu # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE +-A75A ; Lu # LATIN CAPITAL LETTER R ROTUNDA +-A75C ; Lu # LATIN CAPITAL LETTER RUM ROTUNDA +-A75E ; Lu # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE +-A760 ; Lu # LATIN CAPITAL LETTER VY +-A762 ; Lu # LATIN CAPITAL LETTER VISIGOTHIC Z +-A764 ; Lu # LATIN CAPITAL LETTER THORN WITH STROKE +-A766 ; Lu # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER +-A768 ; Lu # LATIN CAPITAL LETTER VEND +-A76A ; Lu # LATIN CAPITAL LETTER ET +-A76C ; Lu # LATIN CAPITAL LETTER IS +-A76E ; Lu # LATIN CAPITAL LETTER CON +-A779 ; Lu # LATIN CAPITAL LETTER INSULAR D +-A77B ; Lu # LATIN CAPITAL LETTER INSULAR F +-A77D..A77E ; Lu # [2] LATIN CAPITAL LETTER INSULAR G..LATIN CAPITAL LETTER TURNED INSULAR G +-A780 ; Lu # LATIN CAPITAL LETTER TURNED L +-A782 ; Lu # LATIN CAPITAL LETTER INSULAR R +-A784 ; Lu # LATIN CAPITAL LETTER INSULAR S +-A786 ; Lu # LATIN CAPITAL LETTER INSULAR T +-A78B ; Lu # LATIN CAPITAL LETTER SALTILLO +-A78D ; Lu # LATIN CAPITAL LETTER TURNED H +-A790 ; Lu # LATIN CAPITAL LETTER N WITH DESCENDER +-A792 ; Lu # LATIN CAPITAL LETTER C WITH BAR +-A796 ; Lu # LATIN CAPITAL LETTER B WITH FLOURISH +-A798 ; Lu # LATIN CAPITAL LETTER F WITH STROKE +-A79A ; Lu # LATIN CAPITAL LETTER VOLAPUK AE +-A79C ; Lu # LATIN CAPITAL LETTER VOLAPUK OE +-A79E ; Lu # LATIN CAPITAL LETTER VOLAPUK UE +-A7A0 ; Lu # LATIN CAPITAL LETTER G WITH OBLIQUE STROKE +-A7A2 ; Lu # LATIN CAPITAL LETTER K WITH OBLIQUE STROKE +-A7A4 ; Lu # LATIN CAPITAL LETTER N WITH OBLIQUE STROKE +-A7A6 ; Lu # LATIN CAPITAL LETTER R WITH OBLIQUE STROKE +-A7A8 ; Lu # LATIN CAPITAL LETTER S WITH OBLIQUE STROKE +-A7AA..A7AE ; Lu # [5] LATIN CAPITAL LETTER H WITH HOOK..LATIN CAPITAL LETTER SMALL CAPITAL I +-A7B0..A7B4 ; Lu # [5] LATIN CAPITAL LETTER TURNED K..LATIN CAPITAL LETTER BETA +-A7B6 ; Lu # LATIN CAPITAL LETTER OMEGA +-A7B8 ; Lu # LATIN CAPITAL LETTER U WITH STROKE +-A7BA ; Lu # LATIN CAPITAL LETTER GLOTTAL A +-A7BC ; Lu # LATIN CAPITAL LETTER GLOTTAL I +-A7BE ; Lu # LATIN CAPITAL LETTER GLOTTAL U +-A7C2 ; Lu # LATIN CAPITAL LETTER ANGLICANA W +-A7C4..A7C7 ; Lu # [4] LATIN CAPITAL LETTER C WITH PALATAL HOOK..LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY +-A7C9 ; Lu # LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY +-A7F5 ; Lu # LATIN CAPITAL LETTER REVERSED HALF H +-FF21..FF3A ; Lu # [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +-10400..10427 ; Lu # [40] DESERET CAPITAL LETTER LONG I..DESERET CAPITAL LETTER EW +-104B0..104D3 ; Lu # [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +-10C80..10CB2 ; Lu # [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US +-118A0..118BF ; Lu # [32] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI CAPITAL LETTER VIYO +-16E40..16E5F ; Lu # [32] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN CAPITAL LETTER Y +-1D400..1D419 ; Lu # [26] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL BOLD CAPITAL Z +-1D434..1D44D ; Lu # [26] MATHEMATICAL ITALIC CAPITAL A..MATHEMATICAL ITALIC CAPITAL Z +-1D468..1D481 ; Lu # [26] MATHEMATICAL BOLD ITALIC CAPITAL A..MATHEMATICAL BOLD ITALIC CAPITAL Z +-1D49C ; Lu # MATHEMATICAL SCRIPT CAPITAL A +-1D49E..1D49F ; Lu # [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +-1D4A2 ; Lu # MATHEMATICAL SCRIPT CAPITAL G +-1D4A5..1D4A6 ; Lu # [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +-1D4A9..1D4AC ; Lu # [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +-1D4AE..1D4B5 ; Lu # [8] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT CAPITAL Z +-1D4D0..1D4E9 ; Lu # [26] MATHEMATICAL BOLD SCRIPT CAPITAL A..MATHEMATICAL BOLD SCRIPT CAPITAL Z +-1D504..1D505 ; Lu # [2] MATHEMATICAL FRAKTUR CAPITAL A..MATHEMATICAL FRAKTUR CAPITAL B +-1D507..1D50A ; Lu # [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +-1D50D..1D514 ; Lu # [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +-1D516..1D51C ; Lu # [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +-1D538..1D539 ; Lu # [2] MATHEMATICAL DOUBLE-STRUCK CAPITAL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +-1D53B..1D53E ; Lu # [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +-1D540..1D544 ; Lu # [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +-1D546 ; Lu # MATHEMATICAL DOUBLE-STRUCK CAPITAL O +-1D54A..1D550 ; Lu # [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +-1D56C..1D585 ; Lu # [26] MATHEMATICAL BOLD FRAKTUR CAPITAL A..MATHEMATICAL BOLD FRAKTUR CAPITAL Z +-1D5A0..1D5B9 ; Lu # [26] MATHEMATICAL SANS-SERIF CAPITAL A..MATHEMATICAL SANS-SERIF CAPITAL Z +-1D5D4..1D5ED ; Lu # [26] MATHEMATICAL SANS-SERIF BOLD CAPITAL A..MATHEMATICAL SANS-SERIF BOLD CAPITAL Z +-1D608..1D621 ; Lu # [26] MATHEMATICAL SANS-SERIF ITALIC CAPITAL A..MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z +-1D63C..1D655 ; Lu # [26] MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z +-1D670..1D689 ; Lu # [26] MATHEMATICAL MONOSPACE CAPITAL A..MATHEMATICAL MONOSPACE CAPITAL Z +-1D6A8..1D6C0 ; Lu # [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +-1D6E2..1D6FA ; Lu # [25] MATHEMATICAL ITALIC CAPITAL ALPHA..MATHEMATICAL ITALIC CAPITAL OMEGA +-1D71C..1D734 ; Lu # [25] MATHEMATICAL BOLD ITALIC CAPITAL ALPHA..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +-1D756..1D76E ; Lu # [25] MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +-1D790..1D7A8 ; Lu # [25] MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +-1D7CA ; Lu # MATHEMATICAL BOLD CAPITAL DIGAMMA +-1E900..1E921 ; Lu # [34] ADLAM CAPITAL LETTER ALIF..ADLAM CAPITAL LETTER SHA +- +-# Total code points: 1791 +- +-# ================================================ +- +-# General_Category=Lowercase_Letter +- +-0061..007A ; Ll # [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +-00B5 ; Ll # MICRO SIGN +-00DF..00F6 ; Ll # [24] LATIN SMALL LETTER SHARP S..LATIN SMALL LETTER O WITH DIAERESIS +-00F8..00FF ; Ll # [8] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER Y WITH DIAERESIS +-0101 ; Ll # LATIN SMALL LETTER A WITH MACRON +-0103 ; Ll # LATIN SMALL LETTER A WITH BREVE +-0105 ; Ll # LATIN SMALL LETTER A WITH OGONEK +-0107 ; Ll # LATIN SMALL LETTER C WITH ACUTE +-0109 ; Ll # LATIN SMALL LETTER C WITH CIRCUMFLEX +-010B ; Ll # LATIN SMALL LETTER C WITH DOT ABOVE +-010D ; Ll # LATIN SMALL LETTER C WITH CARON +-010F ; Ll # LATIN SMALL LETTER D WITH CARON +-0111 ; Ll # LATIN SMALL LETTER D WITH STROKE +-0113 ; Ll # LATIN SMALL LETTER E WITH MACRON +-0115 ; Ll # LATIN SMALL LETTER E WITH BREVE +-0117 ; Ll # LATIN SMALL LETTER E WITH DOT ABOVE +-0119 ; Ll # LATIN SMALL LETTER E WITH OGONEK +-011B ; Ll # LATIN SMALL LETTER E WITH CARON +-011D ; Ll # LATIN SMALL LETTER G WITH CIRCUMFLEX +-011F ; Ll # LATIN SMALL LETTER G WITH BREVE +-0121 ; Ll # LATIN SMALL LETTER G WITH DOT ABOVE +-0123 ; Ll # LATIN SMALL LETTER G WITH CEDILLA +-0125 ; Ll # LATIN SMALL LETTER H WITH CIRCUMFLEX +-0127 ; Ll # LATIN SMALL LETTER H WITH STROKE +-0129 ; Ll # LATIN SMALL LETTER I WITH TILDE +-012B ; Ll # LATIN SMALL LETTER I WITH MACRON +-012D ; Ll # LATIN SMALL LETTER I WITH BREVE +-012F ; Ll # LATIN SMALL LETTER I WITH OGONEK +-0131 ; Ll # LATIN SMALL LETTER DOTLESS I +-0133 ; Ll # LATIN SMALL LIGATURE IJ +-0135 ; Ll # LATIN SMALL LETTER J WITH CIRCUMFLEX +-0137..0138 ; Ll # [2] LATIN SMALL LETTER K WITH CEDILLA..LATIN SMALL LETTER KRA +-013A ; Ll # LATIN SMALL LETTER L WITH ACUTE +-013C ; Ll # LATIN SMALL LETTER L WITH CEDILLA +-013E ; Ll # LATIN SMALL LETTER L WITH CARON +-0140 ; Ll # LATIN SMALL LETTER L WITH MIDDLE DOT +-0142 ; Ll # LATIN SMALL LETTER L WITH STROKE +-0144 ; Ll # LATIN SMALL LETTER N WITH ACUTE +-0146 ; Ll # LATIN SMALL LETTER N WITH CEDILLA +-0148..0149 ; Ll # [2] LATIN SMALL LETTER N WITH CARON..LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +-014B ; Ll # LATIN SMALL LETTER ENG +-014D ; Ll # LATIN SMALL LETTER O WITH MACRON +-014F ; Ll # LATIN SMALL LETTER O WITH BREVE +-0151 ; Ll # LATIN SMALL LETTER O WITH DOUBLE ACUTE +-0153 ; Ll # LATIN SMALL LIGATURE OE +-0155 ; Ll # LATIN SMALL LETTER R WITH ACUTE +-0157 ; Ll # LATIN SMALL LETTER R WITH CEDILLA +-0159 ; Ll # LATIN SMALL LETTER R WITH CARON +-015B ; Ll # LATIN SMALL LETTER S WITH ACUTE +-015D ; Ll # LATIN SMALL LETTER S WITH CIRCUMFLEX +-015F ; Ll # LATIN SMALL LETTER S WITH CEDILLA +-0161 ; Ll # LATIN SMALL LETTER S WITH CARON +-0163 ; Ll # LATIN SMALL LETTER T WITH CEDILLA +-0165 ; Ll # LATIN SMALL LETTER T WITH CARON +-0167 ; Ll # LATIN SMALL LETTER T WITH STROKE +-0169 ; Ll # LATIN SMALL LETTER U WITH TILDE +-016B ; Ll # LATIN SMALL LETTER U WITH MACRON +-016D ; Ll # LATIN SMALL LETTER U WITH BREVE +-016F ; Ll # LATIN SMALL LETTER U WITH RING ABOVE +-0171 ; Ll # LATIN SMALL LETTER U WITH DOUBLE ACUTE +-0173 ; Ll # LATIN SMALL LETTER U WITH OGONEK +-0175 ; Ll # LATIN SMALL LETTER W WITH CIRCUMFLEX +-0177 ; Ll # LATIN SMALL LETTER Y WITH CIRCUMFLEX +-017A ; Ll # LATIN SMALL LETTER Z WITH ACUTE +-017C ; Ll # LATIN SMALL LETTER Z WITH DOT ABOVE +-017E..0180 ; Ll # [3] LATIN SMALL LETTER Z WITH CARON..LATIN SMALL LETTER B WITH STROKE +-0183 ; Ll # LATIN SMALL LETTER B WITH TOPBAR +-0185 ; Ll # LATIN SMALL LETTER TONE SIX +-0188 ; Ll # LATIN SMALL LETTER C WITH HOOK +-018C..018D ; Ll # [2] LATIN SMALL LETTER D WITH TOPBAR..LATIN SMALL LETTER TURNED DELTA +-0192 ; Ll # LATIN SMALL LETTER F WITH HOOK +-0195 ; Ll # LATIN SMALL LETTER HV +-0199..019B ; Ll # [3] LATIN SMALL LETTER K WITH HOOK..LATIN SMALL LETTER LAMBDA WITH STROKE +-019E ; Ll # LATIN SMALL LETTER N WITH LONG RIGHT LEG +-01A1 ; Ll # LATIN SMALL LETTER O WITH HORN +-01A3 ; Ll # LATIN SMALL LETTER OI +-01A5 ; Ll # LATIN SMALL LETTER P WITH HOOK +-01A8 ; Ll # LATIN SMALL LETTER TONE TWO +-01AA..01AB ; Ll # [2] LATIN LETTER REVERSED ESH LOOP..LATIN SMALL LETTER T WITH PALATAL HOOK +-01AD ; Ll # LATIN SMALL LETTER T WITH HOOK +-01B0 ; Ll # LATIN SMALL LETTER U WITH HORN +-01B4 ; Ll # LATIN SMALL LETTER Y WITH HOOK +-01B6 ; Ll # LATIN SMALL LETTER Z WITH STROKE +-01B9..01BA ; Ll # [2] LATIN SMALL LETTER EZH REVERSED..LATIN SMALL LETTER EZH WITH TAIL +-01BD..01BF ; Ll # [3] LATIN SMALL LETTER TONE FIVE..LATIN LETTER WYNN +-01C6 ; Ll # LATIN SMALL LETTER DZ WITH CARON +-01C9 ; Ll # LATIN SMALL LETTER LJ +-01CC ; Ll # LATIN SMALL LETTER NJ +-01CE ; Ll # LATIN SMALL LETTER A WITH CARON +-01D0 ; Ll # LATIN SMALL LETTER I WITH CARON +-01D2 ; Ll # LATIN SMALL LETTER O WITH CARON +-01D4 ; Ll # LATIN SMALL LETTER U WITH CARON +-01D6 ; Ll # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +-01D8 ; Ll # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +-01DA ; Ll # LATIN SMALL LETTER U WITH DIAERESIS AND CARON +-01DC..01DD ; Ll # [2] LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE..LATIN SMALL LETTER TURNED E +-01DF ; Ll # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON +-01E1 ; Ll # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON +-01E3 ; Ll # LATIN SMALL LETTER AE WITH MACRON +-01E5 ; Ll # LATIN SMALL LETTER G WITH STROKE +-01E7 ; Ll # LATIN SMALL LETTER G WITH CARON +-01E9 ; Ll # LATIN SMALL LETTER K WITH CARON +-01EB ; Ll # LATIN SMALL LETTER O WITH OGONEK +-01ED ; Ll # LATIN SMALL LETTER O WITH OGONEK AND MACRON +-01EF..01F0 ; Ll # [2] LATIN SMALL LETTER EZH WITH CARON..LATIN SMALL LETTER J WITH CARON +-01F3 ; Ll # LATIN SMALL LETTER DZ +-01F5 ; Ll # LATIN SMALL LETTER G WITH ACUTE +-01F9 ; Ll # LATIN SMALL LETTER N WITH GRAVE +-01FB ; Ll # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE +-01FD ; Ll # LATIN SMALL LETTER AE WITH ACUTE +-01FF ; Ll # LATIN SMALL LETTER O WITH STROKE AND ACUTE +-0201 ; Ll # LATIN SMALL LETTER A WITH DOUBLE GRAVE +-0203 ; Ll # LATIN SMALL LETTER A WITH INVERTED BREVE +-0205 ; Ll # LATIN SMALL LETTER E WITH DOUBLE GRAVE +-0207 ; Ll # LATIN SMALL LETTER E WITH INVERTED BREVE +-0209 ; Ll # LATIN SMALL LETTER I WITH DOUBLE GRAVE +-020B ; Ll # LATIN SMALL LETTER I WITH INVERTED BREVE +-020D ; Ll # LATIN SMALL LETTER O WITH DOUBLE GRAVE +-020F ; Ll # LATIN SMALL LETTER O WITH INVERTED BREVE +-0211 ; Ll # LATIN SMALL LETTER R WITH DOUBLE GRAVE +-0213 ; Ll # LATIN SMALL LETTER R WITH INVERTED BREVE +-0215 ; Ll # LATIN SMALL LETTER U WITH DOUBLE GRAVE +-0217 ; Ll # LATIN SMALL LETTER U WITH INVERTED BREVE +-0219 ; Ll # LATIN SMALL LETTER S WITH COMMA BELOW +-021B ; Ll # LATIN SMALL LETTER T WITH COMMA BELOW +-021D ; Ll # LATIN SMALL LETTER YOGH +-021F ; Ll # LATIN SMALL LETTER H WITH CARON +-0221 ; Ll # LATIN SMALL LETTER D WITH CURL +-0223 ; Ll # LATIN SMALL LETTER OU +-0225 ; Ll # LATIN SMALL LETTER Z WITH HOOK +-0227 ; Ll # LATIN SMALL LETTER A WITH DOT ABOVE +-0229 ; Ll # LATIN SMALL LETTER E WITH CEDILLA +-022B ; Ll # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON +-022D ; Ll # LATIN SMALL LETTER O WITH TILDE AND MACRON +-022F ; Ll # LATIN SMALL LETTER O WITH DOT ABOVE +-0231 ; Ll # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON +-0233..0239 ; Ll # [7] LATIN SMALL LETTER Y WITH MACRON..LATIN SMALL LETTER QP DIGRAPH +-023C ; Ll # LATIN SMALL LETTER C WITH STROKE +-023F..0240 ; Ll # [2] LATIN SMALL LETTER S WITH SWASH TAIL..LATIN SMALL LETTER Z WITH SWASH TAIL +-0242 ; Ll # LATIN SMALL LETTER GLOTTAL STOP +-0247 ; Ll # LATIN SMALL LETTER E WITH STROKE +-0249 ; Ll # LATIN SMALL LETTER J WITH STROKE +-024B ; Ll # LATIN SMALL LETTER Q WITH HOOK TAIL +-024D ; Ll # LATIN SMALL LETTER R WITH STROKE +-024F..0293 ; Ll # [69] LATIN SMALL LETTER Y WITH STROKE..LATIN SMALL LETTER EZH WITH CURL +-0295..02AF ; Ll # [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +-0371 ; Ll # GREEK SMALL LETTER HETA +-0373 ; Ll # GREEK SMALL LETTER ARCHAIC SAMPI +-0377 ; Ll # GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +-037B..037D ; Ll # [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +-0390 ; Ll # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +-03AC..03CE ; Ll # [35] GREEK SMALL LETTER ALPHA WITH TONOS..GREEK SMALL LETTER OMEGA WITH TONOS +-03D0..03D1 ; Ll # [2] GREEK BETA SYMBOL..GREEK THETA SYMBOL +-03D5..03D7 ; Ll # [3] GREEK PHI SYMBOL..GREEK KAI SYMBOL +-03D9 ; Ll # GREEK SMALL LETTER ARCHAIC KOPPA +-03DB ; Ll # GREEK SMALL LETTER STIGMA +-03DD ; Ll # GREEK SMALL LETTER DIGAMMA +-03DF ; Ll # GREEK SMALL LETTER KOPPA +-03E1 ; Ll # GREEK SMALL LETTER SAMPI +-03E3 ; Ll # COPTIC SMALL LETTER SHEI +-03E5 ; Ll # COPTIC SMALL LETTER FEI +-03E7 ; Ll # COPTIC SMALL LETTER KHEI +-03E9 ; Ll # COPTIC SMALL LETTER HORI +-03EB ; Ll # COPTIC SMALL LETTER GANGIA +-03ED ; Ll # COPTIC SMALL LETTER SHIMA +-03EF..03F3 ; Ll # [5] COPTIC SMALL LETTER DEI..GREEK LETTER YOT +-03F5 ; Ll # GREEK LUNATE EPSILON SYMBOL +-03F8 ; Ll # GREEK SMALL LETTER SHO +-03FB..03FC ; Ll # [2] GREEK SMALL LETTER SAN..GREEK RHO WITH STROKE SYMBOL +-0430..045F ; Ll # [48] CYRILLIC SMALL LETTER A..CYRILLIC SMALL LETTER DZHE +-0461 ; Ll # CYRILLIC SMALL LETTER OMEGA +-0463 ; Ll # CYRILLIC SMALL LETTER YAT +-0465 ; Ll # CYRILLIC SMALL LETTER IOTIFIED E +-0467 ; Ll # CYRILLIC SMALL LETTER LITTLE YUS +-0469 ; Ll # CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS +-046B ; Ll # CYRILLIC SMALL LETTER BIG YUS +-046D ; Ll # CYRILLIC SMALL LETTER IOTIFIED BIG YUS +-046F ; Ll # CYRILLIC SMALL LETTER KSI +-0471 ; Ll # CYRILLIC SMALL LETTER PSI +-0473 ; Ll # CYRILLIC SMALL LETTER FITA +-0475 ; Ll # CYRILLIC SMALL LETTER IZHITSA +-0477 ; Ll # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +-0479 ; Ll # CYRILLIC SMALL LETTER UK +-047B ; Ll # CYRILLIC SMALL LETTER ROUND OMEGA +-047D ; Ll # CYRILLIC SMALL LETTER OMEGA WITH TITLO +-047F ; Ll # CYRILLIC SMALL LETTER OT +-0481 ; Ll # CYRILLIC SMALL LETTER KOPPA +-048B ; Ll # CYRILLIC SMALL LETTER SHORT I WITH TAIL +-048D ; Ll # CYRILLIC SMALL LETTER SEMISOFT SIGN +-048F ; Ll # CYRILLIC SMALL LETTER ER WITH TICK +-0491 ; Ll # CYRILLIC SMALL LETTER GHE WITH UPTURN +-0493 ; Ll # CYRILLIC SMALL LETTER GHE WITH STROKE +-0495 ; Ll # CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK +-0497 ; Ll # CYRILLIC SMALL LETTER ZHE WITH DESCENDER +-0499 ; Ll # CYRILLIC SMALL LETTER ZE WITH DESCENDER +-049B ; Ll # CYRILLIC SMALL LETTER KA WITH DESCENDER +-049D ; Ll # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE +-049F ; Ll # CYRILLIC SMALL LETTER KA WITH STROKE +-04A1 ; Ll # CYRILLIC SMALL LETTER BASHKIR KA +-04A3 ; Ll # CYRILLIC SMALL LETTER EN WITH DESCENDER +-04A5 ; Ll # CYRILLIC SMALL LIGATURE EN GHE +-04A7 ; Ll # CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK +-04A9 ; Ll # CYRILLIC SMALL LETTER ABKHASIAN HA +-04AB ; Ll # CYRILLIC SMALL LETTER ES WITH DESCENDER +-04AD ; Ll # CYRILLIC SMALL LETTER TE WITH DESCENDER +-04AF ; Ll # CYRILLIC SMALL LETTER STRAIGHT U +-04B1 ; Ll # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE +-04B3 ; Ll # CYRILLIC SMALL LETTER HA WITH DESCENDER +-04B5 ; Ll # CYRILLIC SMALL LIGATURE TE TSE +-04B7 ; Ll # CYRILLIC SMALL LETTER CHE WITH DESCENDER +-04B9 ; Ll # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE +-04BB ; Ll # CYRILLIC SMALL LETTER SHHA +-04BD ; Ll # CYRILLIC SMALL LETTER ABKHASIAN CHE +-04BF ; Ll # CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER +-04C2 ; Ll # CYRILLIC SMALL LETTER ZHE WITH BREVE +-04C4 ; Ll # CYRILLIC SMALL LETTER KA WITH HOOK +-04C6 ; Ll # CYRILLIC SMALL LETTER EL WITH TAIL +-04C8 ; Ll # CYRILLIC SMALL LETTER EN WITH HOOK +-04CA ; Ll # CYRILLIC SMALL LETTER EN WITH TAIL +-04CC ; Ll # CYRILLIC SMALL LETTER KHAKASSIAN CHE +-04CE..04CF ; Ll # [2] CYRILLIC SMALL LETTER EM WITH TAIL..CYRILLIC SMALL LETTER PALOCHKA +-04D1 ; Ll # CYRILLIC SMALL LETTER A WITH BREVE +-04D3 ; Ll # CYRILLIC SMALL LETTER A WITH DIAERESIS +-04D5 ; Ll # CYRILLIC SMALL LIGATURE A IE +-04D7 ; Ll # CYRILLIC SMALL LETTER IE WITH BREVE +-04D9 ; Ll # CYRILLIC SMALL LETTER SCHWA +-04DB ; Ll # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS +-04DD ; Ll # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS +-04DF ; Ll # CYRILLIC SMALL LETTER ZE WITH DIAERESIS +-04E1 ; Ll # CYRILLIC SMALL LETTER ABKHASIAN DZE +-04E3 ; Ll # CYRILLIC SMALL LETTER I WITH MACRON +-04E5 ; Ll # CYRILLIC SMALL LETTER I WITH DIAERESIS +-04E7 ; Ll # CYRILLIC SMALL LETTER O WITH DIAERESIS +-04E9 ; Ll # CYRILLIC SMALL LETTER BARRED O +-04EB ; Ll # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS +-04ED ; Ll # CYRILLIC SMALL LETTER E WITH DIAERESIS +-04EF ; Ll # CYRILLIC SMALL LETTER U WITH MACRON +-04F1 ; Ll # CYRILLIC SMALL LETTER U WITH DIAERESIS +-04F3 ; Ll # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE +-04F5 ; Ll # CYRILLIC SMALL LETTER CHE WITH DIAERESIS +-04F7 ; Ll # CYRILLIC SMALL LETTER GHE WITH DESCENDER +-04F9 ; Ll # CYRILLIC SMALL LETTER YERU WITH DIAERESIS +-04FB ; Ll # CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK +-04FD ; Ll # CYRILLIC SMALL LETTER HA WITH HOOK +-04FF ; Ll # CYRILLIC SMALL LETTER HA WITH STROKE +-0501 ; Ll # CYRILLIC SMALL LETTER KOMI DE +-0503 ; Ll # CYRILLIC SMALL LETTER KOMI DJE +-0505 ; Ll # CYRILLIC SMALL LETTER KOMI ZJE +-0507 ; Ll # CYRILLIC SMALL LETTER KOMI DZJE +-0509 ; Ll # CYRILLIC SMALL LETTER KOMI LJE +-050B ; Ll # CYRILLIC SMALL LETTER KOMI NJE +-050D ; Ll # CYRILLIC SMALL LETTER KOMI SJE +-050F ; Ll # CYRILLIC SMALL LETTER KOMI TJE +-0511 ; Ll # CYRILLIC SMALL LETTER REVERSED ZE +-0513 ; Ll # CYRILLIC SMALL LETTER EL WITH HOOK +-0515 ; Ll # CYRILLIC SMALL LETTER LHA +-0517 ; Ll # CYRILLIC SMALL LETTER RHA +-0519 ; Ll # CYRILLIC SMALL LETTER YAE +-051B ; Ll # CYRILLIC SMALL LETTER QA +-051D ; Ll # CYRILLIC SMALL LETTER WE +-051F ; Ll # CYRILLIC SMALL LETTER ALEUT KA +-0521 ; Ll # CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK +-0523 ; Ll # CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK +-0525 ; Ll # CYRILLIC SMALL LETTER PE WITH DESCENDER +-0527 ; Ll # CYRILLIC SMALL LETTER SHHA WITH DESCENDER +-0529 ; Ll # CYRILLIC SMALL LETTER EN WITH LEFT HOOK +-052B ; Ll # CYRILLIC SMALL LETTER DZZHE +-052D ; Ll # CYRILLIC SMALL LETTER DCHE +-052F ; Ll # CYRILLIC SMALL LETTER EL WITH DESCENDER +-0560..0588 ; Ll # [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +-10D0..10FA ; Ll # [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +-10FD..10FF ; Ll # [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN +-13F8..13FD ; Ll # [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +-1C80..1C88 ; Ll # [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK +-1D00..1D2B ; Ll # [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL +-1D6B..1D77 ; Ll # [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G +-1D79..1D9A ; Ll # [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +-1E01 ; Ll # LATIN SMALL LETTER A WITH RING BELOW +-1E03 ; Ll # LATIN SMALL LETTER B WITH DOT ABOVE +-1E05 ; Ll # LATIN SMALL LETTER B WITH DOT BELOW +-1E07 ; Ll # LATIN SMALL LETTER B WITH LINE BELOW +-1E09 ; Ll # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE +-1E0B ; Ll # LATIN SMALL LETTER D WITH DOT ABOVE +-1E0D ; Ll # LATIN SMALL LETTER D WITH DOT BELOW +-1E0F ; Ll # LATIN SMALL LETTER D WITH LINE BELOW +-1E11 ; Ll # LATIN SMALL LETTER D WITH CEDILLA +-1E13 ; Ll # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW +-1E15 ; Ll # LATIN SMALL LETTER E WITH MACRON AND GRAVE +-1E17 ; Ll # LATIN SMALL LETTER E WITH MACRON AND ACUTE +-1E19 ; Ll # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW +-1E1B ; Ll # LATIN SMALL LETTER E WITH TILDE BELOW +-1E1D ; Ll # LATIN SMALL LETTER E WITH CEDILLA AND BREVE +-1E1F ; Ll # LATIN SMALL LETTER F WITH DOT ABOVE +-1E21 ; Ll # LATIN SMALL LETTER G WITH MACRON +-1E23 ; Ll # LATIN SMALL LETTER H WITH DOT ABOVE +-1E25 ; Ll # LATIN SMALL LETTER H WITH DOT BELOW +-1E27 ; Ll # LATIN SMALL LETTER H WITH DIAERESIS +-1E29 ; Ll # LATIN SMALL LETTER H WITH CEDILLA +-1E2B ; Ll # LATIN SMALL LETTER H WITH BREVE BELOW +-1E2D ; Ll # LATIN SMALL LETTER I WITH TILDE BELOW +-1E2F ; Ll # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE +-1E31 ; Ll # LATIN SMALL LETTER K WITH ACUTE +-1E33 ; Ll # LATIN SMALL LETTER K WITH DOT BELOW +-1E35 ; Ll # LATIN SMALL LETTER K WITH LINE BELOW +-1E37 ; Ll # LATIN SMALL LETTER L WITH DOT BELOW +-1E39 ; Ll # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON +-1E3B ; Ll # LATIN SMALL LETTER L WITH LINE BELOW +-1E3D ; Ll # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW +-1E3F ; Ll # LATIN SMALL LETTER M WITH ACUTE +-1E41 ; Ll # LATIN SMALL LETTER M WITH DOT ABOVE +-1E43 ; Ll # LATIN SMALL LETTER M WITH DOT BELOW +-1E45 ; Ll # LATIN SMALL LETTER N WITH DOT ABOVE +-1E47 ; Ll # LATIN SMALL LETTER N WITH DOT BELOW +-1E49 ; Ll # LATIN SMALL LETTER N WITH LINE BELOW +-1E4B ; Ll # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW +-1E4D ; Ll # LATIN SMALL LETTER O WITH TILDE AND ACUTE +-1E4F ; Ll # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS +-1E51 ; Ll # LATIN SMALL LETTER O WITH MACRON AND GRAVE +-1E53 ; Ll # LATIN SMALL LETTER O WITH MACRON AND ACUTE +-1E55 ; Ll # LATIN SMALL LETTER P WITH ACUTE +-1E57 ; Ll # LATIN SMALL LETTER P WITH DOT ABOVE +-1E59 ; Ll # LATIN SMALL LETTER R WITH DOT ABOVE +-1E5B ; Ll # LATIN SMALL LETTER R WITH DOT BELOW +-1E5D ; Ll # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON +-1E5F ; Ll # LATIN SMALL LETTER R WITH LINE BELOW +-1E61 ; Ll # LATIN SMALL LETTER S WITH DOT ABOVE +-1E63 ; Ll # LATIN SMALL LETTER S WITH DOT BELOW +-1E65 ; Ll # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE +-1E67 ; Ll # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE +-1E69 ; Ll # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE +-1E6B ; Ll # LATIN SMALL LETTER T WITH DOT ABOVE +-1E6D ; Ll # LATIN SMALL LETTER T WITH DOT BELOW +-1E6F ; Ll # LATIN SMALL LETTER T WITH LINE BELOW +-1E71 ; Ll # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW +-1E73 ; Ll # LATIN SMALL LETTER U WITH DIAERESIS BELOW +-1E75 ; Ll # LATIN SMALL LETTER U WITH TILDE BELOW +-1E77 ; Ll # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW +-1E79 ; Ll # LATIN SMALL LETTER U WITH TILDE AND ACUTE +-1E7B ; Ll # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS +-1E7D ; Ll # LATIN SMALL LETTER V WITH TILDE +-1E7F ; Ll # LATIN SMALL LETTER V WITH DOT BELOW +-1E81 ; Ll # LATIN SMALL LETTER W WITH GRAVE +-1E83 ; Ll # LATIN SMALL LETTER W WITH ACUTE +-1E85 ; Ll # LATIN SMALL LETTER W WITH DIAERESIS +-1E87 ; Ll # LATIN SMALL LETTER W WITH DOT ABOVE +-1E89 ; Ll # LATIN SMALL LETTER W WITH DOT BELOW +-1E8B ; Ll # LATIN SMALL LETTER X WITH DOT ABOVE +-1E8D ; Ll # LATIN SMALL LETTER X WITH DIAERESIS +-1E8F ; Ll # LATIN SMALL LETTER Y WITH DOT ABOVE +-1E91 ; Ll # LATIN SMALL LETTER Z WITH CIRCUMFLEX +-1E93 ; Ll # LATIN SMALL LETTER Z WITH DOT BELOW +-1E95..1E9D ; Ll # [9] LATIN SMALL LETTER Z WITH LINE BELOW..LATIN SMALL LETTER LONG S WITH HIGH STROKE +-1E9F ; Ll # LATIN SMALL LETTER DELTA +-1EA1 ; Ll # LATIN SMALL LETTER A WITH DOT BELOW +-1EA3 ; Ll # LATIN SMALL LETTER A WITH HOOK ABOVE +-1EA5 ; Ll # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE +-1EA7 ; Ll # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE +-1EA9 ; Ll # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +-1EAB ; Ll # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE +-1EAD ; Ll # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW +-1EAF ; Ll # LATIN SMALL LETTER A WITH BREVE AND ACUTE +-1EB1 ; Ll # LATIN SMALL LETTER A WITH BREVE AND GRAVE +-1EB3 ; Ll # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE +-1EB5 ; Ll # LATIN SMALL LETTER A WITH BREVE AND TILDE +-1EB7 ; Ll # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW +-1EB9 ; Ll # LATIN SMALL LETTER E WITH DOT BELOW +-1EBB ; Ll # LATIN SMALL LETTER E WITH HOOK ABOVE +-1EBD ; Ll # LATIN SMALL LETTER E WITH TILDE +-1EBF ; Ll # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE +-1EC1 ; Ll # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE +-1EC3 ; Ll # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +-1EC5 ; Ll # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE +-1EC7 ; Ll # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW +-1EC9 ; Ll # LATIN SMALL LETTER I WITH HOOK ABOVE +-1ECB ; Ll # LATIN SMALL LETTER I WITH DOT BELOW +-1ECD ; Ll # LATIN SMALL LETTER O WITH DOT BELOW +-1ECF ; Ll # LATIN SMALL LETTER O WITH HOOK ABOVE +-1ED1 ; Ll # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE +-1ED3 ; Ll # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE +-1ED5 ; Ll # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +-1ED7 ; Ll # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE +-1ED9 ; Ll # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW +-1EDB ; Ll # LATIN SMALL LETTER O WITH HORN AND ACUTE +-1EDD ; Ll # LATIN SMALL LETTER O WITH HORN AND GRAVE +-1EDF ; Ll # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE +-1EE1 ; Ll # LATIN SMALL LETTER O WITH HORN AND TILDE +-1EE3 ; Ll # LATIN SMALL LETTER O WITH HORN AND DOT BELOW +-1EE5 ; Ll # LATIN SMALL LETTER U WITH DOT BELOW +-1EE7 ; Ll # LATIN SMALL LETTER U WITH HOOK ABOVE +-1EE9 ; Ll # LATIN SMALL LETTER U WITH HORN AND ACUTE +-1EEB ; Ll # LATIN SMALL LETTER U WITH HORN AND GRAVE +-1EED ; Ll # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE +-1EEF ; Ll # LATIN SMALL LETTER U WITH HORN AND TILDE +-1EF1 ; Ll # LATIN SMALL LETTER U WITH HORN AND DOT BELOW +-1EF3 ; Ll # LATIN SMALL LETTER Y WITH GRAVE +-1EF5 ; Ll # LATIN SMALL LETTER Y WITH DOT BELOW +-1EF7 ; Ll # LATIN SMALL LETTER Y WITH HOOK ABOVE +-1EF9 ; Ll # LATIN SMALL LETTER Y WITH TILDE +-1EFB ; Ll # LATIN SMALL LETTER MIDDLE-WELSH LL +-1EFD ; Ll # LATIN SMALL LETTER MIDDLE-WELSH V +-1EFF..1F07 ; Ll # [9] LATIN SMALL LETTER Y WITH LOOP..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI +-1F10..1F15 ; Ll # [6] GREEK SMALL LETTER EPSILON WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +-1F20..1F27 ; Ll # [8] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI +-1F30..1F37 ; Ll # [8] GREEK SMALL LETTER IOTA WITH PSILI..GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI +-1F40..1F45 ; Ll # [6] GREEK SMALL LETTER OMICRON WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +-1F50..1F57 ; Ll # [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +-1F60..1F67 ; Ll # [8] GREEK SMALL LETTER OMEGA WITH PSILI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI +-1F70..1F7D ; Ll # [14] GREEK SMALL LETTER ALPHA WITH VARIA..GREEK SMALL LETTER OMEGA WITH OXIA +-1F80..1F87 ; Ll # [8] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +-1F90..1F97 ; Ll # [8] GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +-1FA0..1FA7 ; Ll # [8] GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +-1FB0..1FB4 ; Ll # [5] GREEK SMALL LETTER ALPHA WITH VRACHY..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +-1FB6..1FB7 ; Ll # [2] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +-1FBE ; Ll # GREEK PROSGEGRAMMENI +-1FC2..1FC4 ; Ll # [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +-1FC6..1FC7 ; Ll # [2] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +-1FD0..1FD3 ; Ll # [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +-1FD6..1FD7 ; Ll # [2] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +-1FE0..1FE7 ; Ll # [8] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +-1FF2..1FF4 ; Ll # [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +-1FF6..1FF7 ; Ll # [2] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +-210A ; Ll # SCRIPT SMALL G +-210E..210F ; Ll # [2] PLANCK CONSTANT..PLANCK CONSTANT OVER TWO PI +-2113 ; Ll # SCRIPT SMALL L +-212F ; Ll # SCRIPT SMALL E +-2134 ; Ll # SCRIPT SMALL O +-2139 ; Ll # INFORMATION SOURCE +-213C..213D ; Ll # [2] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK SMALL GAMMA +-2146..2149 ; Ll # [4] DOUBLE-STRUCK ITALIC SMALL D..DOUBLE-STRUCK ITALIC SMALL J +-214E ; Ll # TURNED SMALL F +-2184 ; Ll # LATIN SMALL LETTER REVERSED C +-2C30..2C5E ; Ll # [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE +-2C61 ; Ll # LATIN SMALL LETTER L WITH DOUBLE BAR +-2C65..2C66 ; Ll # [2] LATIN SMALL LETTER A WITH STROKE..LATIN SMALL LETTER T WITH DIAGONAL STROKE +-2C68 ; Ll # LATIN SMALL LETTER H WITH DESCENDER +-2C6A ; Ll # LATIN SMALL LETTER K WITH DESCENDER +-2C6C ; Ll # LATIN SMALL LETTER Z WITH DESCENDER +-2C71 ; Ll # LATIN SMALL LETTER V WITH RIGHT HOOK +-2C73..2C74 ; Ll # [2] LATIN SMALL LETTER W WITH HOOK..LATIN SMALL LETTER V WITH CURL +-2C76..2C7B ; Ll # [6] LATIN SMALL LETTER HALF H..LATIN LETTER SMALL CAPITAL TURNED E +-2C81 ; Ll # COPTIC SMALL LETTER ALFA +-2C83 ; Ll # COPTIC SMALL LETTER VIDA +-2C85 ; Ll # COPTIC SMALL LETTER GAMMA +-2C87 ; Ll # COPTIC SMALL LETTER DALDA +-2C89 ; Ll # COPTIC SMALL LETTER EIE +-2C8B ; Ll # COPTIC SMALL LETTER SOU +-2C8D ; Ll # COPTIC SMALL LETTER ZATA +-2C8F ; Ll # COPTIC SMALL LETTER HATE +-2C91 ; Ll # COPTIC SMALL LETTER THETHE +-2C93 ; Ll # COPTIC SMALL LETTER IAUDA +-2C95 ; Ll # COPTIC SMALL LETTER KAPA +-2C97 ; Ll # COPTIC SMALL LETTER LAULA +-2C99 ; Ll # COPTIC SMALL LETTER MI +-2C9B ; Ll # COPTIC SMALL LETTER NI +-2C9D ; Ll # COPTIC SMALL LETTER KSI +-2C9F ; Ll # COPTIC SMALL LETTER O +-2CA1 ; Ll # COPTIC SMALL LETTER PI +-2CA3 ; Ll # COPTIC SMALL LETTER RO +-2CA5 ; Ll # COPTIC SMALL LETTER SIMA +-2CA7 ; Ll # COPTIC SMALL LETTER TAU +-2CA9 ; Ll # COPTIC SMALL LETTER UA +-2CAB ; Ll # COPTIC SMALL LETTER FI +-2CAD ; Ll # COPTIC SMALL LETTER KHI +-2CAF ; Ll # COPTIC SMALL LETTER PSI +-2CB1 ; Ll # COPTIC SMALL LETTER OOU +-2CB3 ; Ll # COPTIC SMALL LETTER DIALECT-P ALEF +-2CB5 ; Ll # COPTIC SMALL LETTER OLD COPTIC AIN +-2CB7 ; Ll # COPTIC SMALL LETTER CRYPTOGRAMMIC EIE +-2CB9 ; Ll # COPTIC SMALL LETTER DIALECT-P KAPA +-2CBB ; Ll # COPTIC SMALL LETTER DIALECT-P NI +-2CBD ; Ll # COPTIC SMALL LETTER CRYPTOGRAMMIC NI +-2CBF ; Ll # COPTIC SMALL LETTER OLD COPTIC OOU +-2CC1 ; Ll # COPTIC SMALL LETTER SAMPI +-2CC3 ; Ll # COPTIC SMALL LETTER CROSSED SHEI +-2CC5 ; Ll # COPTIC SMALL LETTER OLD COPTIC SHEI +-2CC7 ; Ll # COPTIC SMALL LETTER OLD COPTIC ESH +-2CC9 ; Ll # COPTIC SMALL LETTER AKHMIMIC KHEI +-2CCB ; Ll # COPTIC SMALL LETTER DIALECT-P HORI +-2CCD ; Ll # COPTIC SMALL LETTER OLD COPTIC HORI +-2CCF ; Ll # COPTIC SMALL LETTER OLD COPTIC HA +-2CD1 ; Ll # COPTIC SMALL LETTER L-SHAPED HA +-2CD3 ; Ll # COPTIC SMALL LETTER OLD COPTIC HEI +-2CD5 ; Ll # COPTIC SMALL LETTER OLD COPTIC HAT +-2CD7 ; Ll # COPTIC SMALL LETTER OLD COPTIC GANGIA +-2CD9 ; Ll # COPTIC SMALL LETTER OLD COPTIC DJA +-2CDB ; Ll # COPTIC SMALL LETTER OLD COPTIC SHIMA +-2CDD ; Ll # COPTIC SMALL LETTER OLD NUBIAN SHIMA +-2CDF ; Ll # COPTIC SMALL LETTER OLD NUBIAN NGI +-2CE1 ; Ll # COPTIC SMALL LETTER OLD NUBIAN NYI +-2CE3..2CE4 ; Ll # [2] COPTIC SMALL LETTER OLD NUBIAN WAU..COPTIC SYMBOL KAI +-2CEC ; Ll # COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI +-2CEE ; Ll # COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +-2CF3 ; Ll # COPTIC SMALL LETTER BOHAIRIC KHEI +-2D00..2D25 ; Ll # [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +-2D27 ; Ll # GEORGIAN SMALL LETTER YN +-2D2D ; Ll # GEORGIAN SMALL LETTER AEN +-A641 ; Ll # CYRILLIC SMALL LETTER ZEMLYA +-A643 ; Ll # CYRILLIC SMALL LETTER DZELO +-A645 ; Ll # CYRILLIC SMALL LETTER REVERSED DZE +-A647 ; Ll # CYRILLIC SMALL LETTER IOTA +-A649 ; Ll # CYRILLIC SMALL LETTER DJERV +-A64B ; Ll # CYRILLIC SMALL LETTER MONOGRAPH UK +-A64D ; Ll # CYRILLIC SMALL LETTER BROAD OMEGA +-A64F ; Ll # CYRILLIC SMALL LETTER NEUTRAL YER +-A651 ; Ll # CYRILLIC SMALL LETTER YERU WITH BACK YER +-A653 ; Ll # CYRILLIC SMALL LETTER IOTIFIED YAT +-A655 ; Ll # CYRILLIC SMALL LETTER REVERSED YU +-A657 ; Ll # CYRILLIC SMALL LETTER IOTIFIED A +-A659 ; Ll # CYRILLIC SMALL LETTER CLOSED LITTLE YUS +-A65B ; Ll # CYRILLIC SMALL LETTER BLENDED YUS +-A65D ; Ll # CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS +-A65F ; Ll # CYRILLIC SMALL LETTER YN +-A661 ; Ll # CYRILLIC SMALL LETTER REVERSED TSE +-A663 ; Ll # CYRILLIC SMALL LETTER SOFT DE +-A665 ; Ll # CYRILLIC SMALL LETTER SOFT EL +-A667 ; Ll # CYRILLIC SMALL LETTER SOFT EM +-A669 ; Ll # CYRILLIC SMALL LETTER MONOCULAR O +-A66B ; Ll # CYRILLIC SMALL LETTER BINOCULAR O +-A66D ; Ll # CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +-A681 ; Ll # CYRILLIC SMALL LETTER DWE +-A683 ; Ll # CYRILLIC SMALL LETTER DZWE +-A685 ; Ll # CYRILLIC SMALL LETTER ZHWE +-A687 ; Ll # CYRILLIC SMALL LETTER CCHE +-A689 ; Ll # CYRILLIC SMALL LETTER DZZE +-A68B ; Ll # CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK +-A68D ; Ll # CYRILLIC SMALL LETTER TWE +-A68F ; Ll # CYRILLIC SMALL LETTER TSWE +-A691 ; Ll # CYRILLIC SMALL LETTER TSSE +-A693 ; Ll # CYRILLIC SMALL LETTER TCHE +-A695 ; Ll # CYRILLIC SMALL LETTER HWE +-A697 ; Ll # CYRILLIC SMALL LETTER SHWE +-A699 ; Ll # CYRILLIC SMALL LETTER DOUBLE O +-A69B ; Ll # CYRILLIC SMALL LETTER CROSSED O +-A723 ; Ll # LATIN SMALL LETTER EGYPTOLOGICAL ALEF +-A725 ; Ll # LATIN SMALL LETTER EGYPTOLOGICAL AIN +-A727 ; Ll # LATIN SMALL LETTER HENG +-A729 ; Ll # LATIN SMALL LETTER TZ +-A72B ; Ll # LATIN SMALL LETTER TRESILLO +-A72D ; Ll # LATIN SMALL LETTER CUATRILLO +-A72F..A731 ; Ll # [3] LATIN SMALL LETTER CUATRILLO WITH COMMA..LATIN LETTER SMALL CAPITAL S +-A733 ; Ll # LATIN SMALL LETTER AA +-A735 ; Ll # LATIN SMALL LETTER AO +-A737 ; Ll # LATIN SMALL LETTER AU +-A739 ; Ll # LATIN SMALL LETTER AV +-A73B ; Ll # LATIN SMALL LETTER AV WITH HORIZONTAL BAR +-A73D ; Ll # LATIN SMALL LETTER AY +-A73F ; Ll # LATIN SMALL LETTER REVERSED C WITH DOT +-A741 ; Ll # LATIN SMALL LETTER K WITH STROKE +-A743 ; Ll # LATIN SMALL LETTER K WITH DIAGONAL STROKE +-A745 ; Ll # LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE +-A747 ; Ll # LATIN SMALL LETTER BROKEN L +-A749 ; Ll # LATIN SMALL LETTER L WITH HIGH STROKE +-A74B ; Ll # LATIN SMALL LETTER O WITH LONG STROKE OVERLAY +-A74D ; Ll # LATIN SMALL LETTER O WITH LOOP +-A74F ; Ll # LATIN SMALL LETTER OO +-A751 ; Ll # LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER +-A753 ; Ll # LATIN SMALL LETTER P WITH FLOURISH +-A755 ; Ll # LATIN SMALL LETTER P WITH SQUIRREL TAIL +-A757 ; Ll # LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER +-A759 ; Ll # LATIN SMALL LETTER Q WITH DIAGONAL STROKE +-A75B ; Ll # LATIN SMALL LETTER R ROTUNDA +-A75D ; Ll # LATIN SMALL LETTER RUM ROTUNDA +-A75F ; Ll # LATIN SMALL LETTER V WITH DIAGONAL STROKE +-A761 ; Ll # LATIN SMALL LETTER VY +-A763 ; Ll # LATIN SMALL LETTER VISIGOTHIC Z +-A765 ; Ll # LATIN SMALL LETTER THORN WITH STROKE +-A767 ; Ll # LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER +-A769 ; Ll # LATIN SMALL LETTER VEND +-A76B ; Ll # LATIN SMALL LETTER ET +-A76D ; Ll # LATIN SMALL LETTER IS +-A76F ; Ll # LATIN SMALL LETTER CON +-A771..A778 ; Ll # [8] LATIN SMALL LETTER DUM..LATIN SMALL LETTER UM +-A77A ; Ll # LATIN SMALL LETTER INSULAR D +-A77C ; Ll # LATIN SMALL LETTER INSULAR F +-A77F ; Ll # LATIN SMALL LETTER TURNED INSULAR G +-A781 ; Ll # LATIN SMALL LETTER TURNED L +-A783 ; Ll # LATIN SMALL LETTER INSULAR R +-A785 ; Ll # LATIN SMALL LETTER INSULAR S +-A787 ; Ll # LATIN SMALL LETTER INSULAR T +-A78C ; Ll # LATIN SMALL LETTER SALTILLO +-A78E ; Ll # LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT +-A791 ; Ll # LATIN SMALL LETTER N WITH DESCENDER +-A793..A795 ; Ll # [3] LATIN SMALL LETTER C WITH BAR..LATIN SMALL LETTER H WITH PALATAL HOOK +-A797 ; Ll # LATIN SMALL LETTER B WITH FLOURISH +-A799 ; Ll # LATIN SMALL LETTER F WITH STROKE +-A79B ; Ll # LATIN SMALL LETTER VOLAPUK AE +-A79D ; Ll # LATIN SMALL LETTER VOLAPUK OE +-A79F ; Ll # LATIN SMALL LETTER VOLAPUK UE +-A7A1 ; Ll # LATIN SMALL LETTER G WITH OBLIQUE STROKE +-A7A3 ; Ll # LATIN SMALL LETTER K WITH OBLIQUE STROKE +-A7A5 ; Ll # LATIN SMALL LETTER N WITH OBLIQUE STROKE +-A7A7 ; Ll # LATIN SMALL LETTER R WITH OBLIQUE STROKE +-A7A9 ; Ll # LATIN SMALL LETTER S WITH OBLIQUE STROKE +-A7AF ; Ll # LATIN LETTER SMALL CAPITAL Q +-A7B5 ; Ll # LATIN SMALL LETTER BETA +-A7B7 ; Ll # LATIN SMALL LETTER OMEGA +-A7B9 ; Ll # LATIN SMALL LETTER U WITH STROKE +-A7BB ; Ll # LATIN SMALL LETTER GLOTTAL A +-A7BD ; Ll # LATIN SMALL LETTER GLOTTAL I +-A7BF ; Ll # LATIN SMALL LETTER GLOTTAL U +-A7C3 ; Ll # LATIN SMALL LETTER ANGLICANA W +-A7C8 ; Ll # LATIN SMALL LETTER D WITH SHORT STROKE OVERLAY +-A7CA ; Ll # LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY +-A7F6 ; Ll # LATIN SMALL LETTER REVERSED HALF H +-A7FA ; Ll # LATIN LETTER SMALL CAPITAL TURNED M +-AB30..AB5A ; Ll # [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +-AB60..AB68 ; Ll # [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE +-AB70..ABBF ; Ll # [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA +-FB00..FB06 ; Ll # [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +-FB13..FB17 ; Ll # [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +-FF41..FF5A ; Ll # [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +-10428..1044F ; Ll # [40] DESERET SMALL LETTER LONG I..DESERET SMALL LETTER EW +-104D8..104FB ; Ll # [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA +-10CC0..10CF2 ; Ll # [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +-118C0..118DF ; Ll # [32] WARANG CITI SMALL LETTER NGAA..WARANG CITI SMALL LETTER VIYO +-16E60..16E7F ; Ll # [32] MEDEFAIDRIN SMALL LETTER M..MEDEFAIDRIN SMALL LETTER Y +-1D41A..1D433 ; Ll # [26] MATHEMATICAL BOLD SMALL A..MATHEMATICAL BOLD SMALL Z +-1D44E..1D454 ; Ll # [7] MATHEMATICAL ITALIC SMALL A..MATHEMATICAL ITALIC SMALL G +-1D456..1D467 ; Ll # [18] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL ITALIC SMALL Z +-1D482..1D49B ; Ll # [26] MATHEMATICAL BOLD ITALIC SMALL A..MATHEMATICAL BOLD ITALIC SMALL Z +-1D4B6..1D4B9 ; Ll # [4] MATHEMATICAL SCRIPT SMALL A..MATHEMATICAL SCRIPT SMALL D +-1D4BB ; Ll # MATHEMATICAL SCRIPT SMALL F +-1D4BD..1D4C3 ; Ll # [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +-1D4C5..1D4CF ; Ll # [11] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL SCRIPT SMALL Z +-1D4EA..1D503 ; Ll # [26] MATHEMATICAL BOLD SCRIPT SMALL A..MATHEMATICAL BOLD SCRIPT SMALL Z +-1D51E..1D537 ; Ll # [26] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL FRAKTUR SMALL Z +-1D552..1D56B ; Ll # [26] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL DOUBLE-STRUCK SMALL Z +-1D586..1D59F ; Ll # [26] MATHEMATICAL BOLD FRAKTUR SMALL A..MATHEMATICAL BOLD FRAKTUR SMALL Z +-1D5BA..1D5D3 ; Ll # [26] MATHEMATICAL SANS-SERIF SMALL A..MATHEMATICAL SANS-SERIF SMALL Z +-1D5EE..1D607 ; Ll # [26] MATHEMATICAL SANS-SERIF BOLD SMALL A..MATHEMATICAL SANS-SERIF BOLD SMALL Z +-1D622..1D63B ; Ll # [26] MATHEMATICAL SANS-SERIF ITALIC SMALL A..MATHEMATICAL SANS-SERIF ITALIC SMALL Z +-1D656..1D66F ; Ll # [26] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z +-1D68A..1D6A5 ; Ll # [28] MATHEMATICAL MONOSPACE SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +-1D6C2..1D6DA ; Ll # [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +-1D6DC..1D6E1 ; Ll # [6] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL BOLD PI SYMBOL +-1D6FC..1D714 ; Ll # [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +-1D716..1D71B ; Ll # [6] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL ITALIC PI SYMBOL +-1D736..1D74E ; Ll # [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +-1D750..1D755 ; Ll # [6] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC PI SYMBOL +-1D770..1D788 ; Ll # [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +-1D78A..1D78F ; Ll # [6] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD PI SYMBOL +-1D7AA..1D7C2 ; Ll # [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +-1D7C4..1D7C9 ; Ll # [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL +-1D7CB ; Ll # MATHEMATICAL BOLD SMALL DIGAMMA +-1E922..1E943 ; Ll # [34] ADLAM SMALL LETTER ALIF..ADLAM SMALL LETTER SHA +- +-# Total code points: 2155 +- +-# ================================================ +- +-# General_Category=Titlecase_Letter +- +-01C5 ; Lt # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +-01C8 ; Lt # LATIN CAPITAL LETTER L WITH SMALL LETTER J +-01CB ; Lt # LATIN CAPITAL LETTER N WITH SMALL LETTER J +-01F2 ; Lt # LATIN CAPITAL LETTER D WITH SMALL LETTER Z +-1F88..1F8F ; Lt # [8] GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI..GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +-1F98..1F9F ; Lt # [8] GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI..GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +-1FA8..1FAF ; Lt # [8] GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI..GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +-1FBC ; Lt # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +-1FCC ; Lt # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +-1FFC ; Lt # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +- +-# Total code points: 31 +- +-# ================================================ +- +-# General_Category=Modifier_Letter +- +-02B0..02C1 ; Lm # [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP +-02C6..02D1 ; Lm # [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON +-02E0..02E4 ; Lm # [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +-02EC ; Lm # MODIFIER LETTER VOICING +-02EE ; Lm # MODIFIER LETTER DOUBLE APOSTROPHE +-0374 ; Lm # GREEK NUMERAL SIGN +-037A ; Lm # GREEK YPOGEGRAMMENI +-0559 ; Lm # ARMENIAN MODIFIER LETTER LEFT HALF RING +-0640 ; Lm # ARABIC TATWEEL +-06E5..06E6 ; Lm # [2] ARABIC SMALL WAW..ARABIC SMALL YEH +-07F4..07F5 ; Lm # [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE +-07FA ; Lm # NKO LAJANYALAN +-081A ; Lm # SAMARITAN MODIFIER LETTER EPENTHETIC YUT +-0824 ; Lm # SAMARITAN MODIFIER LETTER SHORT A +-0828 ; Lm # SAMARITAN MODIFIER LETTER I +-0971 ; Lm # DEVANAGARI SIGN HIGH SPACING DOT +-0E46 ; Lm # THAI CHARACTER MAIYAMOK +-0EC6 ; Lm # LAO KO LA +-10FC ; Lm # MODIFIER LETTER GEORGIAN NAR +-17D7 ; Lm # KHMER SIGN LEK TOO +-1843 ; Lm # MONGOLIAN LETTER TODO LONG VOWEL SIGN +-1AA7 ; Lm # TAI THAM SIGN MAI YAMOK +-1C78..1C7D ; Lm # [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD +-1D2C..1D6A ; Lm # [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI +-1D78 ; Lm # MODIFIER LETTER CYRILLIC EN +-1D9B..1DBF ; Lm # [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA +-2071 ; Lm # SUPERSCRIPT LATIN SMALL LETTER I +-207F ; Lm # SUPERSCRIPT LATIN SMALL LETTER N +-2090..209C ; Lm # [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +-2C7C..2C7D ; Lm # [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V +-2D6F ; Lm # TIFINAGH MODIFIER LETTER LABIALIZATION MARK +-2E2F ; Lm # VERTICAL TILDE +-3005 ; Lm # IDEOGRAPHIC ITERATION MARK +-3031..3035 ; Lm # [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF +-303B ; Lm # VERTICAL IDEOGRAPHIC ITERATION MARK +-309D..309E ; Lm # [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +-30FC..30FE ; Lm # [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK +-A015 ; Lm # YI SYLLABLE WU +-A4F8..A4FD ; Lm # [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU +-A60C ; Lm # VAI SYLLABLE LENGTHENER +-A67F ; Lm # CYRILLIC PAYEROK +-A69C..A69D ; Lm # [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +-A717..A71F ; Lm # [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +-A770 ; Lm # MODIFIER LETTER US +-A788 ; Lm # MODIFIER LETTER LOW CIRCUMFLEX ACCENT +-A7F8..A7F9 ; Lm # [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +-A9CF ; Lm # JAVANESE PANGRANGKEP +-A9E6 ; Lm # MYANMAR MODIFIER LETTER SHAN REDUPLICATION +-AA70 ; Lm # MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +-AADD ; Lm # TAI VIET SYMBOL SAM +-AAF3..AAF4 ; Lm # [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK +-AB5C..AB5F ; Lm # [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +-AB69 ; Lm # MODIFIER LETTER SMALL TURNED W +-FF70 ; Lm # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +-FF9E..FF9F ; Lm # [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +-16B40..16B43 ; Lm # [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM +-16F93..16F9F ; Lm # [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 +-16FE0..16FE1 ; Lm # [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK +-16FE3 ; Lm # OLD CHINESE ITERATION MARK +-1E137..1E13D ; Lm # [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER +-1E94B ; Lm # ADLAM NASALIZATION MARK +- +-# Total code points: 260 +- +-# ================================================ +- +-# General_Category=Other_Letter +- +-00AA ; Lo # FEMININE ORDINAL INDICATOR +-00BA ; Lo # MASCULINE ORDINAL INDICATOR +-01BB ; Lo # LATIN LETTER TWO WITH STROKE +-01C0..01C3 ; Lo # [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK +-0294 ; Lo # LATIN LETTER GLOTTAL STOP +-05D0..05EA ; Lo # [27] HEBREW LETTER ALEF..HEBREW LETTER TAV +-05EF..05F2 ; Lo # [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD +-0620..063F ; Lo # [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE +-0641..064A ; Lo # [10] ARABIC LETTER FEH..ARABIC LETTER YEH +-066E..066F ; Lo # [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF +-0671..06D3 ; Lo # [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +-06D5 ; Lo # ARABIC LETTER AE +-06EE..06EF ; Lo # [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V +-06FA..06FC ; Lo # [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW +-06FF ; Lo # ARABIC LETTER HEH WITH INVERTED V +-0710 ; Lo # SYRIAC LETTER ALAPH +-0712..072F ; Lo # [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH +-074D..07A5 ; Lo # [89] SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER WAAVU +-07B1 ; Lo # THAANA LETTER NAA +-07CA..07EA ; Lo # [33] NKO LETTER A..NKO LETTER JONA RA +-0800..0815 ; Lo # [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF +-0840..0858 ; Lo # [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN +-0860..086A ; Lo # [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA +-08A0..08B4 ; Lo # [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW +-08B6..08C7 ; Lo # [18] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER LAM WITH SMALL ARABIC LETTER TAH ABOVE +-0904..0939 ; Lo # [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA +-093D ; Lo # DEVANAGARI SIGN AVAGRAHA +-0950 ; Lo # DEVANAGARI OM +-0958..0961 ; Lo # [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL +-0972..0980 ; Lo # [15] DEVANAGARI LETTER CANDRA A..BENGALI ANJI +-0985..098C ; Lo # [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L +-098F..0990 ; Lo # [2] BENGALI LETTER E..BENGALI LETTER AI +-0993..09A8 ; Lo # [22] BENGALI LETTER O..BENGALI LETTER NA +-09AA..09B0 ; Lo # [7] BENGALI LETTER PA..BENGALI LETTER RA +-09B2 ; Lo # BENGALI LETTER LA +-09B6..09B9 ; Lo # [4] BENGALI LETTER SHA..BENGALI LETTER HA +-09BD ; Lo # BENGALI SIGN AVAGRAHA +-09CE ; Lo # BENGALI LETTER KHANDA TA +-09DC..09DD ; Lo # [2] BENGALI LETTER RRA..BENGALI LETTER RHA +-09DF..09E1 ; Lo # [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL +-09F0..09F1 ; Lo # [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +-09FC ; Lo # BENGALI LETTER VEDIC ANUSVARA +-0A05..0A0A ; Lo # [6] GURMUKHI LETTER A..GURMUKHI LETTER UU +-0A0F..0A10 ; Lo # [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI +-0A13..0A28 ; Lo # [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA +-0A2A..0A30 ; Lo # [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA +-0A32..0A33 ; Lo # [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA +-0A35..0A36 ; Lo # [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA +-0A38..0A39 ; Lo # [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA +-0A59..0A5C ; Lo # [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA +-0A5E ; Lo # GURMUKHI LETTER FA +-0A72..0A74 ; Lo # [3] GURMUKHI IRI..GURMUKHI EK ONKAR +-0A85..0A8D ; Lo # [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E +-0A8F..0A91 ; Lo # [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O +-0A93..0AA8 ; Lo # [22] GUJARATI LETTER O..GUJARATI LETTER NA +-0AAA..0AB0 ; Lo # [7] GUJARATI LETTER PA..GUJARATI LETTER RA +-0AB2..0AB3 ; Lo # [2] GUJARATI LETTER LA..GUJARATI LETTER LLA +-0AB5..0AB9 ; Lo # [5] GUJARATI LETTER VA..GUJARATI LETTER HA +-0ABD ; Lo # GUJARATI SIGN AVAGRAHA +-0AD0 ; Lo # GUJARATI OM +-0AE0..0AE1 ; Lo # [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL +-0AF9 ; Lo # GUJARATI LETTER ZHA +-0B05..0B0C ; Lo # [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L +-0B0F..0B10 ; Lo # [2] ORIYA LETTER E..ORIYA LETTER AI +-0B13..0B28 ; Lo # [22] ORIYA LETTER O..ORIYA LETTER NA +-0B2A..0B30 ; Lo # [7] ORIYA LETTER PA..ORIYA LETTER RA +-0B32..0B33 ; Lo # [2] ORIYA LETTER LA..ORIYA LETTER LLA +-0B35..0B39 ; Lo # [5] ORIYA LETTER VA..ORIYA LETTER HA +-0B3D ; Lo # ORIYA SIGN AVAGRAHA +-0B5C..0B5D ; Lo # [2] ORIYA LETTER RRA..ORIYA LETTER RHA +-0B5F..0B61 ; Lo # [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL +-0B71 ; Lo # ORIYA LETTER WA +-0B83 ; Lo # TAMIL SIGN VISARGA +-0B85..0B8A ; Lo # [6] TAMIL LETTER A..TAMIL LETTER UU +-0B8E..0B90 ; Lo # [3] TAMIL LETTER E..TAMIL LETTER AI +-0B92..0B95 ; Lo # [4] TAMIL LETTER O..TAMIL LETTER KA +-0B99..0B9A ; Lo # [2] TAMIL LETTER NGA..TAMIL LETTER CA +-0B9C ; Lo # TAMIL LETTER JA +-0B9E..0B9F ; Lo # [2] TAMIL LETTER NYA..TAMIL LETTER TTA +-0BA3..0BA4 ; Lo # [2] TAMIL LETTER NNA..TAMIL LETTER TA +-0BA8..0BAA ; Lo # [3] TAMIL LETTER NA..TAMIL LETTER PA +-0BAE..0BB9 ; Lo # [12] TAMIL LETTER MA..TAMIL LETTER HA +-0BD0 ; Lo # TAMIL OM +-0C05..0C0C ; Lo # [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L +-0C0E..0C10 ; Lo # [3] TELUGU LETTER E..TELUGU LETTER AI +-0C12..0C28 ; Lo # [23] TELUGU LETTER O..TELUGU LETTER NA +-0C2A..0C39 ; Lo # [16] TELUGU LETTER PA..TELUGU LETTER HA +-0C3D ; Lo # TELUGU SIGN AVAGRAHA +-0C58..0C5A ; Lo # [3] TELUGU LETTER TSA..TELUGU LETTER RRRA +-0C60..0C61 ; Lo # [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +-0C80 ; Lo # KANNADA SIGN SPACING CANDRABINDU +-0C85..0C8C ; Lo # [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L +-0C8E..0C90 ; Lo # [3] KANNADA LETTER E..KANNADA LETTER AI +-0C92..0CA8 ; Lo # [23] KANNADA LETTER O..KANNADA LETTER NA +-0CAA..0CB3 ; Lo # [10] KANNADA LETTER PA..KANNADA LETTER LLA +-0CB5..0CB9 ; Lo # [5] KANNADA LETTER VA..KANNADA LETTER HA +-0CBD ; Lo # KANNADA SIGN AVAGRAHA +-0CDE ; Lo # KANNADA LETTER FA +-0CE0..0CE1 ; Lo # [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL +-0CF1..0CF2 ; Lo # [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +-0D04..0D0C ; Lo # [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L +-0D0E..0D10 ; Lo # [3] MALAYALAM LETTER E..MALAYALAM LETTER AI +-0D12..0D3A ; Lo # [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA +-0D3D ; Lo # MALAYALAM SIGN AVAGRAHA +-0D4E ; Lo # MALAYALAM LETTER DOT REPH +-0D54..0D56 ; Lo # [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL +-0D5F..0D61 ; Lo # [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL +-0D7A..0D7F ; Lo # [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K +-0D85..0D96 ; Lo # [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA +-0D9A..0DB1 ; Lo # [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA +-0DB3..0DBB ; Lo # [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA +-0DBD ; Lo # SINHALA LETTER DANTAJA LAYANNA +-0DC0..0DC6 ; Lo # [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA +-0E01..0E30 ; Lo # [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A +-0E32..0E33 ; Lo # [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM +-0E40..0E45 ; Lo # [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO +-0E81..0E82 ; Lo # [2] LAO LETTER KO..LAO LETTER KHO SUNG +-0E84 ; Lo # LAO LETTER KHO TAM +-0E86..0E8A ; Lo # [5] LAO LETTER PALI GHA..LAO LETTER SO TAM +-0E8C..0EA3 ; Lo # [24] LAO LETTER PALI JHA..LAO LETTER LO LING +-0EA5 ; Lo # LAO LETTER LO LOOT +-0EA7..0EB0 ; Lo # [10] LAO LETTER WO..LAO VOWEL SIGN A +-0EB2..0EB3 ; Lo # [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM +-0EBD ; Lo # LAO SEMIVOWEL SIGN NYO +-0EC0..0EC4 ; Lo # [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI +-0EDC..0EDF ; Lo # [4] LAO HO NO..LAO LETTER KHMU NYO +-0F00 ; Lo # TIBETAN SYLLABLE OM +-0F40..0F47 ; Lo # [8] TIBETAN LETTER KA..TIBETAN LETTER JA +-0F49..0F6C ; Lo # [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA +-0F88..0F8C ; Lo # [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN +-1000..102A ; Lo # [43] MYANMAR LETTER KA..MYANMAR LETTER AU +-103F ; Lo # MYANMAR LETTER GREAT SA +-1050..1055 ; Lo # [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL +-105A..105D ; Lo # [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE +-1061 ; Lo # MYANMAR LETTER SGAW KAREN SHA +-1065..1066 ; Lo # [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA +-106E..1070 ; Lo # [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA +-1075..1081 ; Lo # [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA +-108E ; Lo # MYANMAR LETTER RUMAI PALAUNG FA +-1100..1248 ; Lo # [329] HANGUL CHOSEONG KIYEOK..ETHIOPIC SYLLABLE QWA +-124A..124D ; Lo # [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE +-1250..1256 ; Lo # [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO +-1258 ; Lo # ETHIOPIC SYLLABLE QHWA +-125A..125D ; Lo # [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE +-1260..1288 ; Lo # [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA +-128A..128D ; Lo # [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE +-1290..12B0 ; Lo # [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA +-12B2..12B5 ; Lo # [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE +-12B8..12BE ; Lo # [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO +-12C0 ; Lo # ETHIOPIC SYLLABLE KXWA +-12C2..12C5 ; Lo # [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE +-12C8..12D6 ; Lo # [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O +-12D8..1310 ; Lo # [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA +-1312..1315 ; Lo # [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE +-1318..135A ; Lo # [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA +-1380..138F ; Lo # [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE +-1401..166C ; Lo # [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA +-166F..167F ; Lo # [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W +-1681..169A ; Lo # [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH +-16A0..16EA ; Lo # [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X +-16F1..16F8 ; Lo # [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC +-1700..170C ; Lo # [13] TAGALOG LETTER A..TAGALOG LETTER YA +-170E..1711 ; Lo # [4] TAGALOG LETTER LA..TAGALOG LETTER HA +-1720..1731 ; Lo # [18] HANUNOO LETTER A..HANUNOO LETTER HA +-1740..1751 ; Lo # [18] BUHID LETTER A..BUHID LETTER HA +-1760..176C ; Lo # [13] TAGBANWA LETTER A..TAGBANWA LETTER YA +-176E..1770 ; Lo # [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA +-1780..17B3 ; Lo # [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU +-17DC ; Lo # KHMER SIGN AVAKRAHASANYA +-1820..1842 ; Lo # [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI +-1844..1878 ; Lo # [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS +-1880..1884 ; Lo # [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +-1887..18A8 ; Lo # [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA +-18AA ; Lo # MONGOLIAN LETTER MANCHU ALI GALI LHA +-18B0..18F5 ; Lo # [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S +-1900..191E ; Lo # [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA +-1950..196D ; Lo # [30] TAI LE LETTER KA..TAI LE LETTER AI +-1970..1974 ; Lo # [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 +-1980..19AB ; Lo # [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA +-19B0..19C9 ; Lo # [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 +-1A00..1A16 ; Lo # [23] BUGINESE LETTER KA..BUGINESE LETTER HA +-1A20..1A54 ; Lo # [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA +-1B05..1B33 ; Lo # [47] BALINESE LETTER AKARA..BALINESE LETTER HA +-1B45..1B4B ; Lo # [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK +-1B83..1BA0 ; Lo # [30] SUNDANESE LETTER A..SUNDANESE LETTER HA +-1BAE..1BAF ; Lo # [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA +-1BBA..1BE5 ; Lo # [44] SUNDANESE AVAGRAHA..BATAK LETTER U +-1C00..1C23 ; Lo # [36] LEPCHA LETTER KA..LEPCHA LETTER A +-1C4D..1C4F ; Lo # [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA +-1C5A..1C77 ; Lo # [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH +-1CE9..1CEC ; Lo # [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL +-1CEE..1CF3 ; Lo # [6] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ROTATED ARDHAVISARGA +-1CF5..1CF6 ; Lo # [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA +-1CFA ; Lo # VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA +-2135..2138 ; Lo # [4] ALEF SYMBOL..DALET SYMBOL +-2D30..2D67 ; Lo # [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO +-2D80..2D96 ; Lo # [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE +-2DA0..2DA6 ; Lo # [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO +-2DA8..2DAE ; Lo # [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO +-2DB0..2DB6 ; Lo # [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO +-2DB8..2DBE ; Lo # [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO +-2DC0..2DC6 ; Lo # [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO +-2DC8..2DCE ; Lo # [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO +-2DD0..2DD6 ; Lo # [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO +-2DD8..2DDE ; Lo # [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO +-3006 ; Lo # IDEOGRAPHIC CLOSING MARK +-303C ; Lo # MASU MARK +-3041..3096 ; Lo # [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE +-309F ; Lo # HIRAGANA DIGRAPH YORI +-30A1..30FA ; Lo # [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO +-30FF ; Lo # KATAKANA DIGRAPH KOTO +-3105..312F ; Lo # [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN +-3131..318E ; Lo # [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE +-31A0..31BF ; Lo # [32] BOPOMOFO LETTER BU..BOPOMOFO LETTER AH +-31F0..31FF ; Lo # [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO +-3400..4DBF ; Lo # [6592] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DBF +-4E00..9FFC ; Lo # [20989] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FFC +-A000..A014 ; Lo # [21] YI SYLLABLE IT..YI SYLLABLE E +-A016..A48C ; Lo # [1143] YI SYLLABLE BIT..YI SYLLABLE YYR +-A4D0..A4F7 ; Lo # [40] LISU LETTER BA..LISU LETTER OE +-A500..A60B ; Lo # [268] VAI SYLLABLE EE..VAI SYLLABLE NG +-A610..A61F ; Lo # [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG +-A62A..A62B ; Lo # [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO +-A66E ; Lo # CYRILLIC LETTER MULTIOCULAR O +-A6A0..A6E5 ; Lo # [70] BAMUM LETTER A..BAMUM LETTER KI +-A78F ; Lo # LATIN LETTER SINOLOGICAL DOT +-A7F7 ; Lo # LATIN EPIGRAPHIC LETTER SIDEWAYS I +-A7FB..A801 ; Lo # [7] LATIN EPIGRAPHIC LETTER REVERSED F..SYLOTI NAGRI LETTER I +-A803..A805 ; Lo # [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O +-A807..A80A ; Lo # [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO +-A80C..A822 ; Lo # [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO +-A840..A873 ; Lo # [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU +-A882..A8B3 ; Lo # [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA +-A8F2..A8F7 ; Lo # [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA +-A8FB ; Lo # DEVANAGARI HEADSTROKE +-A8FD..A8FE ; Lo # [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY +-A90A..A925 ; Lo # [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO +-A930..A946 ; Lo # [23] REJANG LETTER KA..REJANG LETTER A +-A960..A97C ; Lo # [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH +-A984..A9B2 ; Lo # [47] JAVANESE LETTER A..JAVANESE LETTER HA +-A9E0..A9E4 ; Lo # [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA +-A9E7..A9EF ; Lo # [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA +-A9FA..A9FE ; Lo # [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA +-AA00..AA28 ; Lo # [41] CHAM LETTER A..CHAM LETTER HA +-AA40..AA42 ; Lo # [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG +-AA44..AA4B ; Lo # [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS +-AA60..AA6F ; Lo # [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA +-AA71..AA76 ; Lo # [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM +-AA7A ; Lo # MYANMAR LETTER AITON RA +-AA7E..AAAF ; Lo # [50] MYANMAR LETTER SHWE PALAUNG CHA..TAI VIET LETTER HIGH O +-AAB1 ; Lo # TAI VIET VOWEL AA +-AAB5..AAB6 ; Lo # [2] TAI VIET VOWEL E..TAI VIET VOWEL O +-AAB9..AABD ; Lo # [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN +-AAC0 ; Lo # TAI VIET TONE MAI NUENG +-AAC2 ; Lo # TAI VIET TONE MAI SONG +-AADB..AADC ; Lo # [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG +-AAE0..AAEA ; Lo # [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA +-AAF2 ; Lo # MEETEI MAYEK ANJI +-AB01..AB06 ; Lo # [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO +-AB09..AB0E ; Lo # [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO +-AB11..AB16 ; Lo # [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO +-AB20..AB26 ; Lo # [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO +-AB28..AB2E ; Lo # [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO +-ABC0..ABE2 ; Lo # [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM +-AC00..D7A3 ; Lo # [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH +-D7B0..D7C6 ; Lo # [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E +-D7CB..D7FB ; Lo # [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH +-F900..FA6D ; Lo # [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D +-FA70..FAD9 ; Lo # [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +-FB1D ; Lo # HEBREW LETTER YOD WITH HIRIQ +-FB1F..FB28 ; Lo # [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV +-FB2A..FB36 ; Lo # [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH +-FB38..FB3C ; Lo # [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH +-FB3E ; Lo # HEBREW LETTER MEM WITH DAGESH +-FB40..FB41 ; Lo # [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH +-FB43..FB44 ; Lo # [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH +-FB46..FBB1 ; Lo # [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +-FBD3..FD3D ; Lo # [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +-FD50..FD8F ; Lo # [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +-FD92..FDC7 ; Lo # [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +-FDF0..FDFB ; Lo # [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU +-FE70..FE74 ; Lo # [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM +-FE76..FEFC ; Lo # [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM +-FF66..FF6F ; Lo # [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU +-FF71..FF9D ; Lo # [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N +-FFA0..FFBE ; Lo # [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH +-FFC2..FFC7 ; Lo # [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E +-FFCA..FFCF ; Lo # [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE +-FFD2..FFD7 ; Lo # [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU +-FFDA..FFDC ; Lo # [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I +-10000..1000B ; Lo # [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE +-1000D..10026 ; Lo # [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO +-10028..1003A ; Lo # [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO +-1003C..1003D ; Lo # [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE +-1003F..1004D ; Lo # [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO +-10050..1005D ; Lo # [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 +-10080..100FA ; Lo # [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 +-10280..1029C ; Lo # [29] LYCIAN LETTER A..LYCIAN LETTER X +-102A0..102D0 ; Lo # [49] CARIAN LETTER A..CARIAN LETTER UUU3 +-10300..1031F ; Lo # [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS +-1032D..10340 ; Lo # [20] OLD ITALIC LETTER YE..GOTHIC LETTER PAIRTHRA +-10342..10349 ; Lo # [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL +-10350..10375 ; Lo # [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA +-10380..1039D ; Lo # [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU +-103A0..103C3 ; Lo # [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA +-103C8..103CF ; Lo # [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH +-10450..1049D ; Lo # [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO +-10500..10527 ; Lo # [40] ELBASAN LETTER A..ELBASAN LETTER KHE +-10530..10563 ; Lo # [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW +-10600..10736 ; Lo # [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 +-10740..10755 ; Lo # [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE +-10760..10767 ; Lo # [8] LINEAR A SIGN A800..LINEAR A SIGN A807 +-10800..10805 ; Lo # [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA +-10808 ; Lo # CYPRIOT SYLLABLE JO +-1080A..10835 ; Lo # [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO +-10837..10838 ; Lo # [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE +-1083C ; Lo # CYPRIOT SYLLABLE ZA +-1083F..10855 ; Lo # [23] CYPRIOT SYLLABLE ZO..IMPERIAL ARAMAIC LETTER TAW +-10860..10876 ; Lo # [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW +-10880..1089E ; Lo # [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW +-108E0..108F2 ; Lo # [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH +-108F4..108F5 ; Lo # [2] HATRAN LETTER SHIN..HATRAN LETTER TAW +-10900..10915 ; Lo # [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU +-10920..10939 ; Lo # [26] LYDIAN LETTER A..LYDIAN LETTER C +-10980..109B7 ; Lo # [56] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC CURSIVE LETTER DA +-109BE..109BF ; Lo # [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN +-10A00 ; Lo # KHAROSHTHI LETTER A +-10A10..10A13 ; Lo # [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA +-10A15..10A17 ; Lo # [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA +-10A19..10A35 ; Lo # [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA +-10A60..10A7C ; Lo # [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH +-10A80..10A9C ; Lo # [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH +-10AC0..10AC7 ; Lo # [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW +-10AC9..10AE4 ; Lo # [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW +-10B00..10B35 ; Lo # [54] AVESTAN LETTER A..AVESTAN LETTER HE +-10B40..10B55 ; Lo # [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW +-10B60..10B72 ; Lo # [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW +-10B80..10B91 ; Lo # [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW +-10C00..10C48 ; Lo # [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH +-10D00..10D23 ; Lo # [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA +-10E80..10EA9 ; Lo # [42] YEZIDI LETTER ELIF..YEZIDI LETTER ET +-10EB0..10EB1 ; Lo # [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE +-10F00..10F1C ; Lo # [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL +-10F27 ; Lo # OLD SOGDIAN LIGATURE AYIN-DALETH +-10F30..10F45 ; Lo # [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN +-10FB0..10FC4 ; Lo # [21] CHORASMIAN LETTER ALEPH..CHORASMIAN LETTER TAW +-10FE0..10FF6 ; Lo # [23] ELYMAIC LETTER ALEPH..ELYMAIC LIGATURE ZAYIN-YODH +-11003..11037 ; Lo # [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA +-11083..110AF ; Lo # [45] KAITHI LETTER A..KAITHI LETTER HA +-110D0..110E8 ; Lo # [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE +-11103..11126 ; Lo # [36] CHAKMA LETTER AA..CHAKMA LETTER HAA +-11144 ; Lo # CHAKMA LETTER LHAA +-11147 ; Lo # CHAKMA LETTER VAA +-11150..11172 ; Lo # [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA +-11176 ; Lo # MAHAJANI LIGATURE SHRI +-11183..111B2 ; Lo # [48] SHARADA LETTER A..SHARADA LETTER HA +-111C1..111C4 ; Lo # [4] SHARADA SIGN AVAGRAHA..SHARADA OM +-111DA ; Lo # SHARADA EKAM +-111DC ; Lo # SHARADA HEADSTROKE +-11200..11211 ; Lo # [18] KHOJKI LETTER A..KHOJKI LETTER JJA +-11213..1122B ; Lo # [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA +-11280..11286 ; Lo # [7] MULTANI LETTER A..MULTANI LETTER GA +-11288 ; Lo # MULTANI LETTER GHA +-1128A..1128D ; Lo # [4] MULTANI LETTER CA..MULTANI LETTER JJA +-1128F..1129D ; Lo # [15] MULTANI LETTER NYA..MULTANI LETTER BA +-1129F..112A8 ; Lo # [10] MULTANI LETTER BHA..MULTANI LETTER RHA +-112B0..112DE ; Lo # [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA +-11305..1130C ; Lo # [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L +-1130F..11310 ; Lo # [2] GRANTHA LETTER EE..GRANTHA LETTER AI +-11313..11328 ; Lo # [22] GRANTHA LETTER OO..GRANTHA LETTER NA +-1132A..11330 ; Lo # [7] GRANTHA LETTER PA..GRANTHA LETTER RA +-11332..11333 ; Lo # [2] GRANTHA LETTER LA..GRANTHA LETTER LLA +-11335..11339 ; Lo # [5] GRANTHA LETTER VA..GRANTHA LETTER HA +-1133D ; Lo # GRANTHA SIGN AVAGRAHA +-11350 ; Lo # GRANTHA OM +-1135D..11361 ; Lo # [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL +-11400..11434 ; Lo # [53] NEWA LETTER A..NEWA LETTER HA +-11447..1144A ; Lo # [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI +-1145F..11461 ; Lo # [3] NEWA LETTER VEDIC ANUSVARA..NEWA SIGN UPADHMANIYA +-11480..114AF ; Lo # [48] TIRHUTA ANJI..TIRHUTA LETTER HA +-114C4..114C5 ; Lo # [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG +-114C7 ; Lo # TIRHUTA OM +-11580..115AE ; Lo # [47] SIDDHAM LETTER A..SIDDHAM LETTER HA +-115D8..115DB ; Lo # [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U +-11600..1162F ; Lo # [48] MODI LETTER A..MODI LETTER LLA +-11644 ; Lo # MODI SIGN HUVA +-11680..116AA ; Lo # [43] TAKRI LETTER A..TAKRI LETTER RRA +-116B8 ; Lo # TAKRI LETTER ARCHAIC KHA +-11700..1171A ; Lo # [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA +-11800..1182B ; Lo # [44] DOGRA LETTER A..DOGRA LETTER RRA +-118FF..11906 ; Lo # [8] WARANG CITI OM..DIVES AKURU LETTER E +-11909 ; Lo # DIVES AKURU LETTER O +-1190C..11913 ; Lo # [8] DIVES AKURU LETTER KA..DIVES AKURU LETTER JA +-11915..11916 ; Lo # [2] DIVES AKURU LETTER NYA..DIVES AKURU LETTER TTA +-11918..1192F ; Lo # [24] DIVES AKURU LETTER DDA..DIVES AKURU LETTER ZA +-1193F ; Lo # DIVES AKURU PREFIXED NASAL SIGN +-11941 ; Lo # DIVES AKURU INITIAL RA +-119A0..119A7 ; Lo # [8] NANDINAGARI LETTER A..NANDINAGARI LETTER VOCALIC RR +-119AA..119D0 ; Lo # [39] NANDINAGARI LETTER E..NANDINAGARI LETTER RRA +-119E1 ; Lo # NANDINAGARI SIGN AVAGRAHA +-119E3 ; Lo # NANDINAGARI HEADSTROKE +-11A00 ; Lo # ZANABAZAR SQUARE LETTER A +-11A0B..11A32 ; Lo # [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA +-11A3A ; Lo # ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +-11A50 ; Lo # SOYOMBO LETTER A +-11A5C..11A89 ; Lo # [46] SOYOMBO LETTER KA..SOYOMBO CLUSTER-INITIAL LETTER SA +-11A9D ; Lo # SOYOMBO MARK PLUTA +-11AC0..11AF8 ; Lo # [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL +-11C00..11C08 ; Lo # [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +-11C0A..11C2E ; Lo # [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA +-11C40 ; Lo # BHAIKSUKI SIGN AVAGRAHA +-11C72..11C8F ; Lo # [30] MARCHEN LETTER KA..MARCHEN LETTER A +-11D00..11D06 ; Lo # [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +-11D08..11D09 ; Lo # [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +-11D0B..11D30 ; Lo # [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA +-11D46 ; Lo # MASARAM GONDI REPHA +-11D60..11D65 ; Lo # [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU +-11D67..11D68 ; Lo # [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI +-11D6A..11D89 ; Lo # [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA +-11D98 ; Lo # GUNJALA GONDI OM +-11EE0..11EF2 ; Lo # [19] MAKASAR LETTER KA..MAKASAR ANGKA +-11FB0 ; Lo # LISU LETTER YHA +-12000..12399 ; Lo # [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U +-12480..12543 ; Lo # [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +-13000..1342E ; Lo # [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 +-14400..14646 ; Lo # [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 +-16800..16A38 ; Lo # [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ +-16A40..16A5E ; Lo # [31] MRO LETTER TA..MRO LETTER TEK +-16AD0..16AED ; Lo # [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I +-16B00..16B2F ; Lo # [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU +-16B63..16B77 ; Lo # [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS +-16B7D..16B8F ; Lo # [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ +-16F00..16F4A ; Lo # [75] MIAO LETTER PA..MIAO LETTER RTE +-16F50 ; Lo # MIAO LETTER NASALIZATION +-17000..187F7 ; Lo # [6136] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F7 +-18800..18CD5 ; Lo # [1238] TANGUT COMPONENT-001..KHITAN SMALL SCRIPT CHARACTER-18CD5 +-18D00..18D08 ; Lo # [9] TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D08 +-1B000..1B11E ; Lo # [287] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER N-MU-MO-2 +-1B150..1B152 ; Lo # [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO +-1B164..1B167 ; Lo # [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N +-1B170..1B2FB ; Lo # [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB +-1BC00..1BC6A ; Lo # [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M +-1BC70..1BC7C ; Lo # [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK +-1BC80..1BC88 ; Lo # [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL +-1BC90..1BC99 ; Lo # [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW +-1E100..1E12C ; Lo # [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W +-1E14E ; Lo # NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ +-1E2C0..1E2EB ; Lo # [44] WANCHO LETTER AA..WANCHO LETTER YIH +-1E800..1E8C4 ; Lo # [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON +-1EE00..1EE03 ; Lo # [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL +-1EE05..1EE1F ; Lo # [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF +-1EE21..1EE22 ; Lo # [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM +-1EE24 ; Lo # ARABIC MATHEMATICAL INITIAL HEH +-1EE27 ; Lo # ARABIC MATHEMATICAL INITIAL HAH +-1EE29..1EE32 ; Lo # [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF +-1EE34..1EE37 ; Lo # [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH +-1EE39 ; Lo # ARABIC MATHEMATICAL INITIAL DAD +-1EE3B ; Lo # ARABIC MATHEMATICAL INITIAL GHAIN +-1EE42 ; Lo # ARABIC MATHEMATICAL TAILED JEEM +-1EE47 ; Lo # ARABIC MATHEMATICAL TAILED HAH +-1EE49 ; Lo # ARABIC MATHEMATICAL TAILED YEH +-1EE4B ; Lo # ARABIC MATHEMATICAL TAILED LAM +-1EE4D..1EE4F ; Lo # [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN +-1EE51..1EE52 ; Lo # [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF +-1EE54 ; Lo # ARABIC MATHEMATICAL TAILED SHEEN +-1EE57 ; Lo # ARABIC MATHEMATICAL TAILED KHAH +-1EE59 ; Lo # ARABIC MATHEMATICAL TAILED DAD +-1EE5B ; Lo # ARABIC MATHEMATICAL TAILED GHAIN +-1EE5D ; Lo # ARABIC MATHEMATICAL TAILED DOTLESS NOON +-1EE5F ; Lo # ARABIC MATHEMATICAL TAILED DOTLESS QAF +-1EE61..1EE62 ; Lo # [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM +-1EE64 ; Lo # ARABIC MATHEMATICAL STRETCHED HEH +-1EE67..1EE6A ; Lo # [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF +-1EE6C..1EE72 ; Lo # [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF +-1EE74..1EE77 ; Lo # [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH +-1EE79..1EE7C ; Lo # [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +-1EE7E ; Lo # ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +-1EE80..1EE89 ; Lo # [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH +-1EE8B..1EE9B ; Lo # [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN +-1EEA1..1EEA3 ; Lo # [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +-1EEA5..1EEA9 ; Lo # [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +-1EEAB..1EEBB ; Lo # [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +-20000..2A6DD ; Lo # [42718] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DD +-2A700..2B734 ; Lo # [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 +-2B740..2B81D ; Lo # [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D +-2B820..2CEA1 ; Lo # [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +-2CEB0..2EBE0 ; Lo # [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +-2F800..2FA1D ; Lo # [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D +-30000..3134A ; Lo # [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +- +-# Total code points: 127004 +- +-# ================================================ +- +-# General_Category=Nonspacing_Mark +- +-0300..036F ; Mn # [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X +-0483..0487 ; Mn # [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE +-0591..05BD ; Mn # [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG +-05BF ; Mn # HEBREW POINT RAFE +-05C1..05C2 ; Mn # [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +-05C4..05C5 ; Mn # [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +-05C7 ; Mn # HEBREW POINT QAMATS QATAN +-0610..061A ; Mn # [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA +-064B..065F ; Mn # [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW +-0670 ; Mn # ARABIC LETTER SUPERSCRIPT ALEF +-06D6..06DC ; Mn # [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +-06DF..06E4 ; Mn # [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA +-06E7..06E8 ; Mn # [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +-06EA..06ED ; Mn # [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM +-0711 ; Mn # SYRIAC LETTER SUPERSCRIPT ALAPH +-0730..074A ; Mn # [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +-07A6..07B0 ; Mn # [11] THAANA ABAFILI..THAANA SUKUN +-07EB..07F3 ; Mn # [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE +-07FD ; Mn # NKO DANTAYALAN +-0816..0819 ; Mn # [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH +-081B..0823 ; Mn # [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A +-0825..0827 ; Mn # [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U +-0829..082D ; Mn # [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA +-0859..085B ; Mn # [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK +-08D3..08E1 ; Mn # [15] ARABIC SMALL LOW WAW..ARABIC SMALL HIGH SIGN SAFHA +-08E3..0902 ; Mn # [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA +-093A ; Mn # DEVANAGARI VOWEL SIGN OE +-093C ; Mn # DEVANAGARI SIGN NUKTA +-0941..0948 ; Mn # [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +-094D ; Mn # DEVANAGARI SIGN VIRAMA +-0951..0957 ; Mn # [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE +-0962..0963 ; Mn # [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +-0981 ; Mn # BENGALI SIGN CANDRABINDU +-09BC ; Mn # BENGALI SIGN NUKTA +-09C1..09C4 ; Mn # [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +-09CD ; Mn # BENGALI SIGN VIRAMA +-09E2..09E3 ; Mn # [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +-09FE ; Mn # BENGALI SANDHI MARK +-0A01..0A02 ; Mn # [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI +-0A3C ; Mn # GURMUKHI SIGN NUKTA +-0A41..0A42 ; Mn # [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +-0A47..0A48 ; Mn # [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +-0A4B..0A4D ; Mn # [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA +-0A51 ; Mn # GURMUKHI SIGN UDAAT +-0A70..0A71 ; Mn # [2] GURMUKHI TIPPI..GURMUKHI ADDAK +-0A75 ; Mn # GURMUKHI SIGN YAKASH +-0A81..0A82 ; Mn # [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +-0ABC ; Mn # GUJARATI SIGN NUKTA +-0AC1..0AC5 ; Mn # [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +-0AC7..0AC8 ; Mn # [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +-0ACD ; Mn # GUJARATI SIGN VIRAMA +-0AE2..0AE3 ; Mn # [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +-0AFA..0AFF ; Mn # [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE +-0B01 ; Mn # ORIYA SIGN CANDRABINDU +-0B3C ; Mn # ORIYA SIGN NUKTA +-0B3F ; Mn # ORIYA VOWEL SIGN I +-0B41..0B44 ; Mn # [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR +-0B4D ; Mn # ORIYA SIGN VIRAMA +-0B55..0B56 ; Mn # [2] ORIYA SIGN OVERLINE..ORIYA AI LENGTH MARK +-0B62..0B63 ; Mn # [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL +-0B82 ; Mn # TAMIL SIGN ANUSVARA +-0BC0 ; Mn # TAMIL VOWEL SIGN II +-0BCD ; Mn # TAMIL SIGN VIRAMA +-0C00 ; Mn # TELUGU SIGN COMBINING CANDRABINDU ABOVE +-0C04 ; Mn # TELUGU SIGN COMBINING ANUSVARA ABOVE +-0C3E..0C40 ; Mn # [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +-0C46..0C48 ; Mn # [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +-0C4A..0C4D ; Mn # [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA +-0C55..0C56 ; Mn # [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +-0C62..0C63 ; Mn # [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL +-0C81 ; Mn # KANNADA SIGN CANDRABINDU +-0CBC ; Mn # KANNADA SIGN NUKTA +-0CBF ; Mn # KANNADA VOWEL SIGN I +-0CC6 ; Mn # KANNADA VOWEL SIGN E +-0CCC..0CCD ; Mn # [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA +-0CE2..0CE3 ; Mn # [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL +-0D00..0D01 ; Mn # [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU +-0D3B..0D3C ; Mn # [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA +-0D41..0D44 ; Mn # [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR +-0D4D ; Mn # MALAYALAM SIGN VIRAMA +-0D62..0D63 ; Mn # [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL +-0D81 ; Mn # SINHALA SIGN CANDRABINDU +-0DCA ; Mn # SINHALA SIGN AL-LAKUNA +-0DD2..0DD4 ; Mn # [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +-0DD6 ; Mn # SINHALA VOWEL SIGN DIGA PAA-PILLA +-0E31 ; Mn # THAI CHARACTER MAI HAN-AKAT +-0E34..0E3A ; Mn # [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +-0E47..0E4E ; Mn # [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN +-0EB1 ; Mn # LAO VOWEL SIGN MAI KAN +-0EB4..0EBC ; Mn # [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO +-0EC8..0ECD ; Mn # [6] LAO TONE MAI EK..LAO NIGGAHITA +-0F18..0F19 ; Mn # [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +-0F35 ; Mn # TIBETAN MARK NGAS BZUNG NYI ZLA +-0F37 ; Mn # TIBETAN MARK NGAS BZUNG SGOR RTAGS +-0F39 ; Mn # TIBETAN MARK TSA -PHRU +-0F71..0F7E ; Mn # [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +-0F80..0F84 ; Mn # [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA +-0F86..0F87 ; Mn # [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +-0F8D..0F97 ; Mn # [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA +-0F99..0FBC ; Mn # [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +-0FC6 ; Mn # TIBETAN SYMBOL PADMA GDAN +-102D..1030 ; Mn # [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +-1032..1037 ; Mn # [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW +-1039..103A ; Mn # [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT +-103D..103E ; Mn # [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA +-1058..1059 ; Mn # [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL +-105E..1060 ; Mn # [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA +-1071..1074 ; Mn # [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE +-1082 ; Mn # MYANMAR CONSONANT SIGN SHAN MEDIAL WA +-1085..1086 ; Mn # [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y +-108D ; Mn # MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +-109D ; Mn # MYANMAR VOWEL SIGN AITON AI +-135D..135F ; Mn # [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK +-1712..1714 ; Mn # [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA +-1732..1734 ; Mn # [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD +-1752..1753 ; Mn # [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U +-1772..1773 ; Mn # [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U +-17B4..17B5 ; Mn # [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +-17B7..17BD ; Mn # [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +-17C6 ; Mn # KHMER SIGN NIKAHIT +-17C9..17D3 ; Mn # [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT +-17DD ; Mn # KHMER SIGN ATTHACAN +-180B..180D ; Mn # [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +-1885..1886 ; Mn # [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +-18A9 ; Mn # MONGOLIAN LETTER ALI GALI DAGALGA +-1920..1922 ; Mn # [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +-1927..1928 ; Mn # [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +-1932 ; Mn # LIMBU SMALL LETTER ANUSVARA +-1939..193B ; Mn # [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +-1A17..1A18 ; Mn # [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U +-1A1B ; Mn # BUGINESE VOWEL SIGN AE +-1A56 ; Mn # TAI THAM CONSONANT SIGN MEDIAL LA +-1A58..1A5E ; Mn # [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA +-1A60 ; Mn # TAI THAM SIGN SAKOT +-1A62 ; Mn # TAI THAM VOWEL SIGN MAI SAT +-1A65..1A6C ; Mn # [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW +-1A73..1A7C ; Mn # [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN +-1A7F ; Mn # TAI THAM COMBINING CRYPTOGRAMMIC DOT +-1AB0..1ABD ; Mn # [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW +-1ABF..1AC0 ; Mn # [2] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER TURNED W BELOW +-1B00..1B03 ; Mn # [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG +-1B34 ; Mn # BALINESE SIGN REREKAN +-1B36..1B3A ; Mn # [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA +-1B3C ; Mn # BALINESE VOWEL SIGN LA LENGA +-1B42 ; Mn # BALINESE VOWEL SIGN PEPET +-1B6B..1B73 ; Mn # [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG +-1B80..1B81 ; Mn # [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR +-1BA2..1BA5 ; Mn # [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU +-1BA8..1BA9 ; Mn # [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG +-1BAB..1BAD ; Mn # [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA +-1BE6 ; Mn # BATAK SIGN TOMPI +-1BE8..1BE9 ; Mn # [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE +-1BED ; Mn # BATAK VOWEL SIGN KARO O +-1BEF..1BF1 ; Mn # [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H +-1C2C..1C33 ; Mn # [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T +-1C36..1C37 ; Mn # [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA +-1CD0..1CD2 ; Mn # [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA +-1CD4..1CE0 ; Mn # [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA +-1CE2..1CE8 ; Mn # [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL +-1CED ; Mn # VEDIC SIGN TIRYAK +-1CF4 ; Mn # VEDIC TONE CANDRA ABOVE +-1CF8..1CF9 ; Mn # [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE +-1DC0..1DF9 ; Mn # [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW +-1DFB..1DFF ; Mn # [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +-20D0..20DC ; Mn # [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE +-20E1 ; Mn # COMBINING LEFT RIGHT ARROW ABOVE +-20E5..20F0 ; Mn # [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE +-2CEF..2CF1 ; Mn # [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS +-2D7F ; Mn # TIFINAGH CONSONANT JOINER +-2DE0..2DFF ; Mn # [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +-302A..302D ; Mn # [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK +-3099..309A ; Mn # [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +-A66F ; Mn # COMBINING CYRILLIC VZMET +-A674..A67D ; Mn # [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK +-A69E..A69F ; Mn # [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E +-A6F0..A6F1 ; Mn # [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS +-A802 ; Mn # SYLOTI NAGRI SIGN DVISVARA +-A806 ; Mn # SYLOTI NAGRI SIGN HASANTA +-A80B ; Mn # SYLOTI NAGRI SIGN ANUSVARA +-A825..A826 ; Mn # [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E +-A82C ; Mn # SYLOTI NAGRI SIGN ALTERNATE HASANTA +-A8C4..A8C5 ; Mn # [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU +-A8E0..A8F1 ; Mn # [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA +-A8FF ; Mn # DEVANAGARI VOWEL SIGN AY +-A926..A92D ; Mn # [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU +-A947..A951 ; Mn # [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R +-A980..A982 ; Mn # [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR +-A9B3 ; Mn # JAVANESE SIGN CECAK TELU +-A9B6..A9B9 ; Mn # [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT +-A9BC..A9BD ; Mn # [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET +-A9E5 ; Mn # MYANMAR SIGN SHAN SAW +-AA29..AA2E ; Mn # [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE +-AA31..AA32 ; Mn # [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE +-AA35..AA36 ; Mn # [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA +-AA43 ; Mn # CHAM CONSONANT SIGN FINAL NG +-AA4C ; Mn # CHAM CONSONANT SIGN FINAL M +-AA7C ; Mn # MYANMAR SIGN TAI LAING TONE-2 +-AAB0 ; Mn # TAI VIET MAI KANG +-AAB2..AAB4 ; Mn # [3] TAI VIET VOWEL I..TAI VIET VOWEL U +-AAB7..AAB8 ; Mn # [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA +-AABE..AABF ; Mn # [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK +-AAC1 ; Mn # TAI VIET TONE MAI THO +-AAEC..AAED ; Mn # [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI +-AAF6 ; Mn # MEETEI MAYEK VIRAMA +-ABE5 ; Mn # MEETEI MAYEK VOWEL SIGN ANAP +-ABE8 ; Mn # MEETEI MAYEK VOWEL SIGN UNAP +-ABED ; Mn # MEETEI MAYEK APUN IYEK +-FB1E ; Mn # HEBREW POINT JUDEO-SPANISH VARIKA +-FE00..FE0F ; Mn # [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +-FE20..FE2F ; Mn # [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF +-101FD ; Mn # PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE +-102E0 ; Mn # COPTIC EPACT THOUSANDS MARK +-10376..1037A ; Mn # [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII +-10A01..10A03 ; Mn # [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R +-10A05..10A06 ; Mn # [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O +-10A0C..10A0F ; Mn # [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA +-10A38..10A3A ; Mn # [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW +-10A3F ; Mn # KHAROSHTHI VIRAMA +-10AE5..10AE6 ; Mn # [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW +-10D24..10D27 ; Mn # [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI +-10EAB..10EAC ; Mn # [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK +-10F46..10F50 ; Mn # [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW +-11001 ; Mn # BRAHMI SIGN ANUSVARA +-11038..11046 ; Mn # [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA +-1107F..11081 ; Mn # [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA +-110B3..110B6 ; Mn # [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI +-110B9..110BA ; Mn # [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA +-11100..11102 ; Mn # [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA +-11127..1112B ; Mn # [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU +-1112D..11134 ; Mn # [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA +-11173 ; Mn # MAHAJANI SIGN NUKTA +-11180..11181 ; Mn # [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA +-111B6..111BE ; Mn # [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O +-111C9..111CC ; Mn # [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK +-111CF ; Mn # SHARADA SIGN INVERTED CANDRABINDU +-1122F..11231 ; Mn # [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI +-11234 ; Mn # KHOJKI SIGN ANUSVARA +-11236..11237 ; Mn # [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA +-1123E ; Mn # KHOJKI SIGN SUKUN +-112DF ; Mn # KHUDAWADI SIGN ANUSVARA +-112E3..112EA ; Mn # [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA +-11300..11301 ; Mn # [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU +-1133B..1133C ; Mn # [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA +-11340 ; Mn # GRANTHA VOWEL SIGN II +-11366..1136C ; Mn # [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX +-11370..11374 ; Mn # [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA +-11438..1143F ; Mn # [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +-11442..11444 ; Mn # [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA +-11446 ; Mn # NEWA SIGN NUKTA +-1145E ; Mn # NEWA SANDHI MARK +-114B3..114B8 ; Mn # [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL +-114BA ; Mn # TIRHUTA VOWEL SIGN SHORT E +-114BF..114C0 ; Mn # [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA +-114C2..114C3 ; Mn # [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA +-115B2..115B5 ; Mn # [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR +-115BC..115BD ; Mn # [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA +-115BF..115C0 ; Mn # [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA +-115DC..115DD ; Mn # [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU +-11633..1163A ; Mn # [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI +-1163D ; Mn # MODI SIGN ANUSVARA +-1163F..11640 ; Mn # [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA +-116AB ; Mn # TAKRI SIGN ANUSVARA +-116AD ; Mn # TAKRI VOWEL SIGN AA +-116B0..116B5 ; Mn # [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU +-116B7 ; Mn # TAKRI SIGN NUKTA +-1171D..1171F ; Mn # [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA +-11722..11725 ; Mn # [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU +-11727..1172B ; Mn # [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +-1182F..11837 ; Mn # [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA +-11839..1183A ; Mn # [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA +-1193B..1193C ; Mn # [2] DIVES AKURU SIGN ANUSVARA..DIVES AKURU SIGN CANDRABINDU +-1193E ; Mn # DIVES AKURU VIRAMA +-11943 ; Mn # DIVES AKURU SIGN NUKTA +-119D4..119D7 ; Mn # [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR +-119DA..119DB ; Mn # [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI +-119E0 ; Mn # NANDINAGARI SIGN VIRAMA +-11A01..11A0A ; Mn # [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK +-11A33..11A38 ; Mn # [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA +-11A3B..11A3E ; Mn # [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +-11A47 ; Mn # ZANABAZAR SQUARE SUBJOINER +-11A51..11A56 ; Mn # [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +-11A59..11A5B ; Mn # [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +-11A8A..11A96 ; Mn # [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +-11A98..11A99 ; Mn # [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER +-11C30..11C36 ; Mn # [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +-11C38..11C3D ; Mn # [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +-11C3F ; Mn # BHAIKSUKI SIGN VIRAMA +-11C92..11CA7 ; Mn # [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +-11CAA..11CB0 ; Mn # [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +-11CB2..11CB3 ; Mn # [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +-11CB5..11CB6 ; Mn # [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU +-11D31..11D36 ; Mn # [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +-11D3A ; Mn # MASARAM GONDI VOWEL SIGN E +-11D3C..11D3D ; Mn # [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +-11D3F..11D45 ; Mn # [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA +-11D47 ; Mn # MASARAM GONDI RA-KARA +-11D90..11D91 ; Mn # [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI +-11D95 ; Mn # GUNJALA GONDI SIGN ANUSVARA +-11D97 ; Mn # GUNJALA GONDI VIRAMA +-11EF3..11EF4 ; Mn # [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U +-16AF0..16AF4 ; Mn # [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE +-16B30..16B36 ; Mn # [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM +-16F4F ; Mn # MIAO SIGN CONSONANT MODIFIER BAR +-16F8F..16F92 ; Mn # [4] MIAO TONE RIGHT..MIAO TONE BELOW +-16FE4 ; Mn # KHITAN SMALL SCRIPT FILLER +-1BC9D..1BC9E ; Mn # [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK +-1D167..1D169 ; Mn # [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +-1D17B..1D182 ; Mn # [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +-1D185..1D18B ; Mn # [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +-1D1AA..1D1AD ; Mn # [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +-1D242..1D244 ; Mn # [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME +-1DA00..1DA36 ; Mn # [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN +-1DA3B..1DA6C ; Mn # [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT +-1DA75 ; Mn # SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS +-1DA84 ; Mn # SIGNWRITING LOCATION HEAD NECK +-1DA9B..1DA9F ; Mn # [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 +-1DAA1..1DAAF ; Mn # [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 +-1E000..1E006 ; Mn # [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +-1E008..1E018 ; Mn # [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +-1E01B..1E021 ; Mn # [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +-1E023..1E024 ; Mn # [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +-1E026..1E02A ; Mn # [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +-1E130..1E136 ; Mn # [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D +-1E2EC..1E2EF ; Mn # [4] WANCHO TONE TUP..WANCHO TONE KOINI +-1E8D0..1E8D6 ; Mn # [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS +-1E944..1E94A ; Mn # [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA +-E0100..E01EF ; Mn # [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 +- +-# Total code points: 1839 +- +-# ================================================ +- +-# General_Category=Enclosing_Mark +- +-0488..0489 ; Me # [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN +-1ABE ; Me # COMBINING PARENTHESES OVERLAY +-20DD..20E0 ; Me # [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH +-20E2..20E4 ; Me # [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE +-A670..A672 ; Me # [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN +- +-# Total code points: 13 +- +-# ================================================ +- +-# General_Category=Spacing_Mark +- +-0903 ; Mc # DEVANAGARI SIGN VISARGA +-093B ; Mc # DEVANAGARI VOWEL SIGN OOE +-093E..0940 ; Mc # [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II +-0949..094C ; Mc # [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU +-094E..094F ; Mc # [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW +-0982..0983 ; Mc # [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA +-09BE..09C0 ; Mc # [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II +-09C7..09C8 ; Mc # [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI +-09CB..09CC ; Mc # [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +-09D7 ; Mc # BENGALI AU LENGTH MARK +-0A03 ; Mc # GURMUKHI SIGN VISARGA +-0A3E..0A40 ; Mc # [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II +-0A83 ; Mc # GUJARATI SIGN VISARGA +-0ABE..0AC0 ; Mc # [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II +-0AC9 ; Mc # GUJARATI VOWEL SIGN CANDRA O +-0ACB..0ACC ; Mc # [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU +-0B02..0B03 ; Mc # [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA +-0B3E ; Mc # ORIYA VOWEL SIGN AA +-0B40 ; Mc # ORIYA VOWEL SIGN II +-0B47..0B48 ; Mc # [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI +-0B4B..0B4C ; Mc # [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU +-0B57 ; Mc # ORIYA AU LENGTH MARK +-0BBE..0BBF ; Mc # [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I +-0BC1..0BC2 ; Mc # [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU +-0BC6..0BC8 ; Mc # [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI +-0BCA..0BCC ; Mc # [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU +-0BD7 ; Mc # TAMIL AU LENGTH MARK +-0C01..0C03 ; Mc # [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +-0C41..0C44 ; Mc # [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR +-0C82..0C83 ; Mc # [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA +-0CBE ; Mc # KANNADA VOWEL SIGN AA +-0CC0..0CC4 ; Mc # [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR +-0CC7..0CC8 ; Mc # [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +-0CCA..0CCB ; Mc # [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +-0CD5..0CD6 ; Mc # [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +-0D02..0D03 ; Mc # [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA +-0D3E..0D40 ; Mc # [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II +-0D46..0D48 ; Mc # [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +-0D4A..0D4C ; Mc # [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU +-0D57 ; Mc # MALAYALAM AU LENGTH MARK +-0D82..0D83 ; Mc # [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA +-0DCF..0DD1 ; Mc # [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA +-0DD8..0DDF ; Mc # [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA +-0DF2..0DF3 ; Mc # [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +-0F3E..0F3F ; Mc # [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES +-0F7F ; Mc # TIBETAN SIGN RNAM BCAD +-102B..102C ; Mc # [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA +-1031 ; Mc # MYANMAR VOWEL SIGN E +-1038 ; Mc # MYANMAR SIGN VISARGA +-103B..103C ; Mc # [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA +-1056..1057 ; Mc # [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR +-1062..1064 ; Mc # [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO +-1067..106D ; Mc # [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 +-1083..1084 ; Mc # [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E +-1087..108C ; Mc # [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 +-108F ; Mc # MYANMAR SIGN RUMAI PALAUNG TONE-5 +-109A..109C ; Mc # [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A +-17B6 ; Mc # KHMER VOWEL SIGN AA +-17BE..17C5 ; Mc # [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU +-17C7..17C8 ; Mc # [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU +-1923..1926 ; Mc # [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU +-1929..192B ; Mc # [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA +-1930..1931 ; Mc # [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA +-1933..1938 ; Mc # [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA +-1A19..1A1A ; Mc # [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O +-1A55 ; Mc # TAI THAM CONSONANT SIGN MEDIAL RA +-1A57 ; Mc # TAI THAM CONSONANT SIGN LA TANG LAI +-1A61 ; Mc # TAI THAM VOWEL SIGN A +-1A63..1A64 ; Mc # [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA +-1A6D..1A72 ; Mc # [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI +-1B04 ; Mc # BALINESE SIGN BISAH +-1B35 ; Mc # BALINESE VOWEL SIGN TEDUNG +-1B3B ; Mc # BALINESE VOWEL SIGN RA REPA TEDUNG +-1B3D..1B41 ; Mc # [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG +-1B43..1B44 ; Mc # [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG +-1B82 ; Mc # SUNDANESE SIGN PANGWISAD +-1BA1 ; Mc # SUNDANESE CONSONANT SIGN PAMINGKAL +-1BA6..1BA7 ; Mc # [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG +-1BAA ; Mc # SUNDANESE SIGN PAMAAEH +-1BE7 ; Mc # BATAK VOWEL SIGN E +-1BEA..1BEC ; Mc # [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O +-1BEE ; Mc # BATAK VOWEL SIGN U +-1BF2..1BF3 ; Mc # [2] BATAK PANGOLAT..BATAK PANONGONAN +-1C24..1C2B ; Mc # [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU +-1C34..1C35 ; Mc # [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG +-1CE1 ; Mc # VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA +-1CF7 ; Mc # VEDIC SIGN ATIKRAMA +-302E..302F ; Mc # [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK +-A823..A824 ; Mc # [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I +-A827 ; Mc # SYLOTI NAGRI VOWEL SIGN OO +-A880..A881 ; Mc # [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA +-A8B4..A8C3 ; Mc # [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU +-A952..A953 ; Mc # [2] REJANG CONSONANT SIGN H..REJANG VIRAMA +-A983 ; Mc # JAVANESE SIGN WIGNYAN +-A9B4..A9B5 ; Mc # [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG +-A9BA..A9BB ; Mc # [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE +-A9BE..A9C0 ; Mc # [3] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE PANGKON +-AA2F..AA30 ; Mc # [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI +-AA33..AA34 ; Mc # [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA +-AA4D ; Mc # CHAM CONSONANT SIGN FINAL H +-AA7B ; Mc # MYANMAR SIGN PAO KAREN TONE +-AA7D ; Mc # MYANMAR SIGN TAI LAING TONE-5 +-AAEB ; Mc # MEETEI MAYEK VOWEL SIGN II +-AAEE..AAEF ; Mc # [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU +-AAF5 ; Mc # MEETEI MAYEK VOWEL SIGN VISARGA +-ABE3..ABE4 ; Mc # [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP +-ABE6..ABE7 ; Mc # [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP +-ABE9..ABEA ; Mc # [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG +-ABEC ; Mc # MEETEI MAYEK LUM IYEK +-11000 ; Mc # BRAHMI SIGN CANDRABINDU +-11002 ; Mc # BRAHMI SIGN VISARGA +-11082 ; Mc # KAITHI SIGN VISARGA +-110B0..110B2 ; Mc # [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II +-110B7..110B8 ; Mc # [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU +-1112C ; Mc # CHAKMA VOWEL SIGN E +-11145..11146 ; Mc # [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI +-11182 ; Mc # SHARADA SIGN VISARGA +-111B3..111B5 ; Mc # [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II +-111BF..111C0 ; Mc # [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA +-111CE ; Mc # SHARADA VOWEL SIGN PRISHTHAMATRA E +-1122C..1122E ; Mc # [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II +-11232..11233 ; Mc # [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU +-11235 ; Mc # KHOJKI SIGN VIRAMA +-112E0..112E2 ; Mc # [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II +-11302..11303 ; Mc # [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA +-1133E..1133F ; Mc # [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I +-11341..11344 ; Mc # [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR +-11347..11348 ; Mc # [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI +-1134B..1134D ; Mc # [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA +-11357 ; Mc # GRANTHA AU LENGTH MARK +-11362..11363 ; Mc # [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL +-11435..11437 ; Mc # [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +-11440..11441 ; Mc # [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +-11445 ; Mc # NEWA SIGN VISARGA +-114B0..114B2 ; Mc # [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II +-114B9 ; Mc # TIRHUTA VOWEL SIGN E +-114BB..114BE ; Mc # [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU +-114C1 ; Mc # TIRHUTA SIGN VISARGA +-115AF..115B1 ; Mc # [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II +-115B8..115BB ; Mc # [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU +-115BE ; Mc # SIDDHAM SIGN VISARGA +-11630..11632 ; Mc # [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II +-1163B..1163C ; Mc # [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU +-1163E ; Mc # MODI SIGN VISARGA +-116AC ; Mc # TAKRI SIGN VISARGA +-116AE..116AF ; Mc # [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II +-116B6 ; Mc # TAKRI SIGN VIRAMA +-11720..11721 ; Mc # [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA +-11726 ; Mc # AHOM VOWEL SIGN E +-1182C..1182E ; Mc # [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II +-11838 ; Mc # DOGRA SIGN VISARGA +-11930..11935 ; Mc # [6] DIVES AKURU VOWEL SIGN AA..DIVES AKURU VOWEL SIGN E +-11937..11938 ; Mc # [2] DIVES AKURU VOWEL SIGN AI..DIVES AKURU VOWEL SIGN O +-1193D ; Mc # DIVES AKURU SIGN HALANTA +-11940 ; Mc # DIVES AKURU MEDIAL YA +-11942 ; Mc # DIVES AKURU MEDIAL RA +-119D1..119D3 ; Mc # [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II +-119DC..119DF ; Mc # [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA +-119E4 ; Mc # NANDINAGARI VOWEL SIGN PRISHTHAMATRA E +-11A39 ; Mc # ZANABAZAR SQUARE SIGN VISARGA +-11A57..11A58 ; Mc # [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +-11A97 ; Mc # SOYOMBO SIGN VISARGA +-11C2F ; Mc # BHAIKSUKI VOWEL SIGN AA +-11C3E ; Mc # BHAIKSUKI SIGN VISARGA +-11CA9 ; Mc # MARCHEN SUBJOINED LETTER YA +-11CB1 ; Mc # MARCHEN VOWEL SIGN I +-11CB4 ; Mc # MARCHEN VOWEL SIGN O +-11D8A..11D8E ; Mc # [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU +-11D93..11D94 ; Mc # [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU +-11D96 ; Mc # GUNJALA GONDI SIGN VISARGA +-11EF5..11EF6 ; Mc # [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O +-16F51..16F87 ; Mc # [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI +-16FF0..16FF1 ; Mc # [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY +-1D165..1D166 ; Mc # [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +-1D16D..1D172 ; Mc # [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 +- +-# Total code points: 443 +- +-# ================================================ +- +-# General_Category=Decimal_Number +- +-0030..0039 ; Nd # [10] DIGIT ZERO..DIGIT NINE +-0660..0669 ; Nd # [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE +-06F0..06F9 ; Nd # [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE +-07C0..07C9 ; Nd # [10] NKO DIGIT ZERO..NKO DIGIT NINE +-0966..096F ; Nd # [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE +-09E6..09EF ; Nd # [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE +-0A66..0A6F ; Nd # [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE +-0AE6..0AEF ; Nd # [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE +-0B66..0B6F ; Nd # [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE +-0BE6..0BEF ; Nd # [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE +-0C66..0C6F ; Nd # [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE +-0CE6..0CEF ; Nd # [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE +-0D66..0D6F ; Nd # [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE +-0DE6..0DEF ; Nd # [10] SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE +-0E50..0E59 ; Nd # [10] THAI DIGIT ZERO..THAI DIGIT NINE +-0ED0..0ED9 ; Nd # [10] LAO DIGIT ZERO..LAO DIGIT NINE +-0F20..0F29 ; Nd # [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE +-1040..1049 ; Nd # [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE +-1090..1099 ; Nd # [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE +-17E0..17E9 ; Nd # [10] KHMER DIGIT ZERO..KHMER DIGIT NINE +-1810..1819 ; Nd # [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE +-1946..194F ; Nd # [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE +-19D0..19D9 ; Nd # [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE +-1A80..1A89 ; Nd # [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE +-1A90..1A99 ; Nd # [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE +-1B50..1B59 ; Nd # [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE +-1BB0..1BB9 ; Nd # [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE +-1C40..1C49 ; Nd # [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE +-1C50..1C59 ; Nd # [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE +-A620..A629 ; Nd # [10] VAI DIGIT ZERO..VAI DIGIT NINE +-A8D0..A8D9 ; Nd # [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE +-A900..A909 ; Nd # [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE +-A9D0..A9D9 ; Nd # [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE +-A9F0..A9F9 ; Nd # [10] MYANMAR TAI LAING DIGIT ZERO..MYANMAR TAI LAING DIGIT NINE +-AA50..AA59 ; Nd # [10] CHAM DIGIT ZERO..CHAM DIGIT NINE +-ABF0..ABF9 ; Nd # [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE +-FF10..FF19 ; Nd # [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE +-104A0..104A9 ; Nd # [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE +-10D30..10D39 ; Nd # [10] HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE +-11066..1106F ; Nd # [10] BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE +-110F0..110F9 ; Nd # [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE +-11136..1113F ; Nd # [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE +-111D0..111D9 ; Nd # [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE +-112F0..112F9 ; Nd # [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE +-11450..11459 ; Nd # [10] NEWA DIGIT ZERO..NEWA DIGIT NINE +-114D0..114D9 ; Nd # [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE +-11650..11659 ; Nd # [10] MODI DIGIT ZERO..MODI DIGIT NINE +-116C0..116C9 ; Nd # [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE +-11730..11739 ; Nd # [10] AHOM DIGIT ZERO..AHOM DIGIT NINE +-118E0..118E9 ; Nd # [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE +-11950..11959 ; Nd # [10] DIVES AKURU DIGIT ZERO..DIVES AKURU DIGIT NINE +-11C50..11C59 ; Nd # [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE +-11D50..11D59 ; Nd # [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE +-11DA0..11DA9 ; Nd # [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE +-16A60..16A69 ; Nd # [10] MRO DIGIT ZERO..MRO DIGIT NINE +-16B50..16B59 ; Nd # [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE +-1D7CE..1D7FF ; Nd # [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +-1E140..1E149 ; Nd # [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE +-1E2F0..1E2F9 ; Nd # [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE +-1E950..1E959 ; Nd # [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE +-1FBF0..1FBF9 ; Nd # [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE +- +-# Total code points: 650 +- +-# ================================================ +- +-# General_Category=Letter_Number +- +-16EE..16F0 ; Nl # [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL +-2160..2182 ; Nl # [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND +-2185..2188 ; Nl # [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND +-3007 ; Nl # IDEOGRAPHIC NUMBER ZERO +-3021..3029 ; Nl # [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +-3038..303A ; Nl # [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +-A6E6..A6EF ; Nl # [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM +-10140..10174 ; Nl # [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS +-10341 ; Nl # GOTHIC LETTER NINETY +-1034A ; Nl # GOTHIC LETTER NINE HUNDRED +-103D1..103D5 ; Nl # [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED +-12400..1246E ; Nl # [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +- +-# Total code points: 236 +- +-# ================================================ +- +-# General_Category=Other_Number +- +-00B2..00B3 ; No # [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE +-00B9 ; No # SUPERSCRIPT ONE +-00BC..00BE ; No # [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS +-09F4..09F9 ; No # [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN +-0B72..0B77 ; No # [6] ORIYA FRACTION ONE QUARTER..ORIYA FRACTION THREE SIXTEENTHS +-0BF0..0BF2 ; No # [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND +-0C78..0C7E ; No # [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR +-0D58..0D5E ; No # [7] MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH +-0D70..0D78 ; No # [9] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE SIXTEENTHS +-0F2A..0F33 ; No # [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO +-1369..137C ; No # [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND +-17F0..17F9 ; No # [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON +-19DA ; No # NEW TAI LUE THAM DIGIT ONE +-2070 ; No # SUPERSCRIPT ZERO +-2074..2079 ; No # [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE +-2080..2089 ; No # [10] SUBSCRIPT ZERO..SUBSCRIPT NINE +-2150..215F ; No # [16] VULGAR FRACTION ONE SEVENTH..FRACTION NUMERATOR ONE +-2189 ; No # VULGAR FRACTION ZERO THIRDS +-2460..249B ; No # [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP +-24EA..24FF ; No # [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO +-2776..2793 ; No # [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +-2CFD ; No # COPTIC FRACTION ONE HALF +-3192..3195 ; No # [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK +-3220..3229 ; No # [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN +-3248..324F ; No # [8] CIRCLED NUMBER TEN ON BLACK SQUARE..CIRCLED NUMBER EIGHTY ON BLACK SQUARE +-3251..325F ; No # [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE +-3280..3289 ; No # [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN +-32B1..32BF ; No # [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY +-A830..A835 ; No # [6] NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC FRACTION THREE SIXTEENTHS +-10107..10133 ; No # [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND +-10175..10178 ; No # [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN +-1018A..1018B ; No # [2] GREEK ZERO SIGN..GREEK ONE QUARTER SIGN +-102E1..102FB ; No # [27] COPTIC EPACT DIGIT ONE..COPTIC EPACT NUMBER NINE HUNDRED +-10320..10323 ; No # [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY +-10858..1085F ; No # [8] IMPERIAL ARAMAIC NUMBER ONE..IMPERIAL ARAMAIC NUMBER TEN THOUSAND +-10879..1087F ; No # [7] PALMYRENE NUMBER ONE..PALMYRENE NUMBER TWENTY +-108A7..108AF ; No # [9] NABATAEAN NUMBER ONE..NABATAEAN NUMBER ONE HUNDRED +-108FB..108FF ; No # [5] HATRAN NUMBER ONE..HATRAN NUMBER ONE HUNDRED +-10916..1091B ; No # [6] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER THREE +-109BC..109BD ; No # [2] MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS..MEROITIC CURSIVE FRACTION ONE HALF +-109C0..109CF ; No # [16] MEROITIC CURSIVE NUMBER ONE..MEROITIC CURSIVE NUMBER SEVENTY +-109D2..109FF ; No # [46] MEROITIC CURSIVE NUMBER ONE HUNDRED..MEROITIC CURSIVE FRACTION TEN TWELFTHS +-10A40..10A48 ; No # [9] KHAROSHTHI DIGIT ONE..KHAROSHTHI FRACTION ONE HALF +-10A7D..10A7E ; No # [2] OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMBER FIFTY +-10A9D..10A9F ; No # [3] OLD NORTH ARABIAN NUMBER ONE..OLD NORTH ARABIAN NUMBER TWENTY +-10AEB..10AEF ; No # [5] MANICHAEAN NUMBER ONE..MANICHAEAN NUMBER ONE HUNDRED +-10B58..10B5F ; No # [8] INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND +-10B78..10B7F ; No # [8] INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND +-10BA9..10BAF ; No # [7] PSALTER PAHLAVI NUMBER ONE..PSALTER PAHLAVI NUMBER ONE HUNDRED +-10CFA..10CFF ; No # [6] OLD HUNGARIAN NUMBER ONE..OLD HUNGARIAN NUMBER ONE THOUSAND +-10E60..10E7E ; No # [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS +-10F1D..10F26 ; No # [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF +-10F51..10F54 ; No # [4] SOGDIAN NUMBER ONE..SOGDIAN NUMBER ONE HUNDRED +-10FC5..10FCB ; No # [7] CHORASMIAN NUMBER ONE..CHORASMIAN NUMBER ONE HUNDRED +-11052..11065 ; No # [20] BRAHMI NUMBER ONE..BRAHMI NUMBER ONE THOUSAND +-111E1..111F4 ; No # [20] SINHALA ARCHAIC DIGIT ONE..SINHALA ARCHAIC NUMBER ONE THOUSAND +-1173A..1173B ; No # [2] AHOM NUMBER TEN..AHOM NUMBER TWENTY +-118EA..118F2 ; No # [9] WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY +-11C5A..11C6C ; No # [19] BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK +-11FC0..11FD4 ; No # [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH +-16B5B..16B61 ; No # [7] PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS +-16E80..16E96 ; No # [23] MEDEFAIDRIN DIGIT ZERO..MEDEFAIDRIN DIGIT THREE ALTERNATE FORM +-1D2E0..1D2F3 ; No # [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN +-1D360..1D378 ; No # [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE +-1E8C7..1E8CF ; No # [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE +-1EC71..1ECAB ; No # [59] INDIC SIYAQ NUMBER ONE..INDIC SIYAQ NUMBER PREFIXED NINE +-1ECAD..1ECAF ; No # [3] INDIC SIYAQ FRACTION ONE QUARTER..INDIC SIYAQ FRACTION THREE QUARTERS +-1ECB1..1ECB4 ; No # [4] INDIC SIYAQ NUMBER ALTERNATE ONE..INDIC SIYAQ ALTERNATE LAKH MARK +-1ED01..1ED2D ; No # [45] OTTOMAN SIYAQ NUMBER ONE..OTTOMAN SIYAQ NUMBER NINETY THOUSAND +-1ED2F..1ED3D ; No # [15] OTTOMAN SIYAQ ALTERNATE NUMBER TWO..OTTOMAN SIYAQ FRACTION ONE SIXTH +-1F100..1F10C ; No # [13] DIGIT ZERO FULL STOP..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO +- +-# Total code points: 895 +- +-# ================================================ +- +-# General_Category=Space_Separator +- +-0020 ; Zs # SPACE +-00A0 ; Zs # NO-BREAK SPACE +-1680 ; Zs # OGHAM SPACE MARK +-2000..200A ; Zs # [11] EN QUAD..HAIR SPACE +-202F ; Zs # NARROW NO-BREAK SPACE +-205F ; Zs # MEDIUM MATHEMATICAL SPACE +-3000 ; Zs # IDEOGRAPHIC SPACE +- +-# Total code points: 17 +- +-# ================================================ +- +-# General_Category=Line_Separator +- +-2028 ; Zl # LINE SEPARATOR +- +-# Total code points: 1 +- +-# ================================================ +- +-# General_Category=Paragraph_Separator +- +-2029 ; Zp # PARAGRAPH SEPARATOR +- +-# Total code points: 1 +- +-# ================================================ +- +-# General_Category=Control +- +-0000..001F ; Cc # [32] .. +-007F..009F ; Cc # [33] .. +- +-# Total code points: 65 +- +-# ================================================ +- +-# General_Category=Format +- +-00AD ; Cf # SOFT HYPHEN +-0600..0605 ; Cf # [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE +-061C ; Cf # ARABIC LETTER MARK +-06DD ; Cf # ARABIC END OF AYAH +-070F ; Cf # SYRIAC ABBREVIATION MARK +-08E2 ; Cf # ARABIC DISPUTED END OF AYAH +-180E ; Cf # MONGOLIAN VOWEL SEPARATOR +-200B..200F ; Cf # [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK +-202A..202E ; Cf # [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE +-2060..2064 ; Cf # [5] WORD JOINER..INVISIBLE PLUS +-2066..206F ; Cf # [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES +-FEFF ; Cf # ZERO WIDTH NO-BREAK SPACE +-FFF9..FFFB ; Cf # [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR +-110BD ; Cf # KAITHI NUMBER SIGN +-110CD ; Cf # KAITHI NUMBER SIGN ABOVE +-13430..13438 ; Cf # [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT +-1BCA0..1BCA3 ; Cf # [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP +-1D173..1D17A ; Cf # [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE +-E0001 ; Cf # LANGUAGE TAG +-E0020..E007F ; Cf # [96] TAG SPACE..CANCEL TAG +- +-# Total code points: 161 +- +-# ================================================ +- +-# General_Category=Private_Use +- +-E000..F8FF ; Co # [6400] .. +-F0000..FFFFD ; Co # [65534] .. +-100000..10FFFD; Co # [65534] .. +- +-# Total code points: 137468 +- +-# ================================================ +- +-# General_Category=Surrogate +- +-D800..DFFF ; Cs # [2048] .. +- +-# Total code points: 2048 +- +-# ================================================ +- +-# General_Category=Dash_Punctuation +- +-002D ; Pd # HYPHEN-MINUS +-058A ; Pd # ARMENIAN HYPHEN +-05BE ; Pd # HEBREW PUNCTUATION MAQAF +-1400 ; Pd # CANADIAN SYLLABICS HYPHEN +-1806 ; Pd # MONGOLIAN TODO SOFT HYPHEN +-2010..2015 ; Pd # [6] HYPHEN..HORIZONTAL BAR +-2E17 ; Pd # DOUBLE OBLIQUE HYPHEN +-2E1A ; Pd # HYPHEN WITH DIAERESIS +-2E3A..2E3B ; Pd # [2] TWO-EM DASH..THREE-EM DASH +-2E40 ; Pd # DOUBLE HYPHEN +-301C ; Pd # WAVE DASH +-3030 ; Pd # WAVY DASH +-30A0 ; Pd # KATAKANA-HIRAGANA DOUBLE HYPHEN +-FE31..FE32 ; Pd # [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH +-FE58 ; Pd # SMALL EM DASH +-FE63 ; Pd # SMALL HYPHEN-MINUS +-FF0D ; Pd # FULLWIDTH HYPHEN-MINUS +-10EAD ; Pd # YEZIDI HYPHENATION MARK +- +-# Total code points: 25 +- +-# ================================================ +- +-# General_Category=Open_Punctuation +- +-0028 ; Ps # LEFT PARENTHESIS +-005B ; Ps # LEFT SQUARE BRACKET +-007B ; Ps # LEFT CURLY BRACKET +-0F3A ; Ps # TIBETAN MARK GUG RTAGS GYON +-0F3C ; Ps # TIBETAN MARK ANG KHANG GYON +-169B ; Ps # OGHAM FEATHER MARK +-201A ; Ps # SINGLE LOW-9 QUOTATION MARK +-201E ; Ps # DOUBLE LOW-9 QUOTATION MARK +-2045 ; Ps # LEFT SQUARE BRACKET WITH QUILL +-207D ; Ps # SUPERSCRIPT LEFT PARENTHESIS +-208D ; Ps # SUBSCRIPT LEFT PARENTHESIS +-2308 ; Ps # LEFT CEILING +-230A ; Ps # LEFT FLOOR +-2329 ; Ps # LEFT-POINTING ANGLE BRACKET +-2768 ; Ps # MEDIUM LEFT PARENTHESIS ORNAMENT +-276A ; Ps # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +-276C ; Ps # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +-276E ; Ps # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +-2770 ; Ps # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +-2772 ; Ps # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +-2774 ; Ps # MEDIUM LEFT CURLY BRACKET ORNAMENT +-27C5 ; Ps # LEFT S-SHAPED BAG DELIMITER +-27E6 ; Ps # MATHEMATICAL LEFT WHITE SQUARE BRACKET +-27E8 ; Ps # MATHEMATICAL LEFT ANGLE BRACKET +-27EA ; Ps # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +-27EC ; Ps # MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +-27EE ; Ps # MATHEMATICAL LEFT FLATTENED PARENTHESIS +-2983 ; Ps # LEFT WHITE CURLY BRACKET +-2985 ; Ps # LEFT WHITE PARENTHESIS +-2987 ; Ps # Z NOTATION LEFT IMAGE BRACKET +-2989 ; Ps # Z NOTATION LEFT BINDING BRACKET +-298B ; Ps # LEFT SQUARE BRACKET WITH UNDERBAR +-298D ; Ps # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +-298F ; Ps # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +-2991 ; Ps # LEFT ANGLE BRACKET WITH DOT +-2993 ; Ps # LEFT ARC LESS-THAN BRACKET +-2995 ; Ps # DOUBLE LEFT ARC GREATER-THAN BRACKET +-2997 ; Ps # LEFT BLACK TORTOISE SHELL BRACKET +-29D8 ; Ps # LEFT WIGGLY FENCE +-29DA ; Ps # LEFT DOUBLE WIGGLY FENCE +-29FC ; Ps # LEFT-POINTING CURVED ANGLE BRACKET +-2E22 ; Ps # TOP LEFT HALF BRACKET +-2E24 ; Ps # BOTTOM LEFT HALF BRACKET +-2E26 ; Ps # LEFT SIDEWAYS U BRACKET +-2E28 ; Ps # LEFT DOUBLE PARENTHESIS +-2E42 ; Ps # DOUBLE LOW-REVERSED-9 QUOTATION MARK +-3008 ; Ps # LEFT ANGLE BRACKET +-300A ; Ps # LEFT DOUBLE ANGLE BRACKET +-300C ; Ps # LEFT CORNER BRACKET +-300E ; Ps # LEFT WHITE CORNER BRACKET +-3010 ; Ps # LEFT BLACK LENTICULAR BRACKET +-3014 ; Ps # LEFT TORTOISE SHELL BRACKET +-3016 ; Ps # LEFT WHITE LENTICULAR BRACKET +-3018 ; Ps # LEFT WHITE TORTOISE SHELL BRACKET +-301A ; Ps # LEFT WHITE SQUARE BRACKET +-301D ; Ps # REVERSED DOUBLE PRIME QUOTATION MARK +-FD3F ; Ps # ORNATE RIGHT PARENTHESIS +-FE17 ; Ps # PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET +-FE35 ; Ps # PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +-FE37 ; Ps # PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +-FE39 ; Ps # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +-FE3B ; Ps # PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +-FE3D ; Ps # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +-FE3F ; Ps # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +-FE41 ; Ps # PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +-FE43 ; Ps # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +-FE47 ; Ps # PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +-FE59 ; Ps # SMALL LEFT PARENTHESIS +-FE5B ; Ps # SMALL LEFT CURLY BRACKET +-FE5D ; Ps # SMALL LEFT TORTOISE SHELL BRACKET +-FF08 ; Ps # FULLWIDTH LEFT PARENTHESIS +-FF3B ; Ps # FULLWIDTH LEFT SQUARE BRACKET +-FF5B ; Ps # FULLWIDTH LEFT CURLY BRACKET +-FF5F ; Ps # FULLWIDTH LEFT WHITE PARENTHESIS +-FF62 ; Ps # HALFWIDTH LEFT CORNER BRACKET +- +-# Total code points: 75 +- +-# ================================================ +- +-# General_Category=Close_Punctuation +- +-0029 ; Pe # RIGHT PARENTHESIS +-005D ; Pe # RIGHT SQUARE BRACKET +-007D ; Pe # RIGHT CURLY BRACKET +-0F3B ; Pe # TIBETAN MARK GUG RTAGS GYAS +-0F3D ; Pe # TIBETAN MARK ANG KHANG GYAS +-169C ; Pe # OGHAM REVERSED FEATHER MARK +-2046 ; Pe # RIGHT SQUARE BRACKET WITH QUILL +-207E ; Pe # SUPERSCRIPT RIGHT PARENTHESIS +-208E ; Pe # SUBSCRIPT RIGHT PARENTHESIS +-2309 ; Pe # RIGHT CEILING +-230B ; Pe # RIGHT FLOOR +-232A ; Pe # RIGHT-POINTING ANGLE BRACKET +-2769 ; Pe # MEDIUM RIGHT PARENTHESIS ORNAMENT +-276B ; Pe # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +-276D ; Pe # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +-276F ; Pe # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +-2771 ; Pe # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +-2773 ; Pe # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +-2775 ; Pe # MEDIUM RIGHT CURLY BRACKET ORNAMENT +-27C6 ; Pe # RIGHT S-SHAPED BAG DELIMITER +-27E7 ; Pe # MATHEMATICAL RIGHT WHITE SQUARE BRACKET +-27E9 ; Pe # MATHEMATICAL RIGHT ANGLE BRACKET +-27EB ; Pe # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +-27ED ; Pe # MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +-27EF ; Pe # MATHEMATICAL RIGHT FLATTENED PARENTHESIS +-2984 ; Pe # RIGHT WHITE CURLY BRACKET +-2986 ; Pe # RIGHT WHITE PARENTHESIS +-2988 ; Pe # Z NOTATION RIGHT IMAGE BRACKET +-298A ; Pe # Z NOTATION RIGHT BINDING BRACKET +-298C ; Pe # RIGHT SQUARE BRACKET WITH UNDERBAR +-298E ; Pe # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +-2990 ; Pe # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +-2992 ; Pe # RIGHT ANGLE BRACKET WITH DOT +-2994 ; Pe # RIGHT ARC GREATER-THAN BRACKET +-2996 ; Pe # DOUBLE RIGHT ARC LESS-THAN BRACKET +-2998 ; Pe # RIGHT BLACK TORTOISE SHELL BRACKET +-29D9 ; Pe # RIGHT WIGGLY FENCE +-29DB ; Pe # RIGHT DOUBLE WIGGLY FENCE +-29FD ; Pe # RIGHT-POINTING CURVED ANGLE BRACKET +-2E23 ; Pe # TOP RIGHT HALF BRACKET +-2E25 ; Pe # BOTTOM RIGHT HALF BRACKET +-2E27 ; Pe # RIGHT SIDEWAYS U BRACKET +-2E29 ; Pe # RIGHT DOUBLE PARENTHESIS +-3009 ; Pe # RIGHT ANGLE BRACKET +-300B ; Pe # RIGHT DOUBLE ANGLE BRACKET +-300D ; Pe # RIGHT CORNER BRACKET +-300F ; Pe # RIGHT WHITE CORNER BRACKET +-3011 ; Pe # RIGHT BLACK LENTICULAR BRACKET +-3015 ; Pe # RIGHT TORTOISE SHELL BRACKET +-3017 ; Pe # RIGHT WHITE LENTICULAR BRACKET +-3019 ; Pe # RIGHT WHITE TORTOISE SHELL BRACKET +-301B ; Pe # RIGHT WHITE SQUARE BRACKET +-301E..301F ; Pe # [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK +-FD3E ; Pe # ORNATE LEFT PARENTHESIS +-FE18 ; Pe # PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET +-FE36 ; Pe # PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +-FE38 ; Pe # PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +-FE3A ; Pe # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +-FE3C ; Pe # PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +-FE3E ; Pe # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +-FE40 ; Pe # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +-FE42 ; Pe # PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +-FE44 ; Pe # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +-FE48 ; Pe # PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +-FE5A ; Pe # SMALL RIGHT PARENTHESIS +-FE5C ; Pe # SMALL RIGHT CURLY BRACKET +-FE5E ; Pe # SMALL RIGHT TORTOISE SHELL BRACKET +-FF09 ; Pe # FULLWIDTH RIGHT PARENTHESIS +-FF3D ; Pe # FULLWIDTH RIGHT SQUARE BRACKET +-FF5D ; Pe # FULLWIDTH RIGHT CURLY BRACKET +-FF60 ; Pe # FULLWIDTH RIGHT WHITE PARENTHESIS +-FF63 ; Pe # HALFWIDTH RIGHT CORNER BRACKET +- +-# Total code points: 73 +- +-# ================================================ +- +-# General_Category=Connector_Punctuation +- +-005F ; Pc # LOW LINE +-203F..2040 ; Pc # [2] UNDERTIE..CHARACTER TIE +-2054 ; Pc # INVERTED UNDERTIE +-FE33..FE34 ; Pc # [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +-FE4D..FE4F ; Pc # [3] DASHED LOW LINE..WAVY LOW LINE +-FF3F ; Pc # FULLWIDTH LOW LINE +- +-# Total code points: 10 +- +-# ================================================ +- +-# General_Category=Other_Punctuation +- +-0021..0023 ; Po # [3] EXCLAMATION MARK..NUMBER SIGN +-0025..0027 ; Po # [3] PERCENT SIGN..APOSTROPHE +-002A ; Po # ASTERISK +-002C ; Po # COMMA +-002E..002F ; Po # [2] FULL STOP..SOLIDUS +-003A..003B ; Po # [2] COLON..SEMICOLON +-003F..0040 ; Po # [2] QUESTION MARK..COMMERCIAL AT +-005C ; Po # REVERSE SOLIDUS +-00A1 ; Po # INVERTED EXCLAMATION MARK +-00A7 ; Po # SECTION SIGN +-00B6..00B7 ; Po # [2] PILCROW SIGN..MIDDLE DOT +-00BF ; Po # INVERTED QUESTION MARK +-037E ; Po # GREEK QUESTION MARK +-0387 ; Po # GREEK ANO TELEIA +-055A..055F ; Po # [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK +-0589 ; Po # ARMENIAN FULL STOP +-05C0 ; Po # HEBREW PUNCTUATION PASEQ +-05C3 ; Po # HEBREW PUNCTUATION SOF PASUQ +-05C6 ; Po # HEBREW PUNCTUATION NUN HAFUKHA +-05F3..05F4 ; Po # [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM +-0609..060A ; Po # [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN +-060C..060D ; Po # [2] ARABIC COMMA..ARABIC DATE SEPARATOR +-061B ; Po # ARABIC SEMICOLON +-061E..061F ; Po # [2] ARABIC TRIPLE DOT PUNCTUATION MARK..ARABIC QUESTION MARK +-066A..066D ; Po # [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR +-06D4 ; Po # ARABIC FULL STOP +-0700..070D ; Po # [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS +-07F7..07F9 ; Po # [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK +-0830..083E ; Po # [15] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU +-085E ; Po # MANDAIC PUNCTUATION +-0964..0965 ; Po # [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +-0970 ; Po # DEVANAGARI ABBREVIATION SIGN +-09FD ; Po # BENGALI ABBREVIATION SIGN +-0A76 ; Po # GURMUKHI ABBREVIATION SIGN +-0AF0 ; Po # GUJARATI ABBREVIATION SIGN +-0C77 ; Po # TELUGU SIGN SIDDHAM +-0C84 ; Po # KANNADA SIGN SIDDHAM +-0DF4 ; Po # SINHALA PUNCTUATION KUNDDALIYA +-0E4F ; Po # THAI CHARACTER FONGMAN +-0E5A..0E5B ; Po # [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT +-0F04..0F12 ; Po # [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD +-0F14 ; Po # TIBETAN MARK GTER TSHEG +-0F85 ; Po # TIBETAN MARK PALUTA +-0FD0..0FD4 ; Po # [5] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA +-0FD9..0FDA ; Po # [2] TIBETAN MARK LEADING MCHAN RTAGS..TIBETAN MARK TRAILING MCHAN RTAGS +-104A..104F ; Po # [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE +-10FB ; Po # GEORGIAN PARAGRAPH SEPARATOR +-1360..1368 ; Po # [9] ETHIOPIC SECTION MARK..ETHIOPIC PARAGRAPH SEPARATOR +-166E ; Po # CANADIAN SYLLABICS FULL STOP +-16EB..16ED ; Po # [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION +-1735..1736 ; Po # [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION +-17D4..17D6 ; Po # [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH +-17D8..17DA ; Po # [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT +-1800..1805 ; Po # [6] MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS +-1807..180A ; Po # [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU +-1944..1945 ; Po # [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +-1A1E..1A1F ; Po # [2] BUGINESE PALLAWA..BUGINESE END OF SECTION +-1AA0..1AA6 ; Po # [7] TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA +-1AA8..1AAD ; Po # [6] TAI THAM SIGN KAAN..TAI THAM SIGN CAANG +-1B5A..1B60 ; Po # [7] BALINESE PANTI..BALINESE PAMENENG +-1BFC..1BFF ; Po # [4] BATAK SYMBOL BINDU NA METEK..BATAK SYMBOL BINDU PANGOLAT +-1C3B..1C3F ; Po # [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK +-1C7E..1C7F ; Po # [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD +-1CC0..1CC7 ; Po # [8] SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA +-1CD3 ; Po # VEDIC SIGN NIHSHVASA +-2016..2017 ; Po # [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE +-2020..2027 ; Po # [8] DAGGER..HYPHENATION POINT +-2030..2038 ; Po # [9] PER MILLE SIGN..CARET +-203B..203E ; Po # [4] REFERENCE MARK..OVERLINE +-2041..2043 ; Po # [3] CARET INSERTION POINT..HYPHEN BULLET +-2047..2051 ; Po # [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY +-2053 ; Po # SWUNG DASH +-2055..205E ; Po # [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS +-2CF9..2CFC ; Po # [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER +-2CFE..2CFF ; Po # [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER +-2D70 ; Po # TIFINAGH SEPARATOR MARK +-2E00..2E01 ; Po # [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER +-2E06..2E08 ; Po # [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER +-2E0B ; Po # RAISED SQUARE +-2E0E..2E16 ; Po # [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE +-2E18..2E19 ; Po # [2] INVERTED INTERROBANG..PALM BRANCH +-2E1B ; Po # TILDE WITH RING ABOVE +-2E1E..2E1F ; Po # [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW +-2E2A..2E2E ; Po # [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK +-2E30..2E39 ; Po # [10] RING POINT..TOP HALF SECTION SIGN +-2E3C..2E3F ; Po # [4] STENOGRAPHIC FULL STOP..CAPITULUM +-2E41 ; Po # REVERSED COMMA +-2E43..2E4F ; Po # [13] DASH WITH LEFT UPTURN..CORNISH VERSE DIVIDER +-2E52 ; Po # TIRONIAN SIGN CAPITAL ET +-3001..3003 ; Po # [3] IDEOGRAPHIC COMMA..DITTO MARK +-303D ; Po # PART ALTERNATION MARK +-30FB ; Po # KATAKANA MIDDLE DOT +-A4FE..A4FF ; Po # [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP +-A60D..A60F ; Po # [3] VAI COMMA..VAI QUESTION MARK +-A673 ; Po # SLAVONIC ASTERISK +-A67E ; Po # CYRILLIC KAVYKA +-A6F2..A6F7 ; Po # [6] BAMUM NJAEMLI..BAMUM QUESTION MARK +-A874..A877 ; Po # [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD +-A8CE..A8CF ; Po # [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA +-A8F8..A8FA ; Po # [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET +-A8FC ; Po # DEVANAGARI SIGN SIDDHAM +-A92E..A92F ; Po # [2] KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA +-A95F ; Po # REJANG SECTION MARK +-A9C1..A9CD ; Po # [13] JAVANESE LEFT RERENGGAN..JAVANESE TURNED PADA PISELEH +-A9DE..A9DF ; Po # [2] JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN +-AA5C..AA5F ; Po # [4] CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA +-AADE..AADF ; Po # [2] TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI +-AAF0..AAF1 ; Po # [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM +-ABEB ; Po # MEETEI MAYEK CHEIKHEI +-FE10..FE16 ; Po # [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK +-FE19 ; Po # PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS +-FE30 ; Po # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +-FE45..FE46 ; Po # [2] SESAME DOT..WHITE SESAME DOT +-FE49..FE4C ; Po # [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE +-FE50..FE52 ; Po # [3] SMALL COMMA..SMALL FULL STOP +-FE54..FE57 ; Po # [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK +-FE5F..FE61 ; Po # [3] SMALL NUMBER SIGN..SMALL ASTERISK +-FE68 ; Po # SMALL REVERSE SOLIDUS +-FE6A..FE6B ; Po # [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT +-FF01..FF03 ; Po # [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN +-FF05..FF07 ; Po # [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE +-FF0A ; Po # FULLWIDTH ASTERISK +-FF0C ; Po # FULLWIDTH COMMA +-FF0E..FF0F ; Po # [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS +-FF1A..FF1B ; Po # [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON +-FF1F..FF20 ; Po # [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT +-FF3C ; Po # FULLWIDTH REVERSE SOLIDUS +-FF61 ; Po # HALFWIDTH IDEOGRAPHIC FULL STOP +-FF64..FF65 ; Po # [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT +-10100..10102 ; Po # [3] AEGEAN WORD SEPARATOR LINE..AEGEAN CHECK MARK +-1039F ; Po # UGARITIC WORD DIVIDER +-103D0 ; Po # OLD PERSIAN WORD DIVIDER +-1056F ; Po # CAUCASIAN ALBANIAN CITATION MARK +-10857 ; Po # IMPERIAL ARAMAIC SECTION SIGN +-1091F ; Po # PHOENICIAN WORD SEPARATOR +-1093F ; Po # LYDIAN TRIANGULAR MARK +-10A50..10A58 ; Po # [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES +-10A7F ; Po # OLD SOUTH ARABIAN NUMERIC INDICATOR +-10AF0..10AF6 ; Po # [7] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION LINE FILLER +-10B39..10B3F ; Po # [7] AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION +-10B99..10B9C ; Po # [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT +-10F55..10F59 ; Po # [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT +-11047..1104D ; Po # [7] BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS +-110BB..110BC ; Po # [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN +-110BE..110C1 ; Po # [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA +-11140..11143 ; Po # [4] CHAKMA SECTION MARK..CHAKMA QUESTION MARK +-11174..11175 ; Po # [2] MAHAJANI ABBREVIATION SIGN..MAHAJANI SECTION MARK +-111C5..111C8 ; Po # [4] SHARADA DANDA..SHARADA SEPARATOR +-111CD ; Po # SHARADA SUTRA MARK +-111DB ; Po # SHARADA SIGN SIDDHAM +-111DD..111DF ; Po # [3] SHARADA CONTINUATION SIGN..SHARADA SECTION MARK-2 +-11238..1123D ; Po # [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN +-112A9 ; Po # MULTANI SECTION MARK +-1144B..1144F ; Po # [5] NEWA DANDA..NEWA ABBREVIATION SIGN +-1145A..1145B ; Po # [2] NEWA DOUBLE COMMA..NEWA PLACEHOLDER MARK +-1145D ; Po # NEWA INSERTION SIGN +-114C6 ; Po # TIRHUTA ABBREVIATION SIGN +-115C1..115D7 ; Po # [23] SIDDHAM SIGN SIDDHAM..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES +-11641..11643 ; Po # [3] MODI DANDA..MODI ABBREVIATION SIGN +-11660..1166C ; Po # [13] MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT +-1173C..1173E ; Po # [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI +-1183B ; Po # DOGRA ABBREVIATION SIGN +-11944..11946 ; Po # [3] DIVES AKURU DOUBLE DANDA..DIVES AKURU END OF TEXT MARK +-119E2 ; Po # NANDINAGARI SIGN SIDDHAM +-11A3F..11A46 ; Po # [8] ZANABAZAR SQUARE INITIAL HEAD MARK..ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK +-11A9A..11A9C ; Po # [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD +-11A9E..11AA2 ; Po # [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2 +-11C41..11C45 ; Po # [5] BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2 +-11C70..11C71 ; Po # [2] MARCHEN HEAD MARK..MARCHEN MARK SHAD +-11EF7..11EF8 ; Po # [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION +-11FFF ; Po # TAMIL PUNCTUATION END OF TEXT +-12470..12474 ; Po # [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON +-16A6E..16A6F ; Po # [2] MRO DANDA..MRO DOUBLE DANDA +-16AF5 ; Po # BASSA VAH FULL STOP +-16B37..16B3B ; Po # [5] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS FEEM +-16B44 ; Po # PAHAWH HMONG SIGN XAUS +-16E97..16E9A ; Po # [4] MEDEFAIDRIN COMMA..MEDEFAIDRIN EXCLAMATION OH +-16FE2 ; Po # OLD CHINESE HOOK MARK +-1BC9F ; Po # DUPLOYAN PUNCTUATION CHINOOK FULL STOP +-1DA87..1DA8B ; Po # [5] SIGNWRITING COMMA..SIGNWRITING PARENTHESIS +-1E95E..1E95F ; Po # [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK +- +-# Total code points: 593 +- +-# ================================================ +- +-# General_Category=Math_Symbol +- +-002B ; Sm # PLUS SIGN +-003C..003E ; Sm # [3] LESS-THAN SIGN..GREATER-THAN SIGN +-007C ; Sm # VERTICAL LINE +-007E ; Sm # TILDE +-00AC ; Sm # NOT SIGN +-00B1 ; Sm # PLUS-MINUS SIGN +-00D7 ; Sm # MULTIPLICATION SIGN +-00F7 ; Sm # DIVISION SIGN +-03F6 ; Sm # GREEK REVERSED LUNATE EPSILON SYMBOL +-0606..0608 ; Sm # [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY +-2044 ; Sm # FRACTION SLASH +-2052 ; Sm # COMMERCIAL MINUS SIGN +-207A..207C ; Sm # [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN +-208A..208C ; Sm # [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN +-2118 ; Sm # SCRIPT CAPITAL P +-2140..2144 ; Sm # [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y +-214B ; Sm # TURNED AMPERSAND +-2190..2194 ; Sm # [5] LEFTWARDS ARROW..LEFT RIGHT ARROW +-219A..219B ; Sm # [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE +-21A0 ; Sm # RIGHTWARDS TWO HEADED ARROW +-21A3 ; Sm # RIGHTWARDS ARROW WITH TAIL +-21A6 ; Sm # RIGHTWARDS ARROW FROM BAR +-21AE ; Sm # LEFT RIGHT ARROW WITH STROKE +-21CE..21CF ; Sm # [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE +-21D2 ; Sm # RIGHTWARDS DOUBLE ARROW +-21D4 ; Sm # LEFT RIGHT DOUBLE ARROW +-21F4..22FF ; Sm # [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP +-2320..2321 ; Sm # [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL +-237C ; Sm # RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +-239B..23B3 ; Sm # [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM +-23DC..23E1 ; Sm # [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET +-25B7 ; Sm # WHITE RIGHT-POINTING TRIANGLE +-25C1 ; Sm # WHITE LEFT-POINTING TRIANGLE +-25F8..25FF ; Sm # [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE +-266F ; Sm # MUSIC SHARP SIGN +-27C0..27C4 ; Sm # [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET +-27C7..27E5 ; Sm # [31] OR WITH DOT INSIDE..WHITE SQUARE WITH RIGHTWARDS TICK +-27F0..27FF ; Sm # [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW +-2900..2982 ; Sm # [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON +-2999..29D7 ; Sm # [63] DOTTED FENCE..BLACK HOURGLASS +-29DC..29FB ; Sm # [32] INCOMPLETE INFINITY..TRIPLE PLUS +-29FE..2AFF ; Sm # [258] TINY..N-ARY WHITE VERTICAL BAR +-2B30..2B44 ; Sm # [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET +-2B47..2B4C ; Sm # [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +-FB29 ; Sm # HEBREW LETTER ALTERNATIVE PLUS SIGN +-FE62 ; Sm # SMALL PLUS SIGN +-FE64..FE66 ; Sm # [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN +-FF0B ; Sm # FULLWIDTH PLUS SIGN +-FF1C..FF1E ; Sm # [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN +-FF5C ; Sm # FULLWIDTH VERTICAL LINE +-FF5E ; Sm # FULLWIDTH TILDE +-FFE2 ; Sm # FULLWIDTH NOT SIGN +-FFE9..FFEC ; Sm # [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW +-1D6C1 ; Sm # MATHEMATICAL BOLD NABLA +-1D6DB ; Sm # MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +-1D6FB ; Sm # MATHEMATICAL ITALIC NABLA +-1D715 ; Sm # MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +-1D735 ; Sm # MATHEMATICAL BOLD ITALIC NABLA +-1D74F ; Sm # MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +-1D76F ; Sm # MATHEMATICAL SANS-SERIF BOLD NABLA +-1D789 ; Sm # MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +-1D7A9 ; Sm # MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +-1D7C3 ; Sm # MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +-1EEF0..1EEF1 ; Sm # [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL +- +-# Total code points: 948 +- +-# ================================================ +- +-# General_Category=Currency_Symbol +- +-0024 ; Sc # DOLLAR SIGN +-00A2..00A5 ; Sc # [4] CENT SIGN..YEN SIGN +-058F ; Sc # ARMENIAN DRAM SIGN +-060B ; Sc # AFGHANI SIGN +-07FE..07FF ; Sc # [2] NKO DOROME SIGN..NKO TAMAN SIGN +-09F2..09F3 ; Sc # [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN +-09FB ; Sc # BENGALI GANDA MARK +-0AF1 ; Sc # GUJARATI RUPEE SIGN +-0BF9 ; Sc # TAMIL RUPEE SIGN +-0E3F ; Sc # THAI CURRENCY SYMBOL BAHT +-17DB ; Sc # KHMER CURRENCY SYMBOL RIEL +-20A0..20BF ; Sc # [32] EURO-CURRENCY SIGN..BITCOIN SIGN +-A838 ; Sc # NORTH INDIC RUPEE MARK +-FDFC ; Sc # RIAL SIGN +-FE69 ; Sc # SMALL DOLLAR SIGN +-FF04 ; Sc # FULLWIDTH DOLLAR SIGN +-FFE0..FFE1 ; Sc # [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN +-FFE5..FFE6 ; Sc # [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN +-11FDD..11FE0 ; Sc # [4] TAMIL SIGN KAACU..TAMIL SIGN VARAAKAN +-1E2FF ; Sc # WANCHO NGUN SIGN +-1ECB0 ; Sc # INDIC SIYAQ RUPEE MARK +- +-# Total code points: 62 +- +-# ================================================ +- +-# General_Category=Modifier_Symbol +- +-005E ; Sk # CIRCUMFLEX ACCENT +-0060 ; Sk # GRAVE ACCENT +-00A8 ; Sk # DIAERESIS +-00AF ; Sk # MACRON +-00B4 ; Sk # ACUTE ACCENT +-00B8 ; Sk # CEDILLA +-02C2..02C5 ; Sk # [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD +-02D2..02DF ; Sk # [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT +-02E5..02EB ; Sk # [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK +-02ED ; Sk # MODIFIER LETTER UNASPIRATED +-02EF..02FF ; Sk # [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW +-0375 ; Sk # GREEK LOWER NUMERAL SIGN +-0384..0385 ; Sk # [2] GREEK TONOS..GREEK DIALYTIKA TONOS +-1FBD ; Sk # GREEK KORONIS +-1FBF..1FC1 ; Sk # [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI +-1FCD..1FCF ; Sk # [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI +-1FDD..1FDF ; Sk # [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI +-1FED..1FEF ; Sk # [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA +-1FFD..1FFE ; Sk # [2] GREEK OXIA..GREEK DASIA +-309B..309C ; Sk # [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +-A700..A716 ; Sk # [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +-A720..A721 ; Sk # [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE +-A789..A78A ; Sk # [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN +-AB5B ; Sk # MODIFIER BREVE WITH INVERTED BREVE +-AB6A..AB6B ; Sk # [2] MODIFIER LETTER LEFT TACK..MODIFIER LETTER RIGHT TACK +-FBB2..FBC1 ; Sk # [16] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL SMALL TAH BELOW +-FF3E ; Sk # FULLWIDTH CIRCUMFLEX ACCENT +-FF40 ; Sk # FULLWIDTH GRAVE ACCENT +-FFE3 ; Sk # FULLWIDTH MACRON +-1F3FB..1F3FF ; Sk # [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 +- +-# Total code points: 123 +- +-# ================================================ +- +-# General_Category=Other_Symbol +- +-00A6 ; So # BROKEN BAR +-00A9 ; So # COPYRIGHT SIGN +-00AE ; So # REGISTERED SIGN +-00B0 ; So # DEGREE SIGN +-0482 ; So # CYRILLIC THOUSANDS SIGN +-058D..058E ; So # [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN +-060E..060F ; So # [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA +-06DE ; So # ARABIC START OF RUB EL HIZB +-06E9 ; So # ARABIC PLACE OF SAJDAH +-06FD..06FE ; So # [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN +-07F6 ; So # NKO SYMBOL OO DENNEN +-09FA ; So # BENGALI ISSHAR +-0B70 ; So # ORIYA ISSHAR +-0BF3..0BF8 ; So # [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN +-0BFA ; So # TAMIL NUMBER SIGN +-0C7F ; So # TELUGU SIGN TUUMU +-0D4F ; So # MALAYALAM SIGN PARA +-0D79 ; So # MALAYALAM DATE MARK +-0F01..0F03 ; So # [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +-0F13 ; So # TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN +-0F15..0F17 ; So # [3] TIBETAN LOGOTYPE SIGN CHAD RTAGS..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +-0F1A..0F1F ; So # [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG +-0F34 ; So # TIBETAN MARK BSDUS RTAGS +-0F36 ; So # TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +-0F38 ; So # TIBETAN MARK CHE MGO +-0FBE..0FC5 ; So # [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE +-0FC7..0FCC ; So # [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL +-0FCE..0FCF ; So # [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM +-0FD5..0FD8 ; So # [4] RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS +-109E..109F ; So # [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION +-1390..1399 ; So # [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT +-166D ; So # CANADIAN SYLLABICS CHI SIGN +-1940 ; So # LIMBU SIGN LOO +-19DE..19FF ; So # [34] NEW TAI LUE SIGN LAE..KHMER SYMBOL DAP-PRAM ROC +-1B61..1B6A ; So # [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE +-1B74..1B7C ; So # [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING +-2100..2101 ; So # [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT +-2103..2106 ; So # [4] DEGREE CELSIUS..CADA UNA +-2108..2109 ; So # [2] SCRUPLE..DEGREE FAHRENHEIT +-2114 ; So # L B BAR SYMBOL +-2116..2117 ; So # [2] NUMERO SIGN..SOUND RECORDING COPYRIGHT +-211E..2123 ; So # [6] PRESCRIPTION TAKE..VERSICLE +-2125 ; So # OUNCE SIGN +-2127 ; So # INVERTED OHM SIGN +-2129 ; So # TURNED GREEK SMALL LETTER IOTA +-212E ; So # ESTIMATED SYMBOL +-213A..213B ; So # [2] ROTATED CAPITAL Q..FACSIMILE SIGN +-214A ; So # PROPERTY LINE +-214C..214D ; So # [2] PER SIGN..AKTIESELSKAB +-214F ; So # SYMBOL FOR SAMARITAN SOURCE +-218A..218B ; So # [2] TURNED DIGIT TWO..TURNED DIGIT THREE +-2195..2199 ; So # [5] UP DOWN ARROW..SOUTH WEST ARROW +-219C..219F ; So # [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW +-21A1..21A2 ; So # [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL +-21A4..21A5 ; So # [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR +-21A7..21AD ; So # [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW +-21AF..21CD ; So # [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE +-21D0..21D1 ; So # [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW +-21D3 ; So # DOWNWARDS DOUBLE ARROW +-21D5..21F3 ; So # [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW +-2300..2307 ; So # [8] DIAMETER SIGN..WAVY LINE +-230C..231F ; So # [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER +-2322..2328 ; So # [7] FROWN..KEYBOARD +-232B..237B ; So # [81] ERASE TO THE LEFT..NOT CHECK MARK +-237D..239A ; So # [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL +-23B4..23DB ; So # [40] TOP SQUARE BRACKET..FUSE +-23E2..2426 ; So # [69] WHITE TRAPEZIUM..SYMBOL FOR SUBSTITUTE FORM TWO +-2440..244A ; So # [11] OCR HOOK..OCR DOUBLE BACKSLASH +-249C..24E9 ; So # [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z +-2500..25B6 ; So # [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE +-25B8..25C0 ; So # [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE +-25C2..25F7 ; So # [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT +-2600..266E ; So # [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN +-2670..2767 ; So # [248] WEST SYRIAC CROSS..ROTATED FLORAL HEART BULLET +-2794..27BF ; So # [44] HEAVY WIDE-HEADED RIGHTWARDS ARROW..DOUBLE CURLY LOOP +-2800..28FF ; So # [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 +-2B00..2B2F ; So # [48] NORTH EAST WHITE ARROW..WHITE VERTICAL ELLIPSE +-2B45..2B46 ; So # [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW +-2B4D..2B73 ; So # [39] DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR +-2B76..2B95 ; So # [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW +-2B97..2BFF ; So # [105] SYMBOL FOR TYPE A ELECTRONICS..HELLSCHREIBER PAUSE SYMBOL +-2CE5..2CEA ; So # [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA +-2E50..2E51 ; So # [2] CROSS PATTY WITH RIGHT CROSSBAR..CROSS PATTY WITH LEFT CROSSBAR +-2E80..2E99 ; So # [26] CJK RADICAL REPEAT..CJK RADICAL RAP +-2E9B..2EF3 ; So # [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE +-2F00..2FD5 ; So # [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE +-2FF0..2FFB ; So # [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID +-3004 ; So # JAPANESE INDUSTRIAL STANDARD SYMBOL +-3012..3013 ; So # [2] POSTAL MARK..GETA MARK +-3020 ; So # POSTAL MARK FACE +-3036..3037 ; So # [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +-303E..303F ; So # [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE +-3190..3191 ; So # [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK +-3196..319F ; So # [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK +-31C0..31E3 ; So # [36] CJK STROKE T..CJK STROKE Q +-3200..321E ; So # [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU +-322A..3247 ; So # [30] PARENTHESIZED IDEOGRAPH MOON..CIRCLED IDEOGRAPH KOTO +-3250 ; So # PARTNERSHIP SIGN +-3260..327F ; So # [32] CIRCLED HANGUL KIYEOK..KOREAN STANDARD SYMBOL +-328A..32B0 ; So # [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT +-32C0..33FF ; So # [320] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..SQUARE GAL +-4DC0..4DFF ; So # [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION +-A490..A4C6 ; So # [55] YI RADICAL QOT..YI RADICAL KE +-A828..A82B ; So # [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 +-A836..A837 ; So # [2] NORTH INDIC QUARTER MARK..NORTH INDIC PLACEHOLDER MARK +-A839 ; So # NORTH INDIC QUANTITY MARK +-AA77..AA79 ; So # [3] MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO +-FDFD ; So # ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM +-FFE4 ; So # FULLWIDTH BROKEN BAR +-FFE8 ; So # HALFWIDTH FORMS LIGHT VERTICAL +-FFED..FFEE ; So # [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE +-FFFC..FFFD ; So # [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER +-10137..1013F ; So # [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT +-10179..10189 ; So # [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN +-1018C..1018E ; So # [3] GREEK SINUSOID SIGN..NOMISMA SIGN +-10190..1019C ; So # [13] ROMAN SEXTANS SIGN..ASCIA SYMBOL +-101A0 ; So # GREEK SYMBOL TAU RHO +-101D0..101FC ; So # [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND +-10877..10878 ; So # [2] PALMYRENE LEFT-POINTING FLEURON..PALMYRENE RIGHT-POINTING FLEURON +-10AC8 ; So # MANICHAEAN SIGN UD +-1173F ; So # AHOM SYMBOL VI +-11FD5..11FDC ; So # [8] TAMIL SIGN NEL..TAMIL SIGN MUKKURUNI +-11FE1..11FF1 ; So # [17] TAMIL SIGN PAARAM..TAMIL SIGN VAKAIYARAA +-16B3C..16B3F ; So # [4] PAHAWH HMONG SIGN XYEEM NTXIV..PAHAWH HMONG SIGN XYEEM FAIB +-16B45 ; So # PAHAWH HMONG SIGN CIM TSOV ROG +-1BC9C ; So # DUPLOYAN SIGN O WITH CROSS +-1D000..1D0F5 ; So # [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +-1D100..1D126 ; So # [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 +-1D129..1D164 ; So # [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +-1D16A..1D16C ; So # [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 +-1D183..1D184 ; So # [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN +-1D18C..1D1A9 ; So # [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH +-1D1AE..1D1E8 ; So # [59] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KIEVAN FLAT SIGN +-1D200..1D241 ; So # [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 +-1D245 ; So # GREEK MUSICAL LEIMMA +-1D300..1D356 ; So # [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING +-1D800..1D9FF ; So # [512] SIGNWRITING HAND-FIST INDEX..SIGNWRITING HEAD +-1DA37..1DA3A ; So # [4] SIGNWRITING AIR BLOW SMALL ROTATIONS..SIGNWRITING BREATH EXHALE +-1DA6D..1DA74 ; So # [8] SIGNWRITING SHOULDER HIP SPINE..SIGNWRITING TORSO-FLOORPLANE TWISTING +-1DA76..1DA83 ; So # [14] SIGNWRITING LIMB COMBINATION..SIGNWRITING LOCATION DEPTH +-1DA85..1DA86 ; So # [2] SIGNWRITING LOCATION TORSO..SIGNWRITING LOCATION LIMBS DIGITS +-1E14F ; So # NYIAKENG PUACHUE HMONG CIRCLED CA +-1ECAC ; So # INDIC SIYAQ PLACEHOLDER +-1ED2E ; So # OTTOMAN SIYAQ MARRATAN +-1F000..1F02B ; So # [44] MAHJONG TILE EAST WIND..MAHJONG TILE BACK +-1F030..1F093 ; So # [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 +-1F0A0..1F0AE ; So # [15] PLAYING CARD BACK..PLAYING CARD KING OF SPADES +-1F0B1..1F0BF ; So # [15] PLAYING CARD ACE OF HEARTS..PLAYING CARD RED JOKER +-1F0C1..1F0CF ; So # [15] PLAYING CARD ACE OF DIAMONDS..PLAYING CARD BLACK JOKER +-1F0D1..1F0F5 ; So # [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21 +-1F10D..1F1AD ; So # [161] CIRCLED ZERO WITH SLASH..MASK WORK SYMBOL +-1F1E6..1F202 ; So # [29] REGIONAL INDICATOR SYMBOL LETTER A..SQUARED KATAKANA SA +-1F210..1F23B ; So # [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D +-1F240..1F248 ; So # [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 +-1F250..1F251 ; So # [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT +-1F260..1F265 ; So # [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI +-1F300..1F3FA ; So # [251] CYCLONE..AMPHORA +-1F400..1F6D7 ; So # [728] RAT..ELEVATOR +-1F6E0..1F6EC ; So # [13] HAMMER AND WRENCH..AIRPLANE ARRIVING +-1F6F0..1F6FC ; So # [13] SATELLITE..ROLLER SKATE +-1F700..1F773 ; So # [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE +-1F780..1F7D8 ; So # [89] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NEGATIVE CIRCLED SQUARE +-1F7E0..1F7EB ; So # [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE +-1F800..1F80B ; So # [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +-1F810..1F847 ; So # [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW +-1F850..1F859 ; So # [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW +-1F860..1F887 ; So # [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW +-1F890..1F8AD ; So # [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS +-1F8B0..1F8B1 ; So # [2] ARROW POINTING UPWARDS THEN NORTH WEST..ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST +-1F900..1F978 ; So # [121] CIRCLED CROSS FORMEE WITH FOUR DOTS..DISGUISED FACE +-1F97A..1F9CB ; So # [82] FACE WITH PLEADING EYES..BUBBLE TEA +-1F9CD..1FA53 ; So # [135] STANDING PERSON..BLACK CHESS KNIGHT-BISHOP +-1FA60..1FA6D ; So # [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER +-1FA70..1FA74 ; So # [5] BALLET SHOES..THONG SANDAL +-1FA78..1FA7A ; So # [3] DROP OF BLOOD..STETHOSCOPE +-1FA80..1FA86 ; So # [7] YO-YO..NESTING DOLLS +-1FA90..1FAA8 ; So # [25] RINGED PLANET..ROCK +-1FAB0..1FAB6 ; So # [7] FLY..FEATHER +-1FAC0..1FAC2 ; So # [3] ANATOMICAL HEART..PEOPLE HUGGING +-1FAD0..1FAD6 ; So # [7] BLUEBERRIES..TEAPOT +-1FB00..1FB92 ; So # [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK +-1FB94..1FBCA ; So # [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON +- +-# Total code points: 6431 +- +-# ================================================ +- +-# General_Category=Initial_Punctuation +- +-00AB ; Pi # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +-2018 ; Pi # LEFT SINGLE QUOTATION MARK +-201B..201C ; Pi # [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK +-201F ; Pi # DOUBLE HIGH-REVERSED-9 QUOTATION MARK +-2039 ; Pi # SINGLE LEFT-POINTING ANGLE QUOTATION MARK +-2E02 ; Pi # LEFT SUBSTITUTION BRACKET +-2E04 ; Pi # LEFT DOTTED SUBSTITUTION BRACKET +-2E09 ; Pi # LEFT TRANSPOSITION BRACKET +-2E0C ; Pi # LEFT RAISED OMISSION BRACKET +-2E1C ; Pi # LEFT LOW PARAPHRASE BRACKET +-2E20 ; Pi # LEFT VERTICAL BAR WITH QUILL +- +-# Total code points: 12 +- +-# ================================================ +- +-# General_Category=Final_Punctuation +- +-00BB ; Pf # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +-2019 ; Pf # RIGHT SINGLE QUOTATION MARK +-201D ; Pf # RIGHT DOUBLE QUOTATION MARK +-203A ; Pf # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +-2E03 ; Pf # RIGHT SUBSTITUTION BRACKET +-2E05 ; Pf # RIGHT DOTTED SUBSTITUTION BRACKET +-2E0A ; Pf # RIGHT TRANSPOSITION BRACKET +-2E0D ; Pf # RIGHT RAISED OMISSION BRACKET +-2E1D ; Pf # RIGHT LOW PARAPHRASE BRACKET +-2E21 ; Pf # RIGHT VERTICAL BAR WITH QUILL +- +-# Total code points: 10 +- +-# EOF +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 535e91e8..d06659e5 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -515,7 +515,7 @@ clean-local: + rm -rf *.dSYM + endif + CLEANFILES = *~ *.lo *.o *.i t_*.log t_*.trs *.exe test-fc.pl test-upr.pl +-CLEANFILES += *.gcno *.gcda ++CLEANFILES += *.gcno *.gcda DerivedGeneralCategory.txt CaseFolding.txt + if ENABLE_GCOV + CLEANFILES += *.gcov gcov.log + endif +diff --git a/tests/test_towfc_s.c b/tests/test_towfc_s.c +index a7ac808f..0a384355 100644 +--- a/tests/test_towfc_s.c ++++ b/tests/test_towfc_s.c +@@ -3,7 +3,7 @@ + * File 'towfc_s.c' + * Lines executed:98.28% of 174 + * +- * Full case-folding regarding latest Unicode (10.0) CaseFolding.txt ++ * Full case-folding regarding latest Unicode (14.0) CaseFolding.txt + * Some F characters fold to multiples. + *------------------------------------------------------------------ + */ +@@ -67,7 +67,7 @@ int test_towfc_s(void) { + if (!f) { + printf("downloading %s ...", CFOLD); + fflush(stdout); +- system("wget https://www.unicode.org/Public/13.0.0/ucd/CaseFolding.txt") ++ system("wget https://www.unicode.org/Public/14.0.0/ucd/CaseFolding.txt") + ? printf(" done\n") + : printf(" failed\n"); + f = fopen(CFOLD, "r"); +@@ -195,8 +195,7 @@ int test_towfc_s(void) { + WEXPSTR(result, L"i"); + } + } +- } else if (*status == +- 'S') { /* ignore as we handle the other F case */ ++ } else if (*status == 'S') { /* ignore as we handle the other F case */ + ; + } else { /* the simple 1:1 C case */ + #if SIZEOF_WCHAR_T > 2 +@@ -207,15 +206,13 @@ int test_towfc_s(void) { + { + errs++; + printf("%s %u Error: iswfc(U+%04X) => %d (towfc=>%d) " +- "\"%s\" status=%s %s\n", +- __FUNCTION__, __LINE__, wc, n, len, mapping, +- status, name); ++ "\"%s\" status=%s %s\n", __FUNCTION__, __LINE__, wc, ++ n, len, mapping, status, name); + } else if (cp != m0) { + errs++; + printf("%s %u Error: towfc(U+%04X) => %X != %X \"%s\" " +- "status=%s %s\n", +- __FUNCTION__, __LINE__, wc, cp, m0, mapping, status, +- name); ++ "status=%s %s\n", __FUNCTION__, __LINE__, wc, cp, m0, ++ mapping, status, name); + } + } + } +diff --git a/tests/test_towlower.c b/tests/test_towlower.c +index e4a496d4..a3e17fd6 100644 +--- a/tests/test_towlower.c ++++ b/tests/test_towlower.c +@@ -38,7 +38,7 @@ int test_towlower(void) { + if (!f) { + printf("downloading %s ...", CFOLD); + fflush(stdout); +- system("wget https://www.unicode.org/Public/13.0.0/ucd/CaseFolding.txt") ++ system("wget https://www.unicode.org/Public/14.0.0/ucd/CaseFolding.txt") + ? printf(" done\n") + : printf(" failed\n"); + printf(" done\n"); +diff --git a/tests/test_towupper.c b/tests/test_towupper.c +index b47be8e4..75b3a797 100644 +--- a/tests/test_towupper.c ++++ b/tests/test_towupper.c +@@ -33,7 +33,7 @@ int test_towupper(void); + */ + /*# define PERL "perl" */ + /*# define PERL "cperl5.30.0"*/ +-#define PERL "perl5.34.0" ++#define PERL "perl5.36.0" + #endif + #define TESTPL "test-upr.pl" + +@@ -154,7 +154,7 @@ int test_towupper(void) { + if (!f) { + printf("downloading %s ...", GENCAT); + fflush(stdout); +- if (system("wget https://www.unicode.org/Public/13.0.0/ucd/extracted/" ++ if (system("wget https://www.unicode.org/Public/14.0.0/ucd/extracted/" + "DerivedGeneralCategory.txt")) + printf(" done\n"); + else +@@ -166,7 +166,7 @@ int test_towupper(void) { + if (!cf) { + printf("downloading %s ...", CFOLD); + fflush(stdout); +- if (system("wget https://www.unicode.org/Public/13.0.0/ucd/CaseFolding.txt")) ++ if (system("wget https://www.unicode.org/Public/14.0.0/ucd/CaseFolding.txt")) + printf(" done\n"); + else + printf(" failed\n"); +diff --git a/tests/test_wcsfc_s.c b/tests/test_wcsfc_s.c +index 49e429d0..bd846a50 100644 +--- a/tests/test_wcsfc_s.c ++++ b/tests/test_wcsfc_s.c +@@ -24,7 +24,7 @@ int test_wcsfc_s(void); + #ifndef PERL + /*# define PERL "perl"*/ + /*# define PERL "cperl5.30.0"*/ +-#define PERL "perl5.34.0" ++#define PERL "perl5.36.0" + #endif + #define TESTPL "test-fc.pl" + +diff --git a/tests/test_wcsnorm_s.c b/tests/test_wcsnorm_s.c +index 4219ae1c..1b2a66e2 100644 +--- a/tests/test_wcsnorm_s.c ++++ b/tests/test_wcsnorm_s.c +@@ -29,7 +29,7 @@ int test_wcsnorm_s(void); + #ifndef PERL + /*# define PERL "perl" */ + /*# define PERL "cperl5.30.0" */ +-#define PERL "perl5.34.0" ++#define PERL "perl5.36.0" + #endif + #define TESTPL "test-norm.pl" + diff --git a/meta-oe/recipes-core/safec/safec/0069-fix-qsort-stack-addresses-detected-by-gcc-12.patch b/meta-oe/recipes-core/safec/safec/0069-fix-qsort-stack-addresses-detected-by-gcc-12.patch new file mode 100644 index 000000000..473d6b0c1 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0069-fix-qsort-stack-addresses-detected-by-gcc-12.patch @@ -0,0 +1,41 @@ +From 61929b556f8e883ef377e274cbfdf82c987d1d8a Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Fri, 28 Jan 2022 19:33:51 +0100 +Subject: [PATCH] fix qsort stack addresses, detected by gcc-12 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Fixes GH #110, by Tomasz Kłoczko (@kloczek) +--- + src/misc/qsort_s.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/src/misc/qsort_s.c b/src/misc/qsort_s.c +index 5d1fd15f..e2d1cbd1 100644 +--- a/src/misc/qsort_s.c ++++ b/src/misc/qsort_s.c +@@ -126,6 +126,7 @@ typedef unsigned long uint64_t; + */ + + typedef int (*cmpfun)(const void *, const void *, void *); ++static unsigned char tmp[256]; + #ifdef HAVE___BUILTIN_CTZ + #define ntz(x) __builtin_ctz((x)) + #else +@@ -167,14 +168,11 @@ static inline int pntz(size_t p[2]) { + } + + static void cycle(size_t width, unsigned char *ar[], int n) { +- unsigned char tmp[256]; + size_t l; + int i; + +- if (n < 2) { ++ if (n < 2) + return; +- } +- + ar[n] = tmp; + while (width) { + l = sizeof(tmp) < width ? sizeof(tmp) : width; diff --git a/meta-oe/recipes-core/safec/safec/0070-don-t-fail-some-tests-if-wget-failed.patch b/meta-oe/recipes-core/safec/safec/0070-don-t-fail-some-tests-if-wget-failed.patch new file mode 100644 index 000000000..7902e2e60 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0070-don-t-fail-some-tests-if-wget-failed.patch @@ -0,0 +1,97 @@ +From f8a61aa86b2bac5e1db374dd2d6cf1c8c9961d71 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sat, 29 Jan 2022 10:30:56 +0100 +Subject: [PATCH] don't fail some tests if wget failed + +Still better than shipping the UCD files. +Fixes GH #112 +--- + tests/test_towfc_s.c | 13 ++++++++----- + tests/test_towlower.c | 12 ++++++++---- + tests/test_towupper.c | 12 ++++++++++-- + 3 files changed, 26 insertions(+), 11 deletions(-) + +diff --git a/tests/test_towfc_s.c b/tests/test_towfc_s.c +index 0a384355..586d2367 100644 +--- a/tests/test_towfc_s.c ++++ b/tests/test_towfc_s.c +@@ -67,13 +67,16 @@ int test_towfc_s(void) { + if (!f) { + printf("downloading %s ...", CFOLD); + fflush(stdout); +- system("wget https://www.unicode.org/Public/14.0.0/ucd/CaseFolding.txt") +- ? printf(" done\n") +- : printf(" failed\n"); ++ if (system("wget https://www.unicode.org/Public/14.0.0/ucd/CaseFolding.txt")) ++ printf(" done\n"); ++ else { ++ printf(" failed\n"); ++ return 0; ++ } + f = fopen(CFOLD, "r"); ++ if (!f) ++ return 0; + } +- if (!f) +- return 1; + while (!feof(f)) { + int l; + char *p = fgets(s, sizeof(s), f); +diff --git a/tests/test_towlower.c b/tests/test_towlower.c +index a3e17fd6..9ee9b42e 100644 +--- a/tests/test_towlower.c ++++ b/tests/test_towlower.c +@@ -38,11 +38,15 @@ int test_towlower(void) { + if (!f) { + printf("downloading %s ...", CFOLD); + fflush(stdout); +- system("wget https://www.unicode.org/Public/14.0.0/ucd/CaseFolding.txt") +- ? printf(" done\n") +- : printf(" failed\n"); +- printf(" done\n"); ++ if (system("wget https://www.unicode.org/Public/14.0.0/ucd/CaseFolding.txt")) ++ printf(" done\n"); ++ else { ++ printf(" failed\n"); ++ return 0; ++ } + f = fopen(CFOLD, "r"); ++ if (!f) ++ return 0; + } + while (!feof(f)) { + int l; +diff --git a/tests/test_towupper.c b/tests/test_towupper.c +index 75b3a797..4d588807 100644 +--- a/tests/test_towupper.c ++++ b/tests/test_towupper.c +@@ -157,9 +157,13 @@ int test_towupper(void) { + if (system("wget https://www.unicode.org/Public/14.0.0/ucd/extracted/" + "DerivedGeneralCategory.txt")) + printf(" done\n"); +- else ++ else { + printf(" failed\n"); ++ return 0; ++ } + f = fopen(GENCAT, "r"); ++ if (!f) ++ return 0; + } + + cf = fopen(CFOLD, "r"); +@@ -168,9 +172,13 @@ int test_towupper(void) { + fflush(stdout); + if (system("wget https://www.unicode.org/Public/14.0.0/ucd/CaseFolding.txt")) + printf(" done\n"); +- else ++ else { + printf(" failed\n"); ++ return 0; ++ } + cf = fopen(CFOLD, "r"); ++ if (!cf) ++ return 0; + } + + while (!feof(f)) { diff --git a/meta-oe/recipes-core/safec/safec/0071-Release-3.7.patch b/meta-oe/recipes-core/safec/safec/0071-Release-3.7.patch new file mode 100644 index 000000000..3efc369e6 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0071-Release-3.7.patch @@ -0,0 +1,207 @@ +From 97f29ab88f46c81db2adab29188edbc873eee853 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Fri, 28 Jan 2022 16:16:17 +0100 +Subject: [PATCH] Release 3.7 + +--- + .appveyor.yml | 2 +- + .github/workflows/main.yml | 26 ++++++++++++++++++++++++-- + ChangeLog | 6 +++++- + Makefile.am | 20 +++++++++----------- + configure.ac | 3 +-- + tests/test_getenv_s.c | 2 +- + tests/test_stpncpy_s.c | 2 ++ + tests/test_vsnprintf_s.c | 2 +- + 8 files changed, 44 insertions(+), 19 deletions(-) + +diff --git a/.appveyor.yml b/.appveyor.yml +index 281e5934..c1f24254 100644 +--- a/.appveyor.yml ++++ b/.appveyor.yml +@@ -1,4 +1,4 @@ +-version: 3.6.{build} ++version: 3.7.{build} + max_jobs: 4 + environment: + matrix: +diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml +index 559685cf..8933d64e 100644 +--- a/.github/workflows/main.yml ++++ b/.github/workflows/main.yml +@@ -45,6 +45,18 @@ jobs: + run: | + sudo apt-get -y install doxygen wget perl + make distcheck ++ - if: matrix.CONF_ARGS == '' && startsWith(github.ref, 'refs/tags/') ++ name: Prep-Release ++ run: sha256sum safeclib-*.tar.* > dist.sha256 ++ - if: matrix.CONF_ARGS == '' && startsWith(github.ref, 'refs/tags/') ++ name: Release ++ continue-on-error: true ++ uses: softprops/action-gh-release@v1 ++ with: ++ body_path: dist.sha256 ++ files: | ++ dist.sha256 ++ safeclib-*.tar.* + macOS: + name: macOS + runs-on: macOS-latest +@@ -85,6 +97,7 @@ jobs: + libtool + autoconf-wrapper + automake-wrapper ++ zip + - run: reg add "HKLM\Software\Microsoft\Windows\Windows Error Reporting" /f /v DontShowUI /d 1 + - run: git config --global core.autocrlf input + - name: checkout +@@ -98,8 +111,17 @@ jobs: + run: make V=1 + - shell: msys2 {0} + run: make check-log +- #- name: Create zipped asset +- # run: gzip -c configure >configure.gz ++ - shell: msys2 {0} ++ if: startsWith(github.ref, 'refs/tags/') ++ run: make pkg; sha256sum safeclib-*-x86_64-w64-mingw32.zip > mingw.sha256 ++ - name: Release ++ uses: softprops/action-gh-release@fe9a9bd3295828558c7a3c004f23f3bf77d155b2 ++ if: startsWith(github.ref, 'refs/tags/') ++ with: ++ append_body_path: mingw.sha256 ++ files: | ++ mingw.sha256 ++ safeclib-*-x86_64-w64-mingw32.zip + #- name: Create Release + # id: create_release + # uses: actions/create-release@v1 +diff --git a/ChangeLog b/ChangeLog +index 8c537aa1..f1e02e3c 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,15 +1,19 @@ + + ChangeLog file for safeclib + +-Changes in 3.7.0 ++Changes in 3.7 + - Switched to proper semantic versioning for upstream packagers. + - Fixed getenv_s to allow dest=NULL or dmax=0 as in the spec. (GH #109) ++ - Fixed qsort_s with gcc-12 (GH #110) + - Updated to Unicode 14 (tested against perl 5.35.7) + export define SAFECLIB_UNICODE_VERSION 14 + - Added stpcpy_s and stpncpy_s as in the Intel safestringlib fork. + - Added our own portable implementation of the family of printf_s + functions. This make the results and errno sideeffects more predictable. + scanf_s not yet. Fixes GH #97. ++ - This also adds support for the %Lx family of printf handlers: %L[fFeEaAgG] ++ and wide-char %ls, %lc conversions. ++ (GH #103). Now just custom sscanf_s and UTF-8 support is missing. + - Added a --disable-hardening option, which bypasses obviously failing + AX_APPEND_COMPILE_FLAGS probes (PR #107, ffontaine). + E.g. needed on some exotic uclibc buildroot targets. +diff --git a/Makefile.am b/Makefile.am +index bcf4de00..21931b37 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -390,16 +390,6 @@ dist_man_MANS += \ + doc/man/man3/towfc_s.c.3 \ + doc/man/man3/towlower.3 \ + doc/man/man3/towupper.3 \ +- doc/man/man3/unw16ifcan.h.3 \ +- doc/man/man3/unw16ifcmb.h.3 \ +- doc/man/man3/unw16ifcmp.h.3 \ +- doc/man/man3/unw16ifcpt.h.3 \ +- doc/man/man3/unw16ifexc.h.3 \ +- doc/man/man3/unwifcan.h.3 \ +- doc/man/man3/unwifcmb.h.3 \ +- doc/man/man3/unwifcmp.h.3 \ +- doc/man/man3/unwifcpt.h.3 \ +- doc/man/man3/unwifexc.h.3 \ + doc/man/man3/vfwprintf_s.3 \ + doc/man/man3/vfwprintf_s.c.3 \ + doc/man/man3/vfwscanf_s.3 \ +@@ -514,7 +504,6 @@ docs man: Doxyfile doc/footer $(BUILT_SOURCES) README.rst \ + -rm doc/man/man3/seqindex_* + -rm doc/man/man3/*case_seqindex.3 + -rm doc/man/man3/UINT16_MAX.3 +- -rm doc/man/man3/UNWIF_*.3 + -rm doc/man/man3/README* + -rm doc/man/man3/__STDC_WANT_LIB_EXT1__.3 + -rm doc/man/man3/__WORDSIZE.3 +@@ -601,6 +590,15 @@ check-log: + perf: + tests/p_memcpy_s + tests/p_memcpy32_s ++pkg: ++ -rm -rf inst ++ $(MAKE) install DESTDIR="`pwd`/inst" prefix=/$(PACKAGE_TARNAME)-$(PACKAGE_VERSION) ++if HAVE_MINGW ++ (cd inst && zip ../$(PACKAGE_TARNAME)-$(PACKAGE_VERSION)-$(host_triplet).zip -r $(PACKAGE_TARNAME)-$(PACKAGE_VERSION) && cd -) ++else ++ tar cfz $(PACKAGE_TARNAME)-$(PACKAGE_VERSION)-$(host_triplet).tar.gz -C inst $(PACKAGE_TARNAME)-$(PACKAGE_VERSION) ++endif ++ rm -rf inst + gh-pages: docs + echo ensure ./configure --enable-unsafe + ls doc/man/man3/tmpnam_s.3 +diff --git a/configure.ac b/configure.ac +index bb82cedc..e1df6a4a 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -4,7 +4,7 @@ + # 2017 Reini Urban + # + # Copyright (c) 2012, 2013 Cisco Systems +-# Copyright (c) 2017-2021 Reini Urban ++# Copyright (c) 2017-2022 Reini Urban + # All rights reserved. + # + # Permission is hereby granted, free of charge, to any person +@@ -34,7 +34,6 @@ + AC_PREREQ([2.69]) + + # information on the package +-#AC_SUBST([PACKAGE_VERSION], [3.7]) + AC_INIT([Safe C Library],[3.7],[https://github.com/rurban/safeclib/issues],[safeclib],[http://github.com/rurban/safeclib/]) + + # Configure the configure script +diff --git a/tests/test_getenv_s.c b/tests/test_getenv_s.c +index 4e36fa9b..f8043215 100644 +--- a/tests/test_getenv_s.c ++++ b/tests/test_getenv_s.c +@@ -1,7 +1,7 @@ + /*------------------------------------------------------------------ + * test_getenv_s + * File 'os/getenv_s.c' +- * Lines executed:96.43% of 28 ++ * Lines executed:100.00% of 29 + * + *------------------------------------------------------------------ + */ +diff --git a/tests/test_stpncpy_s.c b/tests/test_stpncpy_s.c +index 30fec845..41486c42 100644 +--- a/tests/test_stpncpy_s.c ++++ b/tests/test_stpncpy_s.c +@@ -3,6 +3,8 @@ + * File 'stpncpy_s.c' + * File 'stpncpy_s.c' + * Lines executed:75.25% of 101 ++ * File 'stpncpy_s.c' ++ * Lines executed:75.25% of 101 + * Lines executed:75.25% of 101 + *------------------------------------------------------------------ + */ +diff --git a/tests/test_vsnprintf_s.c b/tests/test_vsnprintf_s.c +index 6d33e75e..48f6db34 100644 +--- a/tests/test_vsnprintf_s.c ++++ b/tests/test_vsnprintf_s.c +@@ -1,7 +1,7 @@ + /*------------------------------------------------------------------ + * test_vsnprintf_s + * File 'wchar/vsnprintf_s.c' +- * Lines executed:40.37% of 488 ++ * Lines executed:40.12% of 486 + * + *------------------------------------------------------------------ + */ diff --git a/meta-oe/recipes-core/safec/safec/0072-post-release-fixups-vVERSION.patch b/meta-oe/recipes-core/safec/safec/0072-post-release-fixups-vVERSION.patch new file mode 100644 index 000000000..a0a5fac96 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0072-post-release-fixups-vVERSION.patch @@ -0,0 +1,30 @@ +From 66dab4bc04e5cde8eb954127777739a9f0806739 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sat, 29 Jan 2022 12:25:06 +0100 +Subject: [PATCH] post-release fixups: vVERSION + +--- + Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/Makefile.am b/Makefile.am +index 21931b37..63cd3b76 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -612,7 +612,7 @@ gh-pages: docs + release: docs distcheck + git branch |grep '^* master' + git tag -f v`date +%d%m%Y` +- git tag -f $(PACKAGE_VERSION) ++ git tag -f v$(PACKAGE_VERSION) + build-aux/autogen.sh + ./configure + $(MAKE) +@@ -627,6 +627,6 @@ release: docs distcheck + $(MAKE) docs + $(MAKE) gh-pages + git branch |grep '^* gh-pages' +- git commit -m"Update to $(PACKAGE_VERSION)" ++ git commit -m"Update to v$(PACKAGE_VERSION)" + git push + git checkout master diff --git a/meta-oe/recipes-core/safec/safec/0073-appveyor-disable-failing-mingw.patch b/meta-oe/recipes-core/safec/safec/0073-appveyor-disable-failing-mingw.patch new file mode 100644 index 000000000..865e4b576 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0073-appveyor-disable-failing-mingw.patch @@ -0,0 +1,37 @@ +From ca61bede9ce82ee7e899b47843316180aa39255a Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sat, 29 Jan 2022 22:48:33 +0100 +Subject: [PATCH] appveyor: disable failing mingw + +we have a good one at github +--- + .appveyor.yml | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/.appveyor.yml b/.appveyor.yml +index c1f24254..be00e511 100644 +--- a/.appveyor.yml ++++ b/.appveyor.yml +@@ -2,14 +2,14 @@ version: 3.7.{build} + max_jobs: 4 + environment: + matrix: +- - MINGW: 1 +- MSYS2_ARCH: x86_64 +- MSYSTEM: MINGW64 +- PLATFORM: x64 +- - MINGW: 1 +- MSYS2_ARCH: i686 +- MSYSTEM: MINGW32 +- PLATFORM: x86 ++ #- MINGW: 1 ++ # MSYS2_ARCH: x86_64 ++ # MSYSTEM: MINGW64 ++ # PLATFORM: x64 ++ #- MINGW: 1 ++ # MSYS2_ARCH: i686 ++ # MSYSTEM: MINGW32 ++ # PLATFORM: x86 + - CYGWIN: 1 + PLATFORM: x86 + - CYGWIN: 1 diff --git a/meta-oe/recipes-core/safec/safec/0074-drone-upgrade-a-bit.patch b/meta-oe/recipes-core/safec/safec/0074-drone-upgrade-a-bit.patch new file mode 100644 index 000000000..b710a4dc5 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0074-drone-upgrade-a-bit.patch @@ -0,0 +1,32 @@ +From bd4211307602782d5c39fa2b4e86ec154f5f5693 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Sat, 29 Jan 2022 22:52:24 +0100 +Subject: [PATCH] drone: upgrade a bit + +but disable it for now, until we can find out how to start a build +--- + .drone.yml | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/.drone.yml b/.drone.yml +index 31b0494f..9ebde6c4 100644 +--- a/.drone.yml ++++ b/.drone.yml +@@ -10,7 +10,7 @@ steps: + image: arm64v8/fedora + commands: + - uname -a +- - dnf install -y --repo fedora gcc make file git automake autoconf which ++ - dnf install -y --repo fedora gcc bash make file git automake autoconf which + libtool perl-Text-Diff pkgconf-pkg-config + - build-aux/autogen.sh + - build-aux/conf-make-check.sh +@@ -34,7 +34,7 @@ steps: + - uname -a + - apt-get update -qq + - apt-get install -yq --no-install-suggests --no-install-recommends +- build-essential file gcc make autotools-dev automake autoconf libtool ++ build-essential file bash gcc make autotools-dev automake autoconf libtool + libtext-diff-perl pkg-config + - build-aux/autogen.sh + - build-aux/conf-make-check.sh diff --git a/meta-oe/recipes-core/safec/safec/0075-powerpc-compilation-fix.patch b/meta-oe/recipes-core/safec/safec/0075-powerpc-compilation-fix.patch new file mode 100644 index 000000000..561ce18f3 --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0075-powerpc-compilation-fix.patch @@ -0,0 +1,23 @@ +From 17bf3dcd67ac7c540d5d3fe0ce4e198de9edaa69 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Tue, 1 Feb 2022 20:34:54 +0100 +Subject: [PATCH] powerpc compilation fix + +Fixes GH #113, reported by @kilobyte +--- + tests/perf_private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tests/perf_private.h b/tests/perf_private.h +index 070faf75..3296cb3d 100644 +--- a/tests/perf_private.h ++++ b/tests/perf_private.h +@@ -106,7 +106,7 @@ static inline clock_t rdtsc() { + "cmpw %0, %2\n" + "bne- 0b" + : "=r" (tbu), "=r" (tbl), "=r" (tmp)); +- return (((uint64) tbu << 32) | tbl); ++ return (((uint64_t) tbu << 32) | tbl); + #elif defined(__sparc__) + uint64_t tick; + asm(".byte 0x83, 0x41, 0x00, 0x00"); diff --git a/meta-oe/recipes-core/safec/safec/0076-Release-3.7.1.patch b/meta-oe/recipes-core/safec/safec/0076-Release-3.7.1.patch new file mode 100644 index 000000000..244f718ff --- /dev/null +++ b/meta-oe/recipes-core/safec/safec/0076-Release-3.7.1.patch @@ -0,0 +1,52 @@ +From f9add9245b97c7bda6e28cceb0ee37fb7e254fd8 Mon Sep 17 00:00:00 2001 +From: Reini Urban +Date: Tue, 1 Feb 2022 20:37:19 +0100 +Subject: [PATCH] Release 3.7.1 + +Fixed powerpc perf tests only. No need for others to upgrade +--- + ChangeLog | 3 +++ + Makefile.am | 2 +- + configure.ac | 2 +- + 3 files changed, 5 insertions(+), 2 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index f1e02e3c..c5e57394 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,6 +1,9 @@ + + ChangeLog file for safeclib + ++Changes in 3.7.1 ++ - Fixed powerpc compilation of the perf tests. GH #113 ++ + Changes in 3.7 + - Switched to proper semantic versioning for upstream packagers. + - Fixed getenv_s to allow dest=NULL or dmax=0 as in the spec. (GH #109) +diff --git a/Makefile.am b/Makefile.am +index 63cd3b76..429a84b2 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -612,7 +612,7 @@ gh-pages: docs + release: docs distcheck + git branch |grep '^* master' + git tag -f v`date +%d%m%Y` +- git tag -f v$(PACKAGE_VERSION) ++ -git tag -f v$(PACKAGE_VERSION) + build-aux/autogen.sh + ./configure + $(MAKE) +diff --git a/configure.ac b/configure.ac +index e1df6a4a..b7fd03e9 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -34,7 +34,7 @@ + AC_PREREQ([2.69]) + + # information on the package +-AC_INIT([Safe C Library],[3.7],[https://github.com/rurban/safeclib/issues],[safeclib],[http://github.com/rurban/safeclib/]) ++AC_INIT([Safe C Library],[3.7.1],[https://github.com/rurban/safeclib/issues],[safeclib],[http://github.com/rurban/safeclib/]) + + # Configure the configure script + # =============================================== diff --git a/meta-oe/recipes-core/safec/safec_3.7.1.bb b/meta-oe/recipes-core/safec/safec_31082020.bb similarity index 10% rename from meta-oe/recipes-core/safec/safec_3.7.1.bb rename to meta-oe/recipes-core/safec/safec_31082020.bb index 9dd6f1c7c..af3220548 100644 --- a/meta-oe/recipes-core/safec/safec_3.7.1.bb +++ b/meta-oe/recipes-core/safec/safec_31082020.bb @@ -7,9 +7,85 @@ SECTION = "lib" inherit autotools pkgconfig S = "${WORKDIR}/git" -SRCREV = "f9add9245b97c7bda6e28cceb0ee37fb7e254fd8" +SRCREV = "013c2f70977d7c7198d5d5a1f82eccafa7b10229" SRC_URI = "git://github.com/rurban/safeclib.git;branch=master;protocol=https \ file://0001-strpbrk_s-Remove-unused-variable-len.patch \ + file://0001-man-improved-skip-_chk-add-public-API.patch \ + file://0002-man-fix-various-doxygen-warnings.patch \ + file://0003-v02092020-3.6.0-release.patch \ + file://0004-drone-no-fedora-modular-on-arm32.patch \ + file://0005-document-new-CI-s-tested-archs.patch \ + file://0006-man-improved-s-n-printf_s.patch \ + file://0007-mem_prim_set-remove-duplicate-MEMORY_BARRIER.patch \ + file://0008-perf_memset_s-add-mem_prim_set-test-without-MEMORY_B.patch \ + file://0009-improve-perf_memset_s-proper-timer-linearization.patch \ + file://0010-extract-perf-functions-into-perf_private.h.patch \ + file://0011-.gitgnore-new-files.patch \ + file://0012-perf-fix-aarch64-and-add-more-archs.patch \ + file://0013-add-support-banner-and-link.patch \ + file://0014-add-rst-and-md-in-parallel.patch \ + file://0015-generate-README.rst.patch \ + file://0016-travis-disable-unfree-osx.patch \ + file://0017-Define-NDEBUG-only-if-not-already-defined.patch \ + file://0018-switch-to-semantic-versioning-3.7-change-PACKAGE-nam.patch \ + file://0019-update-freebsd-smoker.patch \ + file://0020-fix-mingw-keyring-mess-again.patch \ + file://0021-Dont-install-wchar-manpages-with-disable-wchar.patch \ + file://0022-kernel-fix-for-time64_t-only.patch \ + file://0023-configure-replace-obsolute-macros.patch \ + file://0024-add-GH-Actions.patch \ + file://0025-avoid-macro-redefinition-warnings.patch \ + file://0026-add-stpcpy_s.patch \ + file://0027-Cope-with-EOVERFLOW-being-an-enum-value-rather-than-.patch \ + file://0028-stpcpy_s-doc-typo.patch \ + file://0029-avoid-macro-redefinition-warnings.patch \ + file://0030-stpcpy_s-rename-err-arg-to-errp.patch \ + file://0031-add-stpncpy_s.patch \ + file://0032-configure-don-t-probe-for-wchar-with-disable-wchar.patch \ + file://0033-doxyfile-update.patch \ + file://0034-gcc-std-c-11-already-defines-_GNU_SOURCE.patch \ + file://0035-mingw-fixes-disable-p_memset_s-test.patch \ + file://0036-fixup-smoker-for-mingw.patch \ + file://0037-fix-sprintf_s-with-arg-GH-97.patch \ + file://0038-WIP-start-with-our-own-printf.patch \ + file://0039-vsnprintf_s-catch-s-ESNULLP-and-ESNOSPC.patch \ + file://0040-new-safe-f-printf_s-also.patch \ + file://0041-printf_s-catch-more-ESNOSPC-errors.patch \ + file://0042-fix-all-printf_s-tests.patch \ + file://0043-rename-_vsnprintf_s-to-__vsnprintf_s.patch \ + file://0044-disable-fixup-some-io-for-the-kernel.patch \ + file://0045-let-vfprintf_s-use-the-new-secure-vsnprintf_s.patch \ + file://0046-doc-fix-retval-doxygen-warnings.patch \ + file://0047-add-ESNOSPC-check-to-qsort_s.patch \ + file://0048-adjust-bsearch_s-error-messages-to-qsort_s.patch \ + file://0049-add-safec_-prefix-for-internal-printf-function.patch \ + file://0050-printf-add-name-of-failing-function.patch \ + file://0051-printf-correctly-reject-illegal-format-specifiers.patch \ + file://0052-printf-catch-print-to-closed-stream-external-errno.patch \ + file://0053-Add-Changelog-for-upcoming-3.7.0.patch \ + file://0054-WIP-test_vfprintf_s-test-more-fprintf-errors.patch \ + file://0055-fix-compilation-with-c-std-c-11.patch \ + file://0056-fix-t_vfprintf_s.patch \ + file://0057-update-coverages-smoke.sh.patch \ + file://0058-configure-more-required-safec-CFLAGS.patch \ + file://0059-configure.ac-add-disable-hardening-option.patch \ + file://0060-ChangeLog-for-PR-107.patch \ + file://0061-fixup-mingw-GH-action.patch \ + file://0062-no-stack-clash-protection-on-macOS-clang-yet.patch \ + file://0063-minor-docs-m4.patch \ + file://0064-getenv_s-allow-dest-NULL-and-dmax-0.patch \ + file://0065-fixup-header-includes.patch \ + file://0066-fixup-test_towfc_s-a-bit.patch \ + file://0067-export-SAFECLIB_UNICODE_VERSION-13.patch \ + file://0068-update-to-Unicode-14.patch \ + file://0069-fix-qsort-stack-addresses-detected-by-gcc-12.patch \ + file://0070-don-t-fail-some-tests-if-wget-failed.patch \ + file://0071-Release-3.7.patch \ + file://0072-post-release-fixups-vVERSION.patch \ + file://0073-appveyor-disable-failing-mingw.patch \ + file://0074-drone-upgrade-a-bit.patch \ + file://0075-powerpc-compilation-fix.patch \ + file://0076-Release-3.7.1.patch \ " COMPATIBLE_HOST = '(x86_64|i.86|powerpc|powerpc64|arm|aarch64|mips).*-linux'