aboutsummaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authorrobot-piglet <robot-piglet@yandex-team.com>2024-07-05 10:31:07 +0300
committerrobot-piglet <robot-piglet@yandex-team.com>2024-07-05 10:40:04 +0300
commit2b7a2eb3c3e97462247a1c4a787572271d09b6aa (patch)
treed94771adb2946addd9f07903bec61903050d313a /contrib
parent5009700545d30746804087e4f9e4df2114a0b79e (diff)
downloadydb-2b7a2eb3c3e97462247a1c4a787572271d09b6aa.tar.gz
Intermediate changes
Diffstat (limited to 'contrib')
-rw-r--r--contrib/python/importlib-metadata/py3/.dist-info/METADATA48
-rw-r--r--contrib/python/importlib-metadata/py3/importlib_metadata/__init__.py5
-rw-r--r--contrib/python/importlib-metadata/py3/ya.make2
-rw-r--r--contrib/python/pip/.dist-info/METADATA13
-rw-r--r--contrib/python/pip/.dist-info/entry_points.txt1
-rw-r--r--contrib/python/pip/AUTHORS.txt30
-rw-r--r--contrib/python/pip/README.rst8
-rw-r--r--contrib/python/pip/pip/__init__.py2
-rw-r--r--contrib/python/pip/pip/__pip-runner__.py4
-rw-r--r--contrib/python/pip/pip/_internal/__init__.py2
-rw-r--r--contrib/python/pip/pip/_internal/build_env.py3
-rw-r--r--contrib/python/pip/pip/_internal/cache.py2
-rw-r--r--contrib/python/pip/pip/_internal/cli/autocompletion.py4
-rw-r--r--contrib/python/pip/pip/_internal/cli/base_command.py2
-rw-r--r--contrib/python/pip/pip/_internal/cli/cmdoptions.py6
-rw-r--r--contrib/python/pip/pip/_internal/cli/index_command.py172
-rw-r--r--contrib/python/pip/pip/_internal/cli/main.py1
-rw-r--r--contrib/python/pip/pip/_internal/cli/parser.py6
-rw-r--r--contrib/python/pip/pip/_internal/cli/progress_bars.py26
-rw-r--r--contrib/python/pip/pip/_internal/cli/req_command.py198
-rw-r--r--contrib/python/pip/pip/_internal/commands/check.py2
-rw-r--r--contrib/python/pip/pip/_internal/commands/debug.py4
-rw-r--r--contrib/python/pip/pip/_internal/commands/download.py1
-rw-r--r--contrib/python/pip/pip/_internal/commands/index.py6
-rw-r--r--contrib/python/pip/pip/_internal/commands/inspect.py2
-rw-r--r--contrib/python/pip/pip/_internal/commands/install.py15
-rw-r--r--contrib/python/pip/pip/_internal/commands/list.py25
-rw-r--r--contrib/python/pip/pip/_internal/commands/search.py8
-rw-r--r--contrib/python/pip/pip/_internal/commands/show.py38
-rw-r--r--contrib/python/pip/pip/_internal/commands/uninstall.py3
-rw-r--r--contrib/python/pip/pip/_internal/commands/wheel.py1
-rw-r--r--contrib/python/pip/pip/_internal/distributions/base.py8
-rw-r--r--contrib/python/pip/pip/_internal/distributions/sdist.py14
-rw-r--r--contrib/python/pip/pip/_internal/distributions/wheel.py8
-rw-r--r--contrib/python/pip/pip/_internal/exceptions.py67
-rw-r--r--contrib/python/pip/pip/_internal/index/collector.py47
-rw-r--r--contrib/python/pip/pip/_internal/index/package_finder.py32
-rw-r--r--contrib/python/pip/pip/_internal/locations/__init__.py11
-rw-r--r--contrib/python/pip/pip/_internal/locations/_sysconfig.py5
-rw-r--r--contrib/python/pip/pip/_internal/metadata/_json.py4
-rw-r--r--contrib/python/pip/pip/_internal/metadata/base.py56
-rw-r--r--contrib/python/pip/pip/_internal/metadata/importlib/_dists.py27
-rw-r--r--contrib/python/pip/pip/_internal/metadata/importlib/_envs.py2
-rw-r--r--contrib/python/pip/pip/_internal/metadata/pkg_resources.py45
-rw-r--r--contrib/python/pip/pip/_internal/models/candidate.py29
-rw-r--r--contrib/python/pip/pip/_internal/models/direct_url.py41
-rw-r--r--contrib/python/pip/pip/_internal/models/link.py19
-rw-r--r--contrib/python/pip/pip/_internal/models/scheme.py20
-rw-r--r--contrib/python/pip/pip/_internal/models/search_scope.py17
-rw-r--r--contrib/python/pip/pip/_internal/models/selection_prefs.py2
-rw-r--r--contrib/python/pip/pip/_internal/models/target_python.py1
-rw-r--r--contrib/python/pip/pip/_internal/models/wheel.py1
-rw-r--r--contrib/python/pip/pip/_internal/network/auth.py11
-rw-r--r--contrib/python/pip/pip/_internal/network/download.py1
-rw-r--r--contrib/python/pip/pip/_internal/network/session.py4
-rw-r--r--contrib/python/pip/pip/_internal/operations/build/build_tracker.py5
-rw-r--r--contrib/python/pip/pip/_internal/operations/build/metadata_legacy.py2
-rw-r--r--contrib/python/pip/pip/_internal/operations/build/wheel_legacy.py8
-rw-r--r--contrib/python/pip/pip/_internal/operations/check.py46
-rw-r--r--contrib/python/pip/pip/_internal/operations/freeze.py11
-rw-r--r--contrib/python/pip/pip/_internal/operations/install/editable_legacy.py1
-rw-r--r--contrib/python/pip/pip/_internal/operations/install/wheel.py33
-rw-r--r--contrib/python/pip/pip/_internal/operations/prepare.py14
-rw-r--r--contrib/python/pip/pip/_internal/req/__init__.py8
-rw-r--r--contrib/python/pip/pip/_internal/req/constructors.py46
-rw-r--r--contrib/python/pip/pip/_internal/req/req_file.py25
-rw-r--r--contrib/python/pip/pip/_internal/req/req_install.py19
-rw-r--r--contrib/python/pip/pip/_internal/req/req_set.py37
-rw-r--r--contrib/python/pip/pip/_internal/req/req_uninstall.py28
-rw-r--r--contrib/python/pip/pip/_internal/resolution/legacy/resolver.py25
-rw-r--r--contrib/python/pip/pip/_internal/resolution/resolvelib/base.py18
-rw-r--r--contrib/python/pip/pip/_internal/resolution/resolvelib/candidates.py122
-rw-r--r--contrib/python/pip/pip/_internal/resolution/resolvelib/factory.py22
-rw-r--r--contrib/python/pip/pip/_internal/resolution/resolvelib/found_candidates.py29
-rw-r--r--contrib/python/pip/pip/_internal/resolution/resolvelib/provider.py3
-rw-r--r--contrib/python/pip/pip/_internal/resolution/resolvelib/requirements.py79
-rw-r--r--contrib/python/pip/pip/_internal/self_outdated_check.py4
-rw-r--r--contrib/python/pip/pip/_internal/utils/_jaraco_text.py2
-rw-r--r--contrib/python/pip/pip/_internal/utils/compat.py16
-rw-r--r--contrib/python/pip/pip/_internal/utils/deprecation.py16
-rw-r--r--contrib/python/pip/pip/_internal/utils/direct_url_helpers.py4
-rw-r--r--contrib/python/pip/pip/_internal/utils/hashes.py6
-rw-r--r--contrib/python/pip/pip/_internal/utils/logging.py1
-rw-r--r--contrib/python/pip/pip/_internal/utils/misc.py77
-rw-r--r--contrib/python/pip/pip/_internal/utils/models.py39
-rw-r--r--contrib/python/pip/pip/_internal/utils/subprocess.py17
-rw-r--r--contrib/python/pip/pip/_internal/utils/unpacking.py170
-rw-r--r--contrib/python/pip/pip/_internal/utils/urls.py7
-rw-r--r--contrib/python/pip/pip/_internal/utils/wheel.py2
-rw-r--r--contrib/python/pip/pip/_internal/vcs/bazaar.py8
-rw-r--r--contrib/python/pip/pip/_internal/vcs/git.py3
-rw-r--r--contrib/python/pip/pip/_internal/vcs/subversion.py6
-rw-r--r--contrib/python/pip/pip/_internal/vcs/versioncontrol.py49
-rw-r--r--contrib/python/pip/pip/_internal/wheel_builder.py2
-rw-r--r--contrib/python/pip/pip/_vendor/__init__.py5
-rw-r--r--contrib/python/pip/pip/_vendor/cachecontrol/__init__.py2
-rw-r--r--contrib/python/pip/pip/_vendor/cachecontrol/adapter.py10
-rw-r--r--contrib/python/pip/pip/_vendor/cachecontrol/caches/file_cache.py7
-rw-r--r--contrib/python/pip/pip/_vendor/cachecontrol/controller.py7
-rw-r--r--contrib/python/pip/pip/_vendor/cachecontrol/heuristics.py2
-rw-r--r--contrib/python/pip/pip/_vendor/cachecontrol/serialize.py76
-rw-r--r--contrib/python/pip/pip/_vendor/certifi/__init__.py2
-rw-r--r--contrib/python/pip/pip/_vendor/certifi/cacert.pem321
-rw-r--r--contrib/python/pip/pip/_vendor/certifi/core.py6
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/__init__.py115
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/big5freq.py386
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/big5prober.py47
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/chardistribution.py261
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/charsetgroupprober.py106
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/charsetprober.py147
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/cli/__init__.py0
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/cli/chardetect.py112
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/codingstatemachine.py90
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/codingstatemachinedict.py19
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/cp949prober.py49
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/enums.py85
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/escprober.py102
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/escsm.py261
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/eucjpprober.py102
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/euckrfreq.py196
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/euckrprober.py47
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/euctwfreq.py388
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/euctwprober.py47
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/gb2312freq.py284
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/gb2312prober.py47
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/hebrewprober.py316
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/jisfreq.py325
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/johabfreq.py2382
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/johabprober.py47
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/jpcntx.py238
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/langbulgarianmodel.py4649
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/langgreekmodel.py4397
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/langhebrewmodel.py4380
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/langhungarianmodel.py4649
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/langrussianmodel.py5725
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/langthaimodel.py4380
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/langturkishmodel.py4380
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/latin1prober.py147
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/macromanprober.py162
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/mbcharsetprober.py95
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/mbcsgroupprober.py57
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/mbcssm.py661
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/metadata/__init__.py0
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/metadata/languages.py352
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/py.typed0
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/resultdict.py16
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/sbcharsetprober.py162
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/sbcsgroupprober.py88
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/sjisprober.py105
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/universaldetector.py362
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/utf1632prober.py225
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/utf8prober.py82
-rw-r--r--contrib/python/pip/pip/_vendor/chardet/version.py9
-rw-r--r--contrib/python/pip/pip/_vendor/colorama/__init__.py7
-rw-r--r--contrib/python/pip/pip/_vendor/colorama/ansi.py102
-rw-r--r--contrib/python/pip/pip/_vendor/colorama/ansitowin32.py277
-rw-r--r--contrib/python/pip/pip/_vendor/colorama/initialise.py121
-rw-r--r--contrib/python/pip/pip/_vendor/colorama/win32.py180
-rw-r--r--contrib/python/pip/pip/_vendor/colorama/winterm.py195
-rw-r--r--contrib/python/pip/pip/_vendor/distlib/scripts.py26
-rw-r--r--contrib/python/pip/pip/_vendor/distro/distro.py12
-rw-r--r--contrib/python/pip/pip/_vendor/idna/codec.py34
-rw-r--r--contrib/python/pip/pip/_vendor/idna/core.py33
-rw-r--r--contrib/python/pip/pip/_vendor/idna/idnadata.py2206
-rw-r--r--contrib/python/pip/pip/_vendor/idna/package_data.py2
-rw-r--r--contrib/python/pip/pip/_vendor/idna/uts46data.py454
-rw-r--r--contrib/python/pip/pip/_vendor/msgpack/__init__.py8
-rw-r--r--contrib/python/pip/pip/_vendor/msgpack/ext.py55
-rw-r--r--contrib/python/pip/pip/_vendor/msgpack/fallback.py147
-rw-r--r--contrib/python/pip/pip/_vendor/packaging/__about__.py26
-rw-r--r--contrib/python/pip/pip/_vendor/packaging/__init__.py30
-rw-r--r--contrib/python/pip/pip/_vendor/packaging/_elffile.py110
-rw-r--r--contrib/python/pip/pip/_vendor/packaging/_manylinux.py237
-rw-r--r--contrib/python/pip/pip/_vendor/packaging/_musllinux.py97
-rw-r--r--contrib/python/pip/pip/_vendor/packaging/_parser.py354
-rw-r--r--contrib/python/pip/pip/_vendor/packaging/_tokenizer.py194
-rw-r--r--contrib/python/pip/pip/_vendor/packaging/markers.py271
-rw-r--r--contrib/python/pip/pip/_vendor/packaging/metadata.py804
-rw-r--r--contrib/python/pip/pip/_vendor/packaging/requirements.py153
-rw-r--r--contrib/python/pip/pip/_vendor/packaging/specifiers.py995
-rw-r--r--contrib/python/pip/pip/_vendor/packaging/tags.py175
-rw-r--r--contrib/python/pip/pip/_vendor/packaging/utils.py58
-rw-r--r--contrib/python/pip/pip/_vendor/packaging/version.py427
-rw-r--r--contrib/python/pip/pip/_vendor/pkg_resources/__init__.py190
-rw-r--r--contrib/python/pip/pip/_vendor/platformdirs/__init__.py137
-rw-r--r--contrib/python/pip/pip/_vendor/platformdirs/__main__.py4
-rw-r--r--contrib/python/pip/pip/_vendor/platformdirs/android.py38
-rw-r--r--contrib/python/pip/pip/_vendor/platformdirs/api.py105
-rw-r--r--contrib/python/pip/pip/_vendor/platformdirs/macos.py51
-rw-r--r--contrib/python/pip/pip/_vendor/platformdirs/unix.py122
-rw-r--r--contrib/python/pip/pip/_vendor/platformdirs/version.py16
-rw-r--r--contrib/python/pip/pip/_vendor/platformdirs/windows.py49
-rw-r--r--contrib/python/pip/pip/_vendor/pygments/__init__.py2
-rw-r--r--contrib/python/pip/pip/_vendor/pygments/cmdline.py4
-rw-r--r--contrib/python/pip/pip/_vendor/pygments/formatters/__init__.py2
-rw-r--r--contrib/python/pip/pip/_vendor/pygments/formatters/html.py3
-rw-r--r--contrib/python/pip/pip/_vendor/pygments/formatters/img.py41
-rw-r--r--contrib/python/pip/pip/_vendor/pygments/lexer.py46
-rw-r--r--contrib/python/pip/pip/_vendor/pygments/lexers/__init__.py1
-rw-r--r--contrib/python/pip/pip/_vendor/pygments/lexers/_mapping.py33
-rw-r--r--contrib/python/pip/pip/_vendor/pygments/lexers/python.py8
-rw-r--r--contrib/python/pip/pip/_vendor/pygments/sphinxext.py22
-rw-r--r--contrib/python/pip/pip/_vendor/pygments/style.py6
-rw-r--r--contrib/python/pip/pip/_vendor/pygments/styles/__init__.py70
-rw-r--r--contrib/python/pip/pip/_vendor/pygments/styles/_mapping.py53
-rw-r--r--contrib/python/pip/pip/_vendor/pygments/token.py1
-rw-r--r--contrib/python/pip/pip/_vendor/pyparsing/__init__.py322
-rw-r--r--contrib/python/pip/pip/_vendor/pyparsing/actions.py217
-rw-r--r--contrib/python/pip/pip/_vendor/pyparsing/common.py432
-rw-r--r--contrib/python/pip/pip/_vendor/pyparsing/core.py6115
-rw-r--r--contrib/python/pip/pip/_vendor/pyparsing/diagram/__init__.py656
-rw-r--r--contrib/python/pip/pip/_vendor/pyparsing/exceptions.py299
-rw-r--r--contrib/python/pip/pip/_vendor/pyparsing/helpers.py1100
-rw-r--r--contrib/python/pip/pip/_vendor/pyparsing/py.typed0
-rw-r--r--contrib/python/pip/pip/_vendor/pyparsing/results.py796
-rw-r--r--contrib/python/pip/pip/_vendor/pyparsing/testing.py331
-rw-r--r--contrib/python/pip/pip/_vendor/pyparsing/unicode.py361
-rw-r--r--contrib/python/pip/pip/_vendor/pyparsing/util.py284
-rw-r--r--contrib/python/pip/pip/_vendor/requests/__init__.py9
-rw-r--r--contrib/python/pip/pip/_vendor/requests/__version__.py6
-rw-r--r--contrib/python/pip/pip/_vendor/requests/adapters.py114
-rw-r--r--contrib/python/pip/pip/_vendor/requests/api.py2
-rw-r--r--contrib/python/pip/pip/_vendor/requests/auth.py1
-rw-r--r--contrib/python/pip/pip/_vendor/requests/compat.py15
-rw-r--r--contrib/python/pip/pip/_vendor/requests/cookies.py16
-rw-r--r--contrib/python/pip/pip/_vendor/requests/exceptions.py10
-rw-r--r--contrib/python/pip/pip/_vendor/requests/help.py6
-rw-r--r--contrib/python/pip/pip/_vendor/requests/models.py13
-rw-r--r--contrib/python/pip/pip/_vendor/requests/packages.py13
-rw-r--r--contrib/python/pip/pip/_vendor/requests/sessions.py12
-rw-r--r--contrib/python/pip/pip/_vendor/requests/status_codes.py10
-rw-r--r--contrib/python/pip/pip/_vendor/requests/utils.py16
-rw-r--r--contrib/python/pip/pip/_vendor/rich/__main__.py1
-rw-r--r--contrib/python/pip/pip/_vendor/rich/_cell_widths.py367
-rw-r--r--contrib/python/pip/pip/_vendor/rich/_export_format.py4
-rw-r--r--contrib/python/pip/pip/_vendor/rich/_ratio.py1
-rw-r--r--contrib/python/pip/pip/_vendor/rich/_windows.py1
-rw-r--r--contrib/python/pip/pip/_vendor/rich/_wrap.py73
-rw-r--r--contrib/python/pip/pip/_vendor/rich/align.py2
-rw-r--r--contrib/python/pip/pip/_vendor/rich/bar.py1
-rw-r--r--contrib/python/pip/pip/_vendor/rich/box.py345
-rw-r--r--contrib/python/pip/pip/_vendor/rich/cells.py55
-rw-r--r--contrib/python/pip/pip/_vendor/rich/color.py1
-rw-r--r--contrib/python/pip/pip/_vendor/rich/console.py2
-rw-r--r--contrib/python/pip/pip/_vendor/rich/containers.py8
-rw-r--r--contrib/python/pip/pip/_vendor/rich/highlighter.py2
-rw-r--r--contrib/python/pip/pip/_vendor/rich/json.py1
-rw-r--r--contrib/python/pip/pip/_vendor/rich/layout.py3
-rw-r--r--contrib/python/pip/pip/_vendor/rich/live.py2
-rw-r--r--contrib/python/pip/pip/_vendor/rich/live_render.py1
-rw-r--r--contrib/python/pip/pip/_vendor/rich/markup.py7
-rw-r--r--contrib/python/pip/pip/_vendor/rich/panel.py4
-rw-r--r--contrib/python/pip/pip/_vendor/rich/pretty.py15
-rw-r--r--contrib/python/pip/pip/_vendor/rich/progress.py7
-rw-r--r--contrib/python/pip/pip/_vendor/rich/progress_bar.py1
-rw-r--r--contrib/python/pip/pip/_vendor/rich/prompt.py3
-rw-r--r--contrib/python/pip/pip/_vendor/rich/repr.py2
-rw-r--r--contrib/python/pip/pip/_vendor/rich/segment.py1
-rw-r--r--contrib/python/pip/pip/_vendor/rich/status.py1
-rw-r--r--contrib/python/pip/pip/_vendor/rich/syntax.py12
-rw-r--r--contrib/python/pip/pip/_vendor/rich/table.py4
-rw-r--r--contrib/python/pip/pip/_vendor/rich/text.py116
-rw-r--r--contrib/python/pip/pip/_vendor/rich/traceback.py3
-rw-r--r--contrib/python/pip/pip/_vendor/rich/tree.py2
-rw-r--r--contrib/python/pip/pip/_vendor/six.py998
-rw-r--r--contrib/python/pip/pip/_vendor/tenacity/__init__.py2
-rw-r--r--contrib/python/pip/pip/_vendor/truststore/__init__.py2
-rw-r--r--contrib/python/pip/pip/_vendor/truststore/_api.py41
-rw-r--r--contrib/python/pip/pip/_vendor/truststore/_macos.py14
-rw-r--r--contrib/python/pip/pip/_vendor/truststore/_windows.py30
-rw-r--r--contrib/python/pip/pip/_vendor/typing_extensions.py1130
-rw-r--r--contrib/python/pip/pip/_vendor/urllib3/_collections.py18
-rw-r--r--contrib/python/pip/pip/_vendor/urllib3/_version.py2
-rw-r--r--contrib/python/pip/pip/_vendor/urllib3/connectionpool.py5
-rw-r--r--contrib/python/pip/pip/_vendor/urllib3/contrib/securetransport.py3
-rw-r--r--contrib/python/pip/pip/_vendor/urllib3/poolmanager.py7
-rw-r--r--contrib/python/pip/pip/_vendor/vendor.txt35
-rw-r--r--contrib/python/pip/pip/_vendor/webencodings/__init__.py342
-rw-r--r--contrib/python/pip/pip/_vendor/webencodings/labels.py231
-rw-r--r--contrib/python/pip/pip/_vendor/webencodings/mklabels.py59
-rw-r--r--contrib/python/pip/pip/_vendor/webencodings/x_user_defined.py325
-rw-r--r--contrib/python/pip/ya.make82
282 files changed, 8901 insertions, 59265 deletions
diff --git a/contrib/python/importlib-metadata/py3/.dist-info/METADATA b/contrib/python/importlib-metadata/py3/.dist-info/METADATA
index ec8a77c116..49797cf89b 100644
--- a/contrib/python/importlib-metadata/py3/.dist-info/METADATA
+++ b/contrib/python/importlib-metadata/py3/.dist-info/METADATA
@@ -1,40 +1,40 @@
Metadata-Version: 2.1
Name: importlib_metadata
-Version: 7.1.0
+Version: 7.2.0
Summary: Read metadata from Python packages
-Home-page: https://github.com/python/importlib_metadata
-Author: Jason R. Coombs
-Author-email: jaraco@jaraco.com
+Author-email: "Jason R. Coombs" <jaraco@jaraco.com>
+Project-URL: Homepage, https://github.com/python/importlib_metadata
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Requires-Python: >=3.8
+Description-Content-Type: text/x-rst
License-File: LICENSE
Requires-Dist: typing-extensions >=3.6.4 ; python_version < "3.8"
-Provides-Extra: docs
-Requires-Dist: sphinx >=3.5 ; extra == 'docs'
-Requires-Dist: jaraco.packaging >=9.3 ; extra == 'docs'
-Requires-Dist: rst.linker >=1.9 ; extra == 'docs'
-Requires-Dist: furo ; extra == 'docs'
-Requires-Dist: sphinx-lint ; extra == 'docs'
-Requires-Dist: jaraco.tidelift >=1.4 ; extra == 'docs'
+Provides-Extra: doc
+Requires-Dist: sphinx >=3.5 ; extra == 'doc'
+Requires-Dist: jaraco.packaging >=9.3 ; extra == 'doc'
+Requires-Dist: rst.linker >=1.9 ; extra == 'doc'
+Requires-Dist: furo ; extra == 'doc'
+Requires-Dist: sphinx-lint ; extra == 'doc'
+Requires-Dist: jaraco.tidelift >=1.4 ; extra == 'doc'
Provides-Extra: perf
Requires-Dist: ipython ; extra == 'perf'
-Provides-Extra: testing
-Requires-Dist: pytest >=6 ; extra == 'testing'
-Requires-Dist: pytest-checkdocs >=2.4 ; extra == 'testing'
-Requires-Dist: pytest-cov ; extra == 'testing'
-Requires-Dist: pytest-enabler >=2.2 ; extra == 'testing'
-Requires-Dist: pytest-ruff >=0.2.1 ; extra == 'testing'
-Requires-Dist: packaging ; extra == 'testing'
-Requires-Dist: pyfakefs ; extra == 'testing'
-Requires-Dist: flufl.flake8 ; extra == 'testing'
-Requires-Dist: pytest-perf >=0.9.2 ; extra == 'testing'
-Requires-Dist: jaraco.test >=5.4 ; extra == 'testing'
-Requires-Dist: pytest-mypy ; (platform_python_implementation != "PyPy") and extra == 'testing'
-Requires-Dist: importlib-resources >=1.3 ; (python_version < "3.9") and extra == 'testing'
+Provides-Extra: test
+Requires-Dist: pytest !=8.1.*,>=6 ; extra == 'test'
+Requires-Dist: pytest-checkdocs >=2.4 ; extra == 'test'
+Requires-Dist: pytest-cov ; extra == 'test'
+Requires-Dist: pytest-mypy ; extra == 'test'
+Requires-Dist: pytest-enabler >=2.2 ; extra == 'test'
+Requires-Dist: pytest-ruff >=0.2.1 ; extra == 'test'
+Requires-Dist: packaging ; extra == 'test'
+Requires-Dist: pyfakefs ; extra == 'test'
+Requires-Dist: flufl.flake8 ; extra == 'test'
+Requires-Dist: pytest-perf >=0.9.2 ; extra == 'test'
+Requires-Dist: jaraco.test >=5.4 ; extra == 'test'
+Requires-Dist: importlib-resources >=1.3 ; (python_version < "3.9") and extra == 'test'
.. image:: https://img.shields.io/pypi/v/importlib_metadata.svg
:target: https://pypi.org/project/importlib_metadata
diff --git a/contrib/python/importlib-metadata/py3/importlib_metadata/__init__.py b/contrib/python/importlib-metadata/py3/importlib_metadata/__init__.py
index b512d89d6e..792f0b6732 100644
--- a/contrib/python/importlib-metadata/py3/importlib_metadata/__init__.py
+++ b/contrib/python/importlib-metadata/py3/importlib_metadata/__init__.py
@@ -17,7 +17,7 @@ import itertools
import posixpath
import collections
-from . import _adapters, _meta
+from . import _meta
from .compat import py39
from ._collections import FreezableDefaultDict, Pair
from ._compat import (
@@ -466,6 +466,9 @@ class Distribution(DeprecatedNonAbstract):
Custom providers may provide the METADATA file or override this
property.
"""
+ # deferred for performance (python/cpython#109829)
+ from . import _adapters
+
opt_text = (
self.read_text('METADATA')
or self.read_text('PKG-INFO')
diff --git a/contrib/python/importlib-metadata/py3/ya.make b/contrib/python/importlib-metadata/py3/ya.make
index ecdc5d99ec..72a4b5af53 100644
--- a/contrib/python/importlib-metadata/py3/ya.make
+++ b/contrib/python/importlib-metadata/py3/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(7.1.0)
+VERSION(7.2.0)
LICENSE(Apache-2.0)
diff --git a/contrib/python/pip/.dist-info/METADATA b/contrib/python/pip/.dist-info/METADATA
index e5b45bdd68..e118468a47 100644
--- a/contrib/python/pip/.dist-info/METADATA
+++ b/contrib/python/pip/.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: pip
-Version: 24.0
+Version: 24.1
Summary: The PyPA recommended tool for installing Python packages.
Author-email: The pip developers <distutils-sig@python.org>
License: MIT
@@ -15,7 +15,6 @@ Classifier: Topic :: Software Development :: Build Tools
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
-Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
@@ -23,7 +22,7 @@ Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
-Requires-Python: >=3.7
+Requires-Python: >=3.8
Description-Content-Type: text/x-rst
License-File: LICENSE.txt
License-File: AUTHORS.txt
@@ -31,18 +30,20 @@ License-File: AUTHORS.txt
pip - The Python Package Installer
==================================
-.. image:: https://img.shields.io/pypi/v/pip.svg
+.. |pypi-version| image:: https://img.shields.io/pypi/v/pip.svg
:target: https://pypi.org/project/pip/
:alt: PyPI
-.. image:: https://img.shields.io/pypi/pyversions/pip
+.. |python-versions| image:: https://img.shields.io/pypi/pyversions/pip
:target: https://pypi.org/project/pip
:alt: PyPI - Python Version
-.. image:: https://readthedocs.org/projects/pip/badge/?version=latest
+.. |docs-badge| image:: https://readthedocs.org/projects/pip/badge/?version=latest
:target: https://pip.pypa.io/en/latest
:alt: Documentation
+|pypi-version| |python-versions| |docs-badge|
+
pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.
Please take a look at our documentation for how to install and use pip:
diff --git a/contrib/python/pip/.dist-info/entry_points.txt b/contrib/python/pip/.dist-info/entry_points.txt
index 5367846d2a..25fcf7e2cd 100644
--- a/contrib/python/pip/.dist-info/entry_points.txt
+++ b/contrib/python/pip/.dist-info/entry_points.txt
@@ -1,4 +1,3 @@
[console_scripts]
pip = pip._internal.cli.main:main
pip3 = pip._internal.cli.main:main
-pip3.10 = pip._internal.cli.main:main
diff --git a/contrib/python/pip/AUTHORS.txt b/contrib/python/pip/AUTHORS.txt
index 0e6354892d..f06ca7bf97 100644
--- a/contrib/python/pip/AUTHORS.txt
+++ b/contrib/python/pip/AUTHORS.txt
@@ -9,7 +9,9 @@ Adam Chainz
Adam Tse
Adam Wentz
admin
+Adolfo Ochagavía
Adrien Morison
+Agus
ahayrapetyan
Ahilya
AinsworthK
@@ -63,8 +65,11 @@ Anudit Nagar
Anuj Godase
AQNOUCH Mohammed
AraHaan
+arena
+arenasys
Arindam Choudhury
Armin Ronacher
+Arnon Yaari
Artem
Arun Babu Neelicattu
Ashley Manton
@@ -102,6 +107,7 @@ Brad Erickson
Bradley Ayers
Brandon L. Reiss
Brandt Bucher
+Brannon Dorsey
Brett Randall
Brett Rosen
Brian Cristante
@@ -140,6 +146,7 @@ Christian Oudard
Christoph Reiter
Christopher Hunt
Christopher Snyder
+chrysle
cjc7373
Clark Boylan
Claudio Jolowicz
@@ -157,6 +164,7 @@ Craig Kerstiens
Cristian Sorinel
Cristina
Cristina Muñoz
+ctg123
Curtis Doty
cytolentino
Daan De Meyer
@@ -194,6 +202,7 @@ David Evans
David Hewitt
David Linke
David Poggi
+David Poznik
David Pursehouse
David Runge
David Tucker
@@ -207,6 +216,7 @@ dependabot[bot]
derwolfe
Desetude
Devesh Kumar Singh
+devsagul
Diego Caraballo
Diego Ramirez
DiegoCaraballo
@@ -265,6 +275,7 @@ Florian Briand
Florian Rathgeber
Francesco
Francesco Montesano
+Fredrik Orderud
Frost Ming
Gabriel Curio
Gabriel de Perthuis
@@ -315,6 +326,7 @@ Ian Stapleton Cordasco
Ian Wienand
Igor Kuzmitshov
Igor Sobreira
+Ikko Ashimine
Ilan Schnell
Illia Volochii
Ilya Baryshev
@@ -364,6 +376,7 @@ Jivan Amara
Joe Bylund
Joe Michelini
John Paton
+John Sirois
John T. Wodder II
John-Scott Atlakson
johnthagen
@@ -408,6 +421,7 @@ Kexuan Sun
Kit Randel
Klaas van Schelven
KOLANICH
+konstin
kpinc
Krishna Oza
Kumar McMillan
@@ -428,6 +442,7 @@ lorddavidiii
Loren Carvalho
Lucas Cimon
Ludovic Gasc
+Luis Medel
Lukas Geiger
Lukas Juhrich
Luke Macken
@@ -441,11 +456,12 @@ Marc Tamlyn
Marcus Smith
Mariatta
Mark Kohler
+Mark McLoughlin
Mark Williams
Markus Hametner
Martey Dodoo
Martin Fischer
-Martin Häcker
+Martin Häcker
Martin Pavlasek
Masaki
Masklinn
@@ -457,6 +473,7 @@ Matt Bacchi
Matt Good
Matt Maker
Matt Robenolt
+Matt Wozniski
matthew
Matthew Einhorn
Matthew Feickert
@@ -495,7 +512,8 @@ Miro Hrončok
Monica Baluna
montefra
Monty Taylor
-Muha Ajjan‮
+mrKazzila
+Muha Ajjan
Nadav Wexler
Nahuel Ambrosini
Nate Coraor
@@ -559,7 +577,9 @@ Paweł Szramowski
Pekka Klärck
Peter Gessler
Peter Lisák
+Peter Shen
Peter Waller
+Petr Viktorin
petr-tik
Phaneendra Chiruvella
Phil Elson
@@ -592,6 +612,7 @@ Quentin Pradet
R. David Murray
Rafael Caricio
Ralf Schmitt
+Ran Benita
Razzi Abuissa
rdb
Reece Dunham
@@ -624,6 +645,7 @@ Russell Keith-Magee
Ryan Shepherd
Ryan Wooden
ryneeverett
+S. Guliaev
Sachi King
Salvatore Rinchiera
sandeepkiran-js
@@ -642,8 +664,10 @@ Seth Michael Larson
Seth Woodworth
Shahar Epstein
Shantanu
+shenxianpeng
shireenrao
Shivansh-007
+Shixian Sheng
Shlomi Fish
Shovan Maity
Simeon Visser
@@ -741,6 +765,7 @@ Wolfgang Maier
Wu Zhenyu
XAMES3
Xavier Fernandez
+Xianpeng Shen
xoviat
xtreak
YAMAMOTO Takashi
@@ -757,4 +782,3 @@ Zvezdan Petkovic
Łukasz Langa
Роман Донченко
Семён Марьясин
-‮rekcäH nitraM‮
diff --git a/contrib/python/pip/README.rst b/contrib/python/pip/README.rst
index 6ff117db5d..479ddfd7ba 100644
--- a/contrib/python/pip/README.rst
+++ b/contrib/python/pip/README.rst
@@ -1,18 +1,20 @@
pip - The Python Package Installer
==================================
-.. image:: https://img.shields.io/pypi/v/pip.svg
+.. |pypi-version| image:: https://img.shields.io/pypi/v/pip.svg
:target: https://pypi.org/project/pip/
:alt: PyPI
-.. image:: https://img.shields.io/pypi/pyversions/pip
+.. |python-versions| image:: https://img.shields.io/pypi/pyversions/pip
:target: https://pypi.org/project/pip
:alt: PyPI - Python Version
-.. image:: https://readthedocs.org/projects/pip/badge/?version=latest
+.. |docs-badge| image:: https://readthedocs.org/projects/pip/badge/?version=latest
:target: https://pip.pypa.io/en/latest
:alt: Documentation
+|pypi-version| |python-versions| |docs-badge|
+
pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.
Please take a look at our documentation for how to install and use pip:
diff --git a/contrib/python/pip/pip/__init__.py b/contrib/python/pip/pip/__init__.py
index be0e3edbc4..a452d0fe25 100644
--- a/contrib/python/pip/pip/__init__.py
+++ b/contrib/python/pip/pip/__init__.py
@@ -1,6 +1,6 @@
from typing import List, Optional
-__version__ = "24.0"
+__version__ = "24.1"
def main(args: Optional[List[str]] = None) -> int:
diff --git a/contrib/python/pip/pip/__pip-runner__.py b/contrib/python/pip/pip/__pip-runner__.py
index 49a148a097..c633787fce 100644
--- a/contrib/python/pip/pip/__pip-runner__.py
+++ b/contrib/python/pip/pip/__pip-runner__.py
@@ -8,8 +8,8 @@ an import statement.
import sys
-# Copied from setup.py
-PYTHON_REQUIRES = (3, 7)
+# Copied from pyproject.toml
+PYTHON_REQUIRES = (3, 8)
def version_str(version): # type: ignore
diff --git a/contrib/python/pip/pip/_internal/__init__.py b/contrib/python/pip/pip/_internal/__init__.py
index 96c6b88c11..1a5b7f87f9 100644
--- a/contrib/python/pip/pip/_internal/__init__.py
+++ b/contrib/python/pip/pip/_internal/__init__.py
@@ -7,7 +7,7 @@ from pip._internal.utils import _log
_log.init_logging()
-def main(args: (Optional[List[str]]) = None) -> int:
+def main(args: Optional[List[str]] = None) -> int:
"""This is preserved for old console scripts that may still be referencing
it.
diff --git a/contrib/python/pip/pip/_internal/build_env.py b/contrib/python/pip/pip/_internal/build_env.py
index 4f704a3547..838de86474 100644
--- a/contrib/python/pip/pip/_internal/build_env.py
+++ b/contrib/python/pip/pip/_internal/build_env.py
@@ -19,6 +19,7 @@ from pip import __file__ as pip_location
from pip._internal.cli.spinners import open_spinner
from pip._internal.locations import get_platlib, get_purelib, get_scheme
from pip._internal.metadata import get_default_environment, get_environment
+from pip._internal.utils.logging import VERBOSE
from pip._internal.utils.subprocess import call_subprocess
from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
@@ -242,6 +243,8 @@ class BuildEnvironment:
"--no-warn-script-location",
]
if logger.getEffectiveLevel() <= logging.DEBUG:
+ args.append("-vv")
+ elif logger.getEffectiveLevel() <= VERBOSE:
args.append("-v")
for format_control in ("no_binary", "only_binary"):
formats = getattr(finder.format_control, format_control)
diff --git a/contrib/python/pip/pip/_internal/cache.py b/contrib/python/pip/pip/_internal/cache.py
index f45ac23e95..6b4512672d 100644
--- a/contrib/python/pip/pip/_internal/cache.py
+++ b/contrib/python/pip/pip/_internal/cache.py
@@ -44,7 +44,7 @@ class Cache:
"""Get parts of part that must be os.path.joined with cache_dir"""
# We want to generate an url to use as our cache key, we don't want to
- # just re-use the URL because it might have other items in the fragment
+ # just reuse the URL because it might have other items in the fragment
# and we don't care about those.
key_parts = {"url": link.url_without_fragment}
if link.hash_name is not None and link.hash is not None:
diff --git a/contrib/python/pip/pip/_internal/cli/autocompletion.py b/contrib/python/pip/pip/_internal/cli/autocompletion.py
index e5950b9069..f3f70ac855 100644
--- a/contrib/python/pip/pip/_internal/cli/autocompletion.py
+++ b/contrib/python/pip/pip/_internal/cli/autocompletion.py
@@ -17,6 +17,10 @@ def autocomplete() -> None:
# Don't complete if user hasn't sourced bash_completion file.
if "PIP_AUTO_COMPLETE" not in os.environ:
return
+ # Don't complete if autocompletion environment variables
+ # are not present
+ if not os.environ.get("COMP_WORDS") or not os.environ.get("COMP_CWORD"):
+ return
cwords = os.environ["COMP_WORDS"].split()[1:]
cword = int(os.environ["COMP_CWORD"])
try:
diff --git a/contrib/python/pip/pip/_internal/cli/base_command.py b/contrib/python/pip/pip/_internal/cli/base_command.py
index db9d5cc662..09f8c75ff8 100644
--- a/contrib/python/pip/pip/_internal/cli/base_command.py
+++ b/contrib/python/pip/pip/_internal/cli/base_command.py
@@ -28,7 +28,6 @@ from pip._internal.exceptions import (
InstallationError,
NetworkConnectionError,
PreviousBuildDirError,
- UninstallationError,
)
from pip._internal.utils.filesystem import check_path_owner
from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging
@@ -192,7 +191,6 @@ class Command(CommandContextMixIn):
return PREVIOUS_BUILD_DIR_ERROR
except (
InstallationError,
- UninstallationError,
BadCommand,
NetworkConnectionError,
) as exc:
diff --git a/contrib/python/pip/pip/_internal/cli/cmdoptions.py b/contrib/python/pip/pip/_internal/cli/cmdoptions.py
index d05e502f90..a47f8a3f46 100644
--- a/contrib/python/pip/pip/_internal/cli/cmdoptions.py
+++ b/contrib/python/pip/pip/_internal/cli/cmdoptions.py
@@ -226,9 +226,9 @@ progress_bar: Callable[..., Option] = partial(
"--progress-bar",
dest="progress_bar",
type="choice",
- choices=["on", "off"],
+ choices=["on", "off", "raw"],
default="on",
- help="Specify whether the progress bar should be used [on, off] (default: on)",
+ help="Specify whether the progress bar should be used [on, off, raw] (default: on)",
)
log: Callable[..., Option] = partial(
@@ -903,7 +903,7 @@ root_user_action: Callable[..., Option] = partial(
dest="root_user_action",
default="warn",
choices=["warn", "ignore"],
- help="Action if pip is run as a root user. By default, a warning message is shown.",
+ help="Action if pip is run as a root user [warn, ignore] (default: warn)",
)
diff --git a/contrib/python/pip/pip/_internal/cli/index_command.py b/contrib/python/pip/pip/_internal/cli/index_command.py
new file mode 100644
index 0000000000..4ff7b2c3a5
--- /dev/null
+++ b/contrib/python/pip/pip/_internal/cli/index_command.py
@@ -0,0 +1,172 @@
+"""
+Contains command classes which may interact with an index / the network.
+
+Unlike its sister module, req_command, this module still uses lazy imports
+so commands which don't always hit the network (e.g. list w/o --outdated or
+--uptodate) don't need waste time importing PipSession and friends.
+"""
+
+import logging
+import os
+import sys
+from optparse import Values
+from typing import TYPE_CHECKING, List, Optional
+
+from pip._internal.cli.base_command import Command
+from pip._internal.cli.command_context import CommandContextMixIn
+from pip._internal.exceptions import CommandError
+
+if TYPE_CHECKING:
+ from ssl import SSLContext
+
+ from pip._internal.network.session import PipSession
+
+logger = logging.getLogger(__name__)
+
+
+def _create_truststore_ssl_context() -> Optional["SSLContext"]:
+ if sys.version_info < (3, 10):
+ raise CommandError("The truststore feature is only available for Python 3.10+")
+
+ try:
+ import ssl
+ except ImportError:
+ logger.warning("Disabling truststore since ssl support is missing")
+ return None
+
+ try:
+ from pip._vendor import truststore
+ except ImportError as e:
+ raise CommandError(f"The truststore feature is unavailable: {e}")
+
+ return truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
+
+
+class SessionCommandMixin(CommandContextMixIn):
+ """
+ A class mixin for command classes needing _build_session().
+ """
+
+ def __init__(self) -> None:
+ super().__init__()
+ self._session: Optional["PipSession"] = None
+
+ @classmethod
+ def _get_index_urls(cls, options: Values) -> Optional[List[str]]:
+ """Return a list of index urls from user-provided options."""
+ index_urls = []
+ if not getattr(options, "no_index", False):
+ url = getattr(options, "index_url", None)
+ if url:
+ index_urls.append(url)
+ urls = getattr(options, "extra_index_urls", None)
+ if urls:
+ index_urls.extend(urls)
+ # Return None rather than an empty list
+ return index_urls or None
+
+ def get_default_session(self, options: Values) -> "PipSession":
+ """Get a default-managed session."""
+ if self._session is None:
+ self._session = self.enter_context(self._build_session(options))
+ # there's no type annotation on requests.Session, so it's
+ # automatically ContextManager[Any] and self._session becomes Any,
+ # then https://github.com/python/mypy/issues/7696 kicks in
+ assert self._session is not None
+ return self._session
+
+ def _build_session(
+ self,
+ options: Values,
+ retries: Optional[int] = None,
+ timeout: Optional[int] = None,
+ fallback_to_certifi: bool = False,
+ ) -> "PipSession":
+ from pip._internal.network.session import PipSession
+
+ cache_dir = options.cache_dir
+ assert not cache_dir or os.path.isabs(cache_dir)
+
+ if "truststore" in options.features_enabled:
+ try:
+ ssl_context = _create_truststore_ssl_context()
+ except Exception:
+ if not fallback_to_certifi:
+ raise
+ ssl_context = None
+ else:
+ ssl_context = None
+
+ session = PipSession(
+ cache=os.path.join(cache_dir, "http-v2") if cache_dir else None,
+ retries=retries if retries is not None else options.retries,
+ trusted_hosts=options.trusted_hosts,
+ index_urls=self._get_index_urls(options),
+ ssl_context=ssl_context,
+ )
+
+ # Handle custom ca-bundles from the user
+ if options.cert:
+ session.verify = options.cert
+
+ # Handle SSL client certificate
+ if options.client_cert:
+ session.cert = options.client_cert
+
+ # Handle timeouts
+ if options.timeout or timeout:
+ session.timeout = timeout if timeout is not None else options.timeout
+
+ # Handle configured proxies
+ if options.proxy:
+ session.proxies = {
+ "http": options.proxy,
+ "https": options.proxy,
+ }
+ session.trust_env = False
+
+ # Determine if we can prompt the user for authentication or not
+ session.auth.prompting = not options.no_input
+ session.auth.keyring_provider = options.keyring_provider
+
+ return session
+
+
+def _pip_self_version_check(session: "PipSession", options: Values) -> None:
+ from pip._internal.self_outdated_check import pip_self_version_check as check
+
+ check(session, options)
+
+
+class IndexGroupCommand(Command, SessionCommandMixin):
+ """
+ Abstract base class for commands with the index_group options.
+
+ This also corresponds to the commands that permit the pip version check.
+ """
+
+ def handle_pip_version_check(self, options: Values) -> None:
+ """
+ Do the pip version check if not disabled.
+
+ This overrides the default behavior of not doing the check.
+ """
+ # Make sure the index_group options are present.
+ assert hasattr(options, "no_index")
+
+ if options.disable_pip_version_check or options.no_index:
+ return
+
+ # Otherwise, check if we're using the latest version of pip available.
+ session = self._build_session(
+ options,
+ retries=0,
+ timeout=min(5, options.timeout),
+ # This is set to ensure the function does not fail when truststore is
+ # specified in use-feature but cannot be loaded. This usually raises a
+ # CommandError and shows a nice user-facing error, but this function is not
+ # called in that try-except block.
+ fallback_to_certifi=True,
+ )
+ with session:
+ _pip_self_version_check(session, options)
diff --git a/contrib/python/pip/pip/_internal/cli/main.py b/contrib/python/pip/pip/_internal/cli/main.py
index 7e061f5b39..563ac79c98 100644
--- a/contrib/python/pip/pip/_internal/cli/main.py
+++ b/contrib/python/pip/pip/_internal/cli/main.py
@@ -1,5 +1,6 @@
"""Primary application entrypoint.
"""
+
import locale
import logging
import os
diff --git a/contrib/python/pip/pip/_internal/cli/parser.py b/contrib/python/pip/pip/_internal/cli/parser.py
index ae554b24ca..b7d7c1f600 100644
--- a/contrib/python/pip/pip/_internal/cli/parser.py
+++ b/contrib/python/pip/pip/_internal/cli/parser.py
@@ -6,7 +6,7 @@ import shutil
import sys
import textwrap
from contextlib import suppress
-from typing import Any, Dict, Generator, List, Tuple
+from typing import Any, Dict, Generator, List, Optional, Tuple
from pip._internal.cli.status_codes import UNKNOWN_ERROR
from pip._internal.configuration import Configuration, ConfigurationError
@@ -67,7 +67,7 @@ class PrettyHelpFormatter(optparse.IndentedHelpFormatter):
msg = "\nUsage: {}\n".format(self.indent_lines(textwrap.dedent(usage), " "))
return msg
- def format_description(self, description: str) -> str:
+ def format_description(self, description: Optional[str]) -> str:
# leave full control over description to us
if description:
if hasattr(self.parser, "main"):
@@ -85,7 +85,7 @@ class PrettyHelpFormatter(optparse.IndentedHelpFormatter):
else:
return ""
- def format_epilog(self, epilog: str) -> str:
+ def format_epilog(self, epilog: Optional[str]) -> str:
# leave full control over epilog to us
if epilog:
return epilog
diff --git a/contrib/python/pip/pip/_internal/cli/progress_bars.py b/contrib/python/pip/pip/_internal/cli/progress_bars.py
index 0ad14031ca..b842b1b316 100644
--- a/contrib/python/pip/pip/_internal/cli/progress_bars.py
+++ b/contrib/python/pip/pip/_internal/cli/progress_bars.py
@@ -1,4 +1,5 @@
import functools
+import sys
from typing import Callable, Generator, Iterable, Iterator, Optional, Tuple
from pip._vendor.rich.progress import (
@@ -14,6 +15,7 @@ from pip._vendor.rich.progress import (
TransferSpeedColumn,
)
+from pip._internal.cli.spinners import RateLimiter
from pip._internal.utils.logging import get_indentation
DownloadProgressRenderer = Callable[[Iterable[bytes]], Iterator[bytes]]
@@ -55,6 +57,28 @@ def _rich_progress_bar(
progress.update(task_id, advance=len(chunk))
+def _raw_progress_bar(
+ iterable: Iterable[bytes],
+ *,
+ size: Optional[int],
+) -> Generator[bytes, None, None]:
+ def write_progress(current: int, total: int) -> None:
+ sys.stdout.write("Progress %d of %d\n" % (current, total))
+ sys.stdout.flush()
+
+ current = 0
+ total = size or 0
+ rate_limiter = RateLimiter(0.25)
+
+ write_progress(current, total)
+ for chunk in iterable:
+ current += len(chunk)
+ if rate_limiter.ready() or current == total:
+ write_progress(current, total)
+ rate_limiter.reset()
+ yield chunk
+
+
def get_download_progress_renderer(
*, bar_type: str, size: Optional[int] = None
) -> DownloadProgressRenderer:
@@ -64,5 +88,7 @@ def get_download_progress_renderer(
"""
if bar_type == "on":
return functools.partial(_rich_progress_bar, bar_type=bar_type, size=size)
+ elif bar_type == "raw":
+ return functools.partial(_raw_progress_bar, size=size)
else:
return iter # no-op, when passed an iterator
diff --git a/contrib/python/pip/pip/_internal/cli/req_command.py b/contrib/python/pip/pip/_internal/cli/req_command.py
index 6f2f79c6b3..92900f94ff 100644
--- a/contrib/python/pip/pip/_internal/cli/req_command.py
+++ b/contrib/python/pip/pip/_internal/cli/req_command.py
@@ -1,21 +1,19 @@
-"""Contains the Command base classes that depend on PipSession.
+"""Contains the RequirementCommand base class.
-The classes in this module are in a separate module so the commands not
-needing download / PackageFinder capability don't unnecessarily import the
+This class is in a separate module so the commands that do not always
+need PackageFinder capability don't unnecessarily import the
PackageFinder machinery and all its vendored dependencies, etc.
"""
import logging
-import os
-import sys
from functools import partial
from optparse import Values
-from typing import TYPE_CHECKING, Any, List, Optional, Tuple
+from typing import Any, List, Optional, Tuple
from pip._internal.cache import WheelCache
from pip._internal.cli import cmdoptions
-from pip._internal.cli.base_command import Command
-from pip._internal.cli.command_context import CommandContextMixIn
+from pip._internal.cli.index_command import IndexGroupCommand
+from pip._internal.cli.index_command import SessionCommandMixin as SessionCommandMixin
from pip._internal.exceptions import CommandError, PreviousBuildDirError
from pip._internal.index.collector import LinkCollector
from pip._internal.index.package_finder import PackageFinder
@@ -33,161 +31,15 @@ from pip._internal.req.constructors import (
from pip._internal.req.req_file import parse_requirements
from pip._internal.req.req_install import InstallRequirement
from pip._internal.resolution.base import BaseResolver
-from pip._internal.self_outdated_check import pip_self_version_check
from pip._internal.utils.temp_dir import (
TempDirectory,
TempDirectoryTypeRegistry,
tempdir_kinds,
)
-from pip._internal.utils.virtualenv import running_under_virtualenv
-
-if TYPE_CHECKING:
- from ssl import SSLContext
logger = logging.getLogger(__name__)
-def _create_truststore_ssl_context() -> Optional["SSLContext"]:
- if sys.version_info < (3, 10):
- raise CommandError("The truststore feature is only available for Python 3.10+")
-
- try:
- import ssl
- except ImportError:
- logger.warning("Disabling truststore since ssl support is missing")
- return None
-
- try:
- from pip._vendor import truststore
- except ImportError as e:
- raise CommandError(f"The truststore feature is unavailable: {e}")
-
- return truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
-
-
-class SessionCommandMixin(CommandContextMixIn):
-
- """
- A class mixin for command classes needing _build_session().
- """
-
- def __init__(self) -> None:
- super().__init__()
- self._session: Optional[PipSession] = None
-
- @classmethod
- def _get_index_urls(cls, options: Values) -> Optional[List[str]]:
- """Return a list of index urls from user-provided options."""
- index_urls = []
- if not getattr(options, "no_index", False):
- url = getattr(options, "index_url", None)
- if url:
- index_urls.append(url)
- urls = getattr(options, "extra_index_urls", None)
- if urls:
- index_urls.extend(urls)
- # Return None rather than an empty list
- return index_urls or None
-
- def get_default_session(self, options: Values) -> PipSession:
- """Get a default-managed session."""
- if self._session is None:
- self._session = self.enter_context(self._build_session(options))
- # there's no type annotation on requests.Session, so it's
- # automatically ContextManager[Any] and self._session becomes Any,
- # then https://github.com/python/mypy/issues/7696 kicks in
- assert self._session is not None
- return self._session
-
- def _build_session(
- self,
- options: Values,
- retries: Optional[int] = None,
- timeout: Optional[int] = None,
- fallback_to_certifi: bool = False,
- ) -> PipSession:
- cache_dir = options.cache_dir
- assert not cache_dir or os.path.isabs(cache_dir)
-
- if "truststore" in options.features_enabled:
- try:
- ssl_context = _create_truststore_ssl_context()
- except Exception:
- if not fallback_to_certifi:
- raise
- ssl_context = None
- else:
- ssl_context = None
-
- session = PipSession(
- cache=os.path.join(cache_dir, "http-v2") if cache_dir else None,
- retries=retries if retries is not None else options.retries,
- trusted_hosts=options.trusted_hosts,
- index_urls=self._get_index_urls(options),
- ssl_context=ssl_context,
- )
-
- # Handle custom ca-bundles from the user
- if options.cert:
- session.verify = options.cert
-
- # Handle SSL client certificate
- if options.client_cert:
- session.cert = options.client_cert
-
- # Handle timeouts
- if options.timeout or timeout:
- session.timeout = timeout if timeout is not None else options.timeout
-
- # Handle configured proxies
- if options.proxy:
- session.proxies = {
- "http": options.proxy,
- "https": options.proxy,
- }
-
- # Determine if we can prompt the user for authentication or not
- session.auth.prompting = not options.no_input
- session.auth.keyring_provider = options.keyring_provider
-
- return session
-
-
-class IndexGroupCommand(Command, SessionCommandMixin):
-
- """
- Abstract base class for commands with the index_group options.
-
- This also corresponds to the commands that permit the pip version check.
- """
-
- def handle_pip_version_check(self, options: Values) -> None:
- """
- Do the pip version check if not disabled.
-
- This overrides the default behavior of not doing the check.
- """
- # Make sure the index_group options are present.
- assert hasattr(options, "no_index")
-
- if options.disable_pip_version_check or options.no_index:
- return
-
- # Otherwise, check if we're using the latest version of pip available.
- session = self._build_session(
- options,
- retries=0,
- timeout=min(5, options.timeout),
- # This is set to ensure the function does not fail when truststore is
- # specified in use-feature but cannot be loaded. This usually raises a
- # CommandError and shows a nice user-facing error, but this function is not
- # called in that try-except block.
- fallback_to_certifi=True,
- )
- with session:
- pip_self_version_check(session, options)
-
-
KEEPABLE_TEMPDIR_TYPES = [
tempdir_kinds.BUILD_ENV,
tempdir_kinds.EPHEM_WHEEL_CACHE,
@@ -195,36 +47,6 @@ KEEPABLE_TEMPDIR_TYPES = [
]
-def warn_if_run_as_root() -> None:
- """Output a warning for sudo users on Unix.
-
- In a virtual environment, sudo pip still writes to virtualenv.
- On Windows, users may run pip as Administrator without issues.
- This warning only applies to Unix root users outside of virtualenv.
- """
- if running_under_virtualenv():
- return
- if not hasattr(os, "getuid"):
- return
- # On Windows, there are no "system managed" Python packages. Installing as
- # Administrator via pip is the correct way of updating system environments.
- #
- # We choose sys.platform over utils.compat.WINDOWS here to enable Mypy platform
- # checks: https://mypy.readthedocs.io/en/stable/common_issues.html
- if sys.platform == "win32" or sys.platform == "cygwin":
- return
-
- if os.getuid() != 0:
- return
-
- logger.warning(
- "Running pip as the 'root' user can result in broken permissions and "
- "conflicting behaviour with the system package manager. "
- "It is recommended to use a virtual environment instead: "
- "https://pip.pypa.io/warnings/venv"
- )
-
-
def with_cleanup(func: Any) -> Any:
"""Decorator for common logic related to managing temporary
directories.
@@ -438,9 +260,11 @@ class RequirementCommand(IndexGroupCommand):
isolated=options.isolated_mode,
use_pep517=options.use_pep517,
user_supplied=True,
- config_settings=parsed_req.options.get("config_settings")
- if parsed_req.options
- else None,
+ config_settings=(
+ parsed_req.options.get("config_settings")
+ if parsed_req.options
+ else None
+ ),
)
requirements.append(req_to_add)
diff --git a/contrib/python/pip/pip/_internal/commands/check.py b/contrib/python/pip/pip/_internal/commands/check.py
index 5efd0a3416..584df9f55c 100644
--- a/contrib/python/pip/pip/_internal/commands/check.py
+++ b/contrib/python/pip/pip/_internal/commands/check.py
@@ -7,7 +7,6 @@ from pip._internal.cli.status_codes import ERROR, SUCCESS
from pip._internal.operations.check import (
check_package_set,
create_package_set_from_installed,
- warn_legacy_versions_and_specifiers,
)
from pip._internal.utils.misc import write_output
@@ -22,7 +21,6 @@ class CheckCommand(Command):
def run(self, options: Values, args: List[str]) -> int:
package_set, parsing_probs = create_package_set_from_installed()
- warn_legacy_versions_and_specifiers(package_set)
missing, conflicting = check_package_set(package_set)
for project_name in missing:
diff --git a/contrib/python/pip/pip/_internal/commands/debug.py b/contrib/python/pip/pip/_internal/commands/debug.py
index 7e5271c988..567ca967e5 100644
--- a/contrib/python/pip/pip/_internal/commands/debug.py
+++ b/contrib/python/pip/pip/_internal/commands/debug.py
@@ -1,4 +1,3 @@
-import importlib.resources
import locale
import logging
import os
@@ -17,6 +16,7 @@ from pip._internal.cli.cmdoptions import make_target_python
from pip._internal.cli.status_codes import SUCCESS
from pip._internal.configuration import Configuration
from pip._internal.metadata import get_environment
+from pip._internal.utils.compat import open_text_resource
from pip._internal.utils.logging import indent_log
from pip._internal.utils.misc import get_pip_version
@@ -35,7 +35,7 @@ def show_sys_implementation() -> None:
def create_vendor_txt_map() -> Dict[str, str]:
- with importlib.resources.open_text("pip._vendor", "vendor.txt") as f:
+ with open_text_resource("pip._vendor", "vendor.txt") as f:
# Purge non version specifying lines.
# Also, remove any space prefix or suffixes (including comments).
lines = [
diff --git a/contrib/python/pip/pip/_internal/commands/download.py b/contrib/python/pip/pip/_internal/commands/download.py
index 54247a78a6..917bbb91d8 100644
--- a/contrib/python/pip/pip/_internal/commands/download.py
+++ b/contrib/python/pip/pip/_internal/commands/download.py
@@ -139,7 +139,6 @@ class DownloadCommand(RequirementCommand):
downloaded.append(req.name)
preparer.prepare_linked_requirements_more(requirement_set.requirements.values())
- requirement_set.warn_legacy_versions_and_specifiers()
if downloaded:
write_output("Successfully downloaded %s", " ".join(downloaded))
diff --git a/contrib/python/pip/pip/_internal/commands/index.py b/contrib/python/pip/pip/_internal/commands/index.py
index f55e9e4997..2e2661bba7 100644
--- a/contrib/python/pip/pip/_internal/commands/index.py
+++ b/contrib/python/pip/pip/_internal/commands/index.py
@@ -1,8 +1,8 @@
import logging
from optparse import Values
-from typing import Any, Iterable, List, Optional, Union
+from typing import Any, Iterable, List, Optional
-from pip._vendor.packaging.version import LegacyVersion, Version
+from pip._vendor.packaging.version import Version
from pip._internal.cli import cmdoptions
from pip._internal.cli.req_command import IndexGroupCommand
@@ -115,7 +115,7 @@ class IndexCommand(IndexGroupCommand):
ignore_requires_python=options.ignore_requires_python,
)
- versions: Iterable[Union[LegacyVersion, Version]] = (
+ versions: Iterable[Version] = (
candidate.version for candidate in finder.find_all_candidates(query)
)
diff --git a/contrib/python/pip/pip/_internal/commands/inspect.py b/contrib/python/pip/pip/_internal/commands/inspect.py
index 27c8fa3d5b..e810c13166 100644
--- a/contrib/python/pip/pip/_internal/commands/inspect.py
+++ b/contrib/python/pip/pip/_internal/commands/inspect.py
@@ -7,7 +7,7 @@ from pip._vendor.rich import print_json
from pip import __version__
from pip._internal.cli import cmdoptions
-from pip._internal.cli.req_command import Command
+from pip._internal.cli.base_command import Command
from pip._internal.cli.status_codes import SUCCESS
from pip._internal.metadata import BaseDistribution, get_environment
from pip._internal.utils.compat import stdlib_pkgs
diff --git a/contrib/python/pip/pip/_internal/commands/install.py b/contrib/python/pip/pip/_internal/commands/install.py
index e944bb95a5..d5b06c8c78 100644
--- a/contrib/python/pip/pip/_internal/commands/install.py
+++ b/contrib/python/pip/pip/_internal/commands/install.py
@@ -14,7 +14,6 @@ from pip._internal.cli import cmdoptions
from pip._internal.cli.cmdoptions import make_target_python
from pip._internal.cli.req_command import (
RequirementCommand,
- warn_if_run_as_root,
with_cleanup,
)
from pip._internal.cli.status_codes import ERROR, SUCCESS
@@ -37,6 +36,7 @@ from pip._internal.utils.misc import (
ensure_dir,
get_pip_version,
protect_pip_from_modification_on_windows,
+ warn_if_run_as_root,
write_output,
)
from pip._internal.utils.temp_dir import TempDirectory
@@ -387,9 +387,6 @@ class InstallCommand(RequirementCommand):
json.dump(report.to_dict(), f, indent=2, ensure_ascii=False)
if options.dry_run:
- # In non dry-run mode, the legacy versions and specifiers check
- # will be done as part of conflict detection.
- requirement_set.warn_legacy_versions_and_specifiers()
would_install_items = sorted(
(r.metadata["name"], r.metadata["version"])
for r in requirement_set.requirements_to_install
@@ -409,6 +406,12 @@ class InstallCommand(RequirementCommand):
# If we're not replacing an already installed pip,
# we're not modifying it.
modifying_pip = pip_req.satisfied_by is None
+ if modifying_pip:
+ # Eagerly import this module to avoid crashes. Otherwise, this
+ # module would be imported *after* pip was replaced, resulting in
+ # crashes if the new self_outdated_check module was incompatible
+ # with the rest of pip that's already imported.
+ import pip._internal.self_outdated_check # noqa: F401
protect_pip_from_modification_on_windows(modifying_pip=modifying_pip)
reqs_to_build = [
@@ -427,8 +430,8 @@ class InstallCommand(RequirementCommand):
if build_failures:
raise InstallationError(
- "Could not build wheels for {}, which is required to "
- "install pyproject.toml-based projects".format(
+ "ERROR: Failed to build installable wheels for some "
+ "pyproject.toml based projects ({})".format(
", ".join(r.name for r in build_failures) # type: ignore
)
)
diff --git a/contrib/python/pip/pip/_internal/commands/list.py b/contrib/python/pip/pip/_internal/commands/list.py
index e551dda9a9..82fc46a118 100644
--- a/contrib/python/pip/pip/_internal/commands/list.py
+++ b/contrib/python/pip/pip/_internal/commands/list.py
@@ -4,21 +4,20 @@ from optparse import Values
from typing import TYPE_CHECKING, Generator, List, Optional, Sequence, Tuple, cast
from pip._vendor.packaging.utils import canonicalize_name
+from pip._vendor.packaging.version import Version
from pip._internal.cli import cmdoptions
-from pip._internal.cli.req_command import IndexGroupCommand
+from pip._internal.cli.index_command import IndexGroupCommand
from pip._internal.cli.status_codes import SUCCESS
from pip._internal.exceptions import CommandError
-from pip._internal.index.collector import LinkCollector
-from pip._internal.index.package_finder import PackageFinder
from pip._internal.metadata import BaseDistribution, get_environment
from pip._internal.models.selection_prefs import SelectionPreferences
-from pip._internal.network.session import PipSession
from pip._internal.utils.compat import stdlib_pkgs
from pip._internal.utils.misc import tabulate, write_output
if TYPE_CHECKING:
- from pip._internal.metadata.base import DistributionVersion
+ from pip._internal.index.package_finder import PackageFinder
+ from pip._internal.network.session import PipSession
class _DistWithLatestInfo(BaseDistribution):
"""Give the distribution object a couple of extra fields.
@@ -27,7 +26,7 @@ if TYPE_CHECKING:
makes the rest of the code much cleaner.
"""
- latest_version: DistributionVersion
+ latest_version: Version
latest_filetype: str
_ProcessedDists = Sequence[_DistWithLatestInfo]
@@ -135,12 +134,20 @@ class ListCommand(IndexGroupCommand):
self.parser.insert_option_group(0, index_opts)
self.parser.insert_option_group(0, self.cmd_opts)
+ def handle_pip_version_check(self, options: Values) -> None:
+ if options.outdated or options.uptodate:
+ super().handle_pip_version_check(options)
+
def _build_package_finder(
- self, options: Values, session: PipSession
- ) -> PackageFinder:
+ self, options: Values, session: "PipSession"
+ ) -> "PackageFinder":
"""
Create a package finder appropriate to this list command.
"""
+ # Lazy import the heavy index modules as most list invocations won't need 'em.
+ from pip._internal.index.collector import LinkCollector
+ from pip._internal.index.package_finder import PackageFinder
+
link_collector = LinkCollector.create(session, options=options)
# Pass allow_yanked=False to ignore yanked versions.
@@ -329,7 +336,7 @@ def format_for_columns(
for proj in pkgs:
# if we're working on the 'outdated' list, separate out the
# latest_version and type
- row = [proj.raw_name, str(proj.version)]
+ row = [proj.raw_name, proj.raw_version]
if running_outdated:
row.append(str(proj.latest_version))
diff --git a/contrib/python/pip/pip/_internal/commands/search.py b/contrib/python/pip/pip/_internal/commands/search.py
index 03ed925b24..e0d329d58a 100644
--- a/contrib/python/pip/pip/_internal/commands/search.py
+++ b/contrib/python/pip/pip/_internal/commands/search.py
@@ -5,7 +5,7 @@ import textwrap
import xmlrpc.client
from collections import OrderedDict
from optparse import Values
-from typing import TYPE_CHECKING, Dict, List, Optional
+from typing import TYPE_CHECKING, Dict, List, Optional, TypedDict
from pip._vendor.packaging.version import parse as parse_version
@@ -20,7 +20,6 @@ from pip._internal.utils.logging import indent_log
from pip._internal.utils.misc import write_output
if TYPE_CHECKING:
- from typing import TypedDict
class TransformedHit(TypedDict):
name: str
@@ -76,9 +75,8 @@ class SearchCommand(Command, SessionCommandMixin):
try:
hits = pypi.search({"name": query, "summary": query}, "or")
except xmlrpc.client.Fault as fault:
- message = "XMLRPC request failed [code: {code}]\n{string}".format(
- code=fault.faultCode,
- string=fault.faultString,
+ message = (
+ f"XMLRPC request failed [code: {fault.faultCode}]\n{fault.faultString}"
)
raise CommandError(message)
assert isinstance(hits, list)
diff --git a/contrib/python/pip/pip/_internal/commands/show.py b/contrib/python/pip/pip/_internal/commands/show.py
index 3f10701f6b..c54d548f5f 100644
--- a/contrib/python/pip/pip/_internal/commands/show.py
+++ b/contrib/python/pip/pip/_internal/commands/show.py
@@ -2,6 +2,7 @@ import logging
from optparse import Values
from typing import Generator, Iterable, Iterator, List, NamedTuple, Optional
+from pip._vendor.packaging.requirements import InvalidRequirement
from pip._vendor.packaging.utils import canonicalize_name
from pip._internal.cli.base_command import Command
@@ -100,8 +101,19 @@ def search_packages_info(query: List[str]) -> Generator[_PackageInfo, None, None
except KeyError:
continue
- requires = sorted((req.name for req in dist.iter_dependencies()), key=str.lower)
- required_by = sorted(_get_requiring_packages(dist), key=str.lower)
+ try:
+ requires = sorted(
+ # Avoid duplicates in requirements (e.g. due to environment markers).
+ {req.name for req in dist.iter_dependencies()},
+ key=str.lower,
+ )
+ except InvalidRequirement:
+ requires = sorted(dist.iter_raw_dependencies(), key=str.lower)
+
+ try:
+ required_by = sorted(_get_requiring_packages(dist), key=str.lower)
+ except InvalidRequirement:
+ required_by = ["#N/A"]
try:
entry_points_text = dist.read_text("entry_points.txt")
@@ -117,9 +129,25 @@ def search_packages_info(query: List[str]) -> Generator[_PackageInfo, None, None
metadata = dist.metadata
+ project_urls = metadata.get_all("Project-URL", [])
+ homepage = metadata.get("Home-page", "")
+ if not homepage:
+ # It's common that there is a "homepage" Project-URL, but Home-page
+ # remains unset (especially as PEP 621 doesn't surface the field).
+ #
+ # This logic was taken from PyPI's codebase.
+ for url in project_urls:
+ url_label, url = url.split(",", maxsplit=1)
+ normalized_label = (
+ url_label.casefold().replace("-", "").replace("_", "").strip()
+ )
+ if normalized_label == "homepage":
+ homepage = url.strip()
+ break
+
yield _PackageInfo(
name=dist.raw_name,
- version=str(dist.version),
+ version=dist.raw_version,
location=dist.location or "",
editable_project_location=dist.editable_project_location,
requires=requires,
@@ -128,8 +156,8 @@ def search_packages_info(query: List[str]) -> Generator[_PackageInfo, None, None
metadata_version=dist.metadata_version or "",
classifiers=metadata.get_all("Classifier", []),
summary=metadata.get("Summary", ""),
- homepage=metadata.get("Home-page", ""),
- project_urls=metadata.get_all("Project-URL", []),
+ homepage=homepage,
+ project_urls=project_urls,
author=metadata.get("Author", ""),
author_email=metadata.get("Author-email", ""),
license=metadata.get("License", ""),
diff --git a/contrib/python/pip/pip/_internal/commands/uninstall.py b/contrib/python/pip/pip/_internal/commands/uninstall.py
index f198fc313f..bc0edeac9f 100644
--- a/contrib/python/pip/pip/_internal/commands/uninstall.py
+++ b/contrib/python/pip/pip/_internal/commands/uninstall.py
@@ -6,7 +6,7 @@ from pip._vendor.packaging.utils import canonicalize_name
from pip._internal.cli import cmdoptions
from pip._internal.cli.base_command import Command
-from pip._internal.cli.req_command import SessionCommandMixin, warn_if_run_as_root
+from pip._internal.cli.index_command import SessionCommandMixin
from pip._internal.cli.status_codes import SUCCESS
from pip._internal.exceptions import InstallationError
from pip._internal.req import parse_requirements
@@ -17,6 +17,7 @@ from pip._internal.req.constructors import (
from pip._internal.utils.misc import (
check_externally_managed,
protect_pip_from_modification_on_windows,
+ warn_if_run_as_root,
)
logger = logging.getLogger(__name__)
diff --git a/contrib/python/pip/pip/_internal/commands/wheel.py b/contrib/python/pip/pip/_internal/commands/wheel.py
index ed578aa250..278719f4e0 100644
--- a/contrib/python/pip/pip/_internal/commands/wheel.py
+++ b/contrib/python/pip/pip/_internal/commands/wheel.py
@@ -154,7 +154,6 @@ class WheelCommand(RequirementCommand):
reqs_to_build.append(req)
preparer.prepare_linked_requirements_more(requirement_set.requirements.values())
- requirement_set.warn_legacy_versions_and_specifiers()
# build wheels
build_successes, build_failures = build(
diff --git a/contrib/python/pip/pip/_internal/distributions/base.py b/contrib/python/pip/pip/_internal/distributions/base.py
index 6fb0d7b777..6e4d0c91a9 100644
--- a/contrib/python/pip/pip/_internal/distributions/base.py
+++ b/contrib/python/pip/pip/_internal/distributions/base.py
@@ -1,10 +1,12 @@
import abc
-from typing import Optional
+from typing import TYPE_CHECKING, Optional
-from pip._internal.index.package_finder import PackageFinder
from pip._internal.metadata.base import BaseDistribution
from pip._internal.req import InstallRequirement
+if TYPE_CHECKING:
+ from pip._internal.index.package_finder import PackageFinder
+
class AbstractDistribution(metaclass=abc.ABCMeta):
"""A base class for handling installable artifacts.
@@ -44,7 +46,7 @@ class AbstractDistribution(metaclass=abc.ABCMeta):
@abc.abstractmethod
def prepare_distribution_metadata(
self,
- finder: PackageFinder,
+ finder: "PackageFinder",
build_isolation: bool,
check_build_deps: bool,
) -> None:
diff --git a/contrib/python/pip/pip/_internal/distributions/sdist.py b/contrib/python/pip/pip/_internal/distributions/sdist.py
index 15ff42b7b1..28ea5cea16 100644
--- a/contrib/python/pip/pip/_internal/distributions/sdist.py
+++ b/contrib/python/pip/pip/_internal/distributions/sdist.py
@@ -1,13 +1,15 @@
import logging
-from typing import Iterable, Optional, Set, Tuple
+from typing import TYPE_CHECKING, Iterable, Optional, Set, Tuple
from pip._internal.build_env import BuildEnvironment
from pip._internal.distributions.base import AbstractDistribution
from pip._internal.exceptions import InstallationError
-from pip._internal.index.package_finder import PackageFinder
from pip._internal.metadata import BaseDistribution
from pip._internal.utils.subprocess import runner_with_spinner_message
+if TYPE_CHECKING:
+ from pip._internal.index.package_finder import PackageFinder
+
logger = logging.getLogger(__name__)
@@ -29,7 +31,7 @@ class SourceDistribution(AbstractDistribution):
def prepare_distribution_metadata(
self,
- finder: PackageFinder,
+ finder: "PackageFinder",
build_isolation: bool,
check_build_deps: bool,
) -> None:
@@ -66,7 +68,7 @@ class SourceDistribution(AbstractDistribution):
self._raise_missing_reqs(missing)
self.req.prepare_metadata()
- def _prepare_build_backend(self, finder: PackageFinder) -> None:
+ def _prepare_build_backend(self, finder: "PackageFinder") -> None:
# Isolate in a BuildEnvironment and install the build-time
# requirements.
pyproject_requires = self.req.pyproject_requires
@@ -110,14 +112,14 @@ class SourceDistribution(AbstractDistribution):
with backend.subprocess_runner(runner):
return backend.get_requires_for_build_editable()
- def _install_build_reqs(self, finder: PackageFinder) -> None:
+ def _install_build_reqs(self, finder: "PackageFinder") -> None:
# Install any extra build dependencies that the backend requests.
# This must be done in a second pass, as the pyproject.toml
# dependencies must be installed before we can call the backend.
if (
self.req.editable
and self.req.permit_editable_wheels
- and self.req.supports_pyproject_editable()
+ and self.req.supports_pyproject_editable
):
build_reqs = self._get_build_requires_editable()
else:
diff --git a/contrib/python/pip/pip/_internal/distributions/wheel.py b/contrib/python/pip/pip/_internal/distributions/wheel.py
index eb16e25cbc..bfadd39dcb 100644
--- a/contrib/python/pip/pip/_internal/distributions/wheel.py
+++ b/contrib/python/pip/pip/_internal/distributions/wheel.py
@@ -1,15 +1,17 @@
-from typing import Optional
+from typing import TYPE_CHECKING, Optional
from pip._vendor.packaging.utils import canonicalize_name
from pip._internal.distributions.base import AbstractDistribution
-from pip._internal.index.package_finder import PackageFinder
from pip._internal.metadata import (
BaseDistribution,
FilesystemWheel,
get_wheel_distribution,
)
+if TYPE_CHECKING:
+ from pip._internal.index.package_finder import PackageFinder
+
class WheelDistribution(AbstractDistribution):
"""Represents a wheel distribution.
@@ -33,7 +35,7 @@ class WheelDistribution(AbstractDistribution):
def prepare_distribution_metadata(
self,
- finder: PackageFinder,
+ finder: "PackageFinder",
build_isolation: bool,
check_build_deps: bool,
) -> None:
diff --git a/contrib/python/pip/pip/_internal/exceptions.py b/contrib/python/pip/pip/_internal/exceptions.py
index 5007a622d8..2587740f73 100644
--- a/contrib/python/pip/pip/_internal/exceptions.py
+++ b/contrib/python/pip/pip/_internal/exceptions.py
@@ -13,16 +13,16 @@ import pathlib
import re
import sys
from itertools import chain, groupby, repeat
-from typing import TYPE_CHECKING, Dict, Iterator, List, Optional, Union
+from typing import TYPE_CHECKING, Dict, Iterator, List, Literal, Optional, Union
-from pip._vendor.requests.models import Request, Response
from pip._vendor.rich.console import Console, ConsoleOptions, RenderResult
from pip._vendor.rich.markup import escape
from pip._vendor.rich.text import Text
if TYPE_CHECKING:
from hashlib import _Hash
- from typing import Literal
+
+ from pip._vendor.requests.models import Request, Response
from pip._internal.metadata import BaseDistribution
from pip._internal.req.req_install import InstallRequirement
@@ -184,10 +184,6 @@ class InstallationError(PipError):
"""General exception during installation"""
-class UninstallationError(PipError):
- """General exception during uninstallation"""
-
-
class MissingPyProjectBuildRequires(DiagnosticPipError):
"""Raised when pyproject.toml has `build-system`, but no `build-system.requires`."""
@@ -294,8 +290,8 @@ class NetworkConnectionError(PipError):
def __init__(
self,
error_msg: str,
- response: Optional[Response] = None,
- request: Optional[Request] = None,
+ response: Optional["Response"] = None,
+ request: Optional["Request"] = None,
) -> None:
"""
Initialize NetworkConnectionError with `request` and `response`
@@ -358,6 +354,17 @@ class MetadataInconsistent(InstallationError):
)
+class MetadataInvalid(InstallationError):
+ """Metadata is invalid."""
+
+ def __init__(self, ireq: "InstallRequirement", error: str) -> None:
+ self.ireq = ireq
+ self.error = error
+
+ def __str__(self) -> str:
+ return f"Requested {self.ireq} has invalid metadata: {self.error}"
+
+
class InstallationSubprocessError(DiagnosticPipError, InstallationError):
"""A subprocess call failed."""
@@ -726,3 +733,45 @@ class ExternallyManagedEnvironment(DiagnosticPipError):
exc_info = logger.isEnabledFor(VERBOSE)
logger.warning("Failed to read %s", config, exc_info=exc_info)
return cls(None)
+
+
+class UninstallMissingRecord(DiagnosticPipError):
+ reference = "uninstall-no-record-file"
+
+ def __init__(self, *, distribution: "BaseDistribution") -> None:
+ installer = distribution.installer
+ if not installer or installer == "pip":
+ dep = f"{distribution.raw_name}=={distribution.version}"
+ hint = Text.assemble(
+ "You might be able to recover from this via: ",
+ (f"pip install --force-reinstall --no-deps {dep}", "green"),
+ )
+ else:
+ hint = Text(
+ f"The package was installed by {installer}. "
+ "You should check if it can uninstall the package."
+ )
+
+ super().__init__(
+ message=Text(f"Cannot uninstall {distribution}"),
+ context=(
+ "The package's contents are unknown: "
+ f"no RECORD file was found for {distribution.raw_name}."
+ ),
+ hint_stmt=hint,
+ )
+
+
+class LegacyDistutilsInstall(DiagnosticPipError):
+ reference = "uninstall-distutils-installed-package"
+
+ def __init__(self, *, distribution: "BaseDistribution") -> None:
+ super().__init__(
+ message=Text(f"Cannot uninstall {distribution}"),
+ context=(
+ "It is a distutils installed project and thus we cannot accurately "
+ "determine which files belong to it which would lead to only a partial "
+ "uninstall."
+ ),
+ hint_stmt=None,
+ )
diff --git a/contrib/python/pip/pip/_internal/index/collector.py b/contrib/python/pip/pip/_internal/index/collector.py
index 08c8bddcb6..5f8fdee3d4 100644
--- a/contrib/python/pip/pip/_internal/index/collector.py
+++ b/contrib/python/pip/pip/_internal/index/collector.py
@@ -11,10 +11,10 @@ import logging
import os
import urllib.parse
import urllib.request
+from dataclasses import dataclass
from html.parser import HTMLParser
from optparse import Values
from typing import (
- TYPE_CHECKING,
Callable,
Dict,
Iterable,
@@ -22,6 +22,7 @@ from typing import (
MutableMapping,
NamedTuple,
Optional,
+ Protocol,
Sequence,
Tuple,
Union,
@@ -42,11 +43,6 @@ from pip._internal.vcs import vcs
from .sources import CandidatesFromPage, LinkSource, build_source
-if TYPE_CHECKING:
- from typing import Protocol
-else:
- Protocol = object
-
logger = logging.getLogger(__name__)
ResponseHeaders = MutableMapping[str, str]
@@ -201,8 +197,7 @@ class CacheablePageContent:
class ParseLinks(Protocol):
- def __call__(self, page: "IndexContent") -> Iterable[Link]:
- ...
+ def __call__(self, page: "IndexContent") -> Iterable[Link]: ...
def with_cached_index_content(fn: ParseLinks) -> ParseLinks:
@@ -254,29 +249,22 @@ def parse_links(page: "IndexContent") -> Iterable[Link]:
yield link
+@dataclass(frozen=True)
class IndexContent:
- """Represents one response (or page), along with its URL"""
+ """Represents one response (or page), along with its URL.
- def __init__(
- self,
- content: bytes,
- content_type: str,
- encoding: Optional[str],
- url: str,
- cache_link_parsing: bool = True,
- ) -> None:
- """
- :param encoding: the encoding to decode the given content.
- :param url: the URL from which the HTML was downloaded.
- :param cache_link_parsing: whether links parsed from this page's url
- should be cached. PyPI index urls should
- have this set to False, for example.
- """
- self.content = content
- self.content_type = content_type
- self.encoding = encoding
- self.url = url
- self.cache_link_parsing = cache_link_parsing
+ :param encoding: the encoding to decode the given content.
+ :param url: the URL from which the HTML was downloaded.
+ :param cache_link_parsing: whether links parsed from this page's url
+ should be cached. PyPI index urls should
+ have this set to False, for example.
+ """
+
+ content: bytes
+ content_type: str
+ encoding: Optional[str]
+ url: str
+ cache_link_parsing: bool = True
def __str__(self) -> str:
return redact_auth_from_url(self.url)
@@ -400,7 +388,6 @@ class CollectedSources(NamedTuple):
class LinkCollector:
-
"""
Responsible for collecting Link objects from all configured locations,
making network requests as needed.
diff --git a/contrib/python/pip/pip/_internal/index/package_finder.py b/contrib/python/pip/pip/_internal/index/package_finder.py
index ec9ebc3671..fb270f22f8 100644
--- a/contrib/python/pip/pip/_internal/index/package_finder.py
+++ b/contrib/python/pip/pip/_internal/index/package_finder.py
@@ -5,12 +5,13 @@ import functools
import itertools
import logging
import re
+from dataclasses import dataclass
from typing import TYPE_CHECKING, FrozenSet, Iterable, List, Optional, Set, Tuple, Union
from pip._vendor.packaging import specifiers
from pip._vendor.packaging.tags import Tag
from pip._vendor.packaging.utils import canonicalize_name
-from pip._vendor.packaging.version import _BaseVersion
+from pip._vendor.packaging.version import InvalidVersion, _BaseVersion
from pip._vendor.packaging.version import parse as parse_version
from pip._internal.exceptions import (
@@ -106,7 +107,6 @@ class LinkType(enum.Enum):
class LinkEvaluator:
-
"""
Responsible for evaluating links for a particular project.
"""
@@ -323,23 +323,15 @@ def filter_unallowed_hashes(
return filtered
+@dataclass
class CandidatePreferences:
-
"""
Encapsulates some of the preferences for filtering and sorting
InstallationCandidate objects.
"""
- def __init__(
- self,
- prefer_binary: bool = False,
- allow_all_prereleases: bool = False,
- ) -> None:
- """
- :param allow_all_prereleases: Whether to allow all pre-releases.
- """
- self.allow_all_prereleases = allow_all_prereleases
- self.prefer_binary = prefer_binary
+ prefer_binary: bool = False
+ allow_all_prereleases: bool = False
class BestCandidateResult:
@@ -383,7 +375,6 @@ class BestCandidateResult:
class CandidateEvaluator:
-
"""
Responsible for filtering and sorting candidates for installation based
on what tags are valid.
@@ -761,11 +752,14 @@ class PackageFinder:
self._log_skipped_link(link, result, detail)
return None
- return InstallationCandidate(
- name=link_evaluator.project_name,
- link=link,
- version=detail,
- )
+ try:
+ return InstallationCandidate(
+ name=link_evaluator.project_name,
+ link=link,
+ version=detail,
+ )
+ except InvalidVersion:
+ return None
def evaluate_links(
self, link_evaluator: LinkEvaluator, links: Iterable[Link]
diff --git a/contrib/python/pip/pip/_internal/locations/__init__.py b/contrib/python/pip/pip/_internal/locations/__init__.py
index d54bc63eba..32382be7fe 100644
--- a/contrib/python/pip/pip/_internal/locations/__init__.py
+++ b/contrib/python/pip/pip/_internal/locations/__init__.py
@@ -336,17 +336,6 @@ def get_scheme(
if skip_linux_system_special_case:
continue
- # On Python 3.7 and earlier, sysconfig does not include sys.abiflags in
- # the "pythonX.Y" part of the path, but distutils does.
- skip_sysconfig_abiflag_bug = (
- sys.version_info < (3, 8)
- and not WINDOWS
- and k in ("headers", "platlib", "purelib")
- and tuple(_fix_abiflags(old_v.parts)) == new_v.parts
- )
- if skip_sysconfig_abiflag_bug:
- continue
-
# MSYS2 MINGW's sysconfig patch does not include the "site-packages"
# part of the path. This is incorrect and will be fixed in MSYS.
skip_msys2_mingw_bug = (
diff --git a/contrib/python/pip/pip/_internal/locations/_sysconfig.py b/contrib/python/pip/pip/_internal/locations/_sysconfig.py
index 97aef1f1ac..ca860ea562 100644
--- a/contrib/python/pip/pip/_internal/locations/_sysconfig.py
+++ b/contrib/python/pip/pip/_internal/locations/_sysconfig.py
@@ -192,9 +192,10 @@ def get_scheme(
data=paths["data"],
)
if root is not None:
+ converted_keys = {}
for key in SCHEME_KEYS:
- value = change_root(root, getattr(scheme, key))
- setattr(scheme, key, value)
+ converted_keys[key] = change_root(root, getattr(scheme, key))
+ scheme = Scheme(**converted_keys)
return scheme
diff --git a/contrib/python/pip/pip/_internal/metadata/_json.py b/contrib/python/pip/pip/_internal/metadata/_json.py
index 27362fc726..9097dd5859 100644
--- a/contrib/python/pip/pip/_internal/metadata/_json.py
+++ b/contrib/python/pip/pip/_internal/metadata/_json.py
@@ -2,7 +2,7 @@
from email.header import Header, decode_header, make_header
from email.message import Message
-from typing import Any, Dict, List, Union
+from typing import Any, Dict, List, Union, cast
METADATA_FIELDS = [
# Name, Multiple-Use
@@ -77,7 +77,7 @@ def msg_to_json(msg: Message) -> Dict[str, Any]:
value = value.split()
result[key] = value
- payload = msg.get_payload()
+ payload = cast(str, msg.get_payload())
if payload:
result["description"] = payload
diff --git a/contrib/python/pip/pip/_internal/metadata/base.py b/contrib/python/pip/pip/_internal/metadata/base.py
index 9249124410..9eabcdb278 100644
--- a/contrib/python/pip/pip/_internal/metadata/base.py
+++ b/contrib/python/pip/pip/_internal/metadata/base.py
@@ -8,7 +8,6 @@ import re
import zipfile
from typing import (
IO,
- TYPE_CHECKING,
Any,
Collection,
Container,
@@ -18,6 +17,7 @@ from typing import (
List,
NamedTuple,
Optional,
+ Protocol,
Tuple,
Union,
)
@@ -25,7 +25,7 @@ from typing import (
from pip._vendor.packaging.requirements import Requirement
from pip._vendor.packaging.specifiers import InvalidSpecifier, SpecifierSet
from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
-from pip._vendor.packaging.version import LegacyVersion, Version
+from pip._vendor.packaging.version import Version
from pip._internal.exceptions import NoneMetadataError
from pip._internal.locations import site_packages, user_site
@@ -41,13 +41,6 @@ from pip._internal.utils.urls import url_to_path
from ._json import msg_to_json
-if TYPE_CHECKING:
- from typing import Protocol
-else:
- Protocol = object
-
-DistributionVersion = Union[LegacyVersion, Version]
-
InfoPath = Union[str, pathlib.PurePath]
logger = logging.getLogger(__name__)
@@ -145,10 +138,10 @@ class BaseDistribution(Protocol):
raise NotImplementedError()
def __repr__(self) -> str:
- return f"{self.raw_name} {self.version} ({self.location})"
+ return f"{self.raw_name} {self.raw_version} ({self.location})"
def __str__(self) -> str:
- return f"{self.raw_name} {self.version}"
+ return f"{self.raw_name} {self.raw_version}"
@property
def location(self) -> Optional[str]:
@@ -279,7 +272,11 @@ class BaseDistribution(Protocol):
raise NotImplementedError()
@property
- def version(self) -> DistributionVersion:
+ def version(self) -> Version:
+ raise NotImplementedError()
+
+ @property
+ def raw_version(self) -> str:
raise NotImplementedError()
@property
@@ -385,15 +382,7 @@ class BaseDistribution(Protocol):
def _metadata_impl(self) -> email.message.Message:
raise NotImplementedError()
- @functools.lru_cache(maxsize=1)
- def _metadata_cached(self) -> email.message.Message:
- # When we drop python 3.7 support, move this to the metadata property and use
- # functools.cached_property instead of lru_cache.
- metadata = self._metadata_impl()
- self._add_egg_info_requires(metadata)
- return metadata
-
- @property
+ @functools.cached_property
def metadata(self) -> email.message.Message:
"""Metadata of distribution parsed from e.g. METADATA or PKG-INFO.
@@ -402,7 +391,9 @@ class BaseDistribution(Protocol):
:raises NoneMetadataError: If the metadata file is available, but does
not contain valid metadata.
"""
- return self._metadata_cached()
+ metadata = self._metadata_impl()
+ self._add_egg_info_requires(metadata)
+ return metadata
@property
def metadata_dict(self) -> Dict[str, Any]:
@@ -454,24 +445,19 @@ class BaseDistribution(Protocol):
"""
raise NotImplementedError()
- def iter_provided_extras(self) -> Iterable[str]:
+ def iter_raw_dependencies(self) -> Iterable[str]:
+ """Raw Requires-Dist metadata."""
+ return self.metadata.get_all("Requires-Dist", [])
+
+ def iter_provided_extras(self) -> Iterable[NormalizedName]:
"""Extras provided by this distribution.
For modern .dist-info distributions, this is the collection of
"Provides-Extra:" entries in distribution metadata.
- The return value of this function is not particularly useful other than
- display purposes due to backward compatibility issues and the extra
- names being poorly normalized prior to PEP 685. If you want to perform
- logic operations on extras, use :func:`is_extra_provided` instead.
- """
- raise NotImplementedError()
-
- def is_extra_provided(self, extra: str) -> bool:
- """Check whether an extra is provided by this distribution.
-
- This is needed mostly for compatibility issues with pkg_resources not
- following the extra normalization rules defined in PEP 685.
+ The return value of this function is expected to be normalised names,
+ per PEP 685, with the returned value being handled appropriately by
+ `iter_dependencies`.
"""
raise NotImplementedError()
diff --git a/contrib/python/pip/pip/_internal/metadata/importlib/_dists.py b/contrib/python/pip/pip/_internal/metadata/importlib/_dists.py
index 26370facf2..f65ccb1e70 100644
--- a/contrib/python/pip/pip/_internal/metadata/importlib/_dists.py
+++ b/contrib/python/pip/pip/_internal/metadata/importlib/_dists.py
@@ -16,13 +16,13 @@ from typing import (
from pip._vendor.packaging.requirements import Requirement
from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
+from pip._vendor.packaging.version import Version
from pip._vendor.packaging.version import parse as parse_version
from pip._internal.exceptions import InvalidWheel, UnsupportedWheel
from pip._internal.metadata.base import (
BaseDistribution,
BaseEntryPoint,
- DistributionVersion,
InfoPath,
Wheel,
)
@@ -133,8 +133,6 @@ class Distribution(BaseDistribution):
dist = WheelDistribution.from_zipfile(zf, name, wheel.location)
except zipfile.BadZipFile as e:
raise InvalidWheel(wheel.location, name) from e
- except UnsupportedWheel as e:
- raise UnsupportedWheel(f"{name} has an invalid wheel, {e}")
return cls(dist, dist.info_location, pathlib.PurePosixPath(wheel.location))
@property
@@ -173,9 +171,13 @@ class Distribution(BaseDistribution):
return canonicalize_name(name)
@property
- def version(self) -> DistributionVersion:
+ def version(self) -> Version:
return parse_version(self._dist.version)
+ @property
+ def raw_version(self) -> str:
+ return self._dist.version
+
def is_file(self, path: InfoPath) -> bool:
return self._dist.read_text(str(path)) is not None
@@ -206,19 +208,18 @@ class Distribution(BaseDistribution):
# until upstream can improve the protocol. (python/cpython#94952)
return cast(email.message.Message, self._dist.metadata)
- def iter_provided_extras(self) -> Iterable[str]:
- return self.metadata.get_all("Provides-Extra", [])
-
- def is_extra_provided(self, extra: str) -> bool:
- return any(
- canonicalize_name(provided_extra) == canonicalize_name(extra)
- for provided_extra in self.metadata.get_all("Provides-Extra", [])
- )
+ def iter_provided_extras(self) -> Iterable[NormalizedName]:
+ return [
+ canonicalize_name(extra)
+ for extra in self.metadata.get_all("Provides-Extra", [])
+ ]
def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]:
contexts: Sequence[Dict[str, str]] = [{"extra": e} for e in extras]
for req_string in self.metadata.get_all("Requires-Dist", []):
- req = Requirement(req_string)
+ # strip() because email.message.Message.get_all() may return a leading \n
+ # in case a long header was wrapped.
+ req = Requirement(req_string.strip())
if not req.marker:
yield req
elif not extras and req.marker.evaluate({"extra": ""}):
diff --git a/contrib/python/pip/pip/_internal/metadata/importlib/_envs.py b/contrib/python/pip/pip/_internal/metadata/importlib/_envs.py
index 048dc55dcb..2df738fc73 100644
--- a/contrib/python/pip/pip/_internal/metadata/importlib/_envs.py
+++ b/contrib/python/pip/pip/_internal/metadata/importlib/_envs.py
@@ -150,7 +150,7 @@ class _DistributionFinder:
def _emit_egg_deprecation(location: Optional[str]) -> None:
deprecated(
reason=f"Loading egg at {location} is deprecated.",
- replacement="to use pip for package installation.",
+ replacement="to use pip for package installation",
gone_in="24.3",
issue=12330,
)
diff --git a/contrib/python/pip/pip/_internal/metadata/pkg_resources.py b/contrib/python/pip/pip/_internal/metadata/pkg_resources.py
index bb11e5bd8a..4ea84f93a6 100644
--- a/contrib/python/pip/pip/_internal/metadata/pkg_resources.py
+++ b/contrib/python/pip/pip/_internal/metadata/pkg_resources.py
@@ -3,11 +3,20 @@ import email.parser
import logging
import os
import zipfile
-from typing import Collection, Iterable, Iterator, List, Mapping, NamedTuple, Optional
+from typing import (
+ Collection,
+ Iterable,
+ Iterator,
+ List,
+ Mapping,
+ NamedTuple,
+ Optional,
+)
from pip._vendor import pkg_resources
from pip._vendor.packaging.requirements import Requirement
from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
+from pip._vendor.packaging.version import Version
from pip._vendor.packaging.version import parse as parse_version
from pip._internal.exceptions import InvalidWheel, NoneMetadataError, UnsupportedWheel
@@ -19,7 +28,6 @@ from .base import (
BaseDistribution,
BaseEntryPoint,
BaseEnvironment,
- DistributionVersion,
InfoPath,
Wheel,
)
@@ -75,6 +83,18 @@ class InMemoryMetadata:
class Distribution(BaseDistribution):
def __init__(self, dist: pkg_resources.Distribution) -> None:
self._dist = dist
+ # This is populated lazily, to avoid loading metadata for all possible
+ # distributions eagerly.
+ self.__extra_mapping: Optional[Mapping[NormalizedName, str]] = None
+
+ @property
+ def _extra_mapping(self) -> Mapping[NormalizedName, str]:
+ if self.__extra_mapping is None:
+ self.__extra_mapping = {
+ canonicalize_name(extra): extra for extra in self._dist.extras
+ }
+
+ return self.__extra_mapping
@classmethod
def from_directory(cls, directory: str) -> BaseDistribution:
@@ -168,9 +188,13 @@ class Distribution(BaseDistribution):
return canonicalize_name(self._dist.project_name)
@property
- def version(self) -> DistributionVersion:
+ def version(self) -> Version:
return parse_version(self._dist.version)
+ @property
+ def raw_version(self) -> str:
+ return self._dist.version
+
def is_file(self, path: InfoPath) -> bool:
return self._dist.has_metadata(str(path))
@@ -215,16 +239,15 @@ class Distribution(BaseDistribution):
return feed_parser.close()
def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]:
- if extras: # pkg_resources raises on invalid extras, so we sanitize.
- extras = frozenset(pkg_resources.safe_extra(e) for e in extras)
- extras = extras.intersection(self._dist.extras)
+ if extras:
+ relevant_extras = set(self._extra_mapping) & set(
+ map(canonicalize_name, extras)
+ )
+ extras = [self._extra_mapping[extra] for extra in relevant_extras]
return self._dist.requires(extras)
- def iter_provided_extras(self) -> Iterable[str]:
- return self._dist.extras
-
- def is_extra_provided(self, extra: str) -> bool:
- return pkg_resources.safe_extra(extra) in self._dist.extras
+ def iter_provided_extras(self) -> Iterable[NormalizedName]:
+ return self._extra_mapping.keys()
class Environment(BaseEnvironment):
diff --git a/contrib/python/pip/pip/_internal/models/candidate.py b/contrib/python/pip/pip/_internal/models/candidate.py
index 9184a902ae..f27f283154 100644
--- a/contrib/python/pip/pip/_internal/models/candidate.py
+++ b/contrib/python/pip/pip/_internal/models/candidate.py
@@ -1,30 +1,25 @@
+from dataclasses import dataclass
+
+from pip._vendor.packaging.version import Version
from pip._vendor.packaging.version import parse as parse_version
from pip._internal.models.link import Link
-from pip._internal.utils.models import KeyBasedCompareMixin
-class InstallationCandidate(KeyBasedCompareMixin):
+@dataclass(frozen=True)
+class InstallationCandidate:
"""Represents a potential "candidate" for installation."""
__slots__ = ["name", "version", "link"]
+ name: str
+ version: Version
+ link: Link
+
def __init__(self, name: str, version: str, link: Link) -> None:
- self.name = name
- self.version = parse_version(version)
- self.link = link
-
- super().__init__(
- key=(self.name, self.version, self.link),
- defining_class=InstallationCandidate,
- )
-
- def __repr__(self) -> str:
- return "<InstallationCandidate({!r}, {!r}, {!r})>".format(
- self.name,
- self.version,
- self.link,
- )
+ object.__setattr__(self, "name", name)
+ object.__setattr__(self, "version", parse_version(version))
+ object.__setattr__(self, "link", link)
def __str__(self) -> str:
return f"{self.name!r} candidate (version {self.version} at {self.link})"
diff --git a/contrib/python/pip/pip/_internal/models/direct_url.py b/contrib/python/pip/pip/_internal/models/direct_url.py
index 0af884bd8e..fc5ec8d4aa 100644
--- a/contrib/python/pip/pip/_internal/models/direct_url.py
+++ b/contrib/python/pip/pip/_internal/models/direct_url.py
@@ -1,8 +1,10 @@
""" PEP 610 """
+
import json
import re
import urllib.parse
-from typing import Any, Dict, Iterable, Optional, Type, TypeVar, Union
+from dataclasses import dataclass
+from typing import Any, ClassVar, Dict, Iterable, Optional, Type, TypeVar, Union
__all__ = [
"DirectUrl",
@@ -64,18 +66,13 @@ def _filter_none(**kwargs: Any) -> Dict[str, Any]:
return {k: v for k, v in kwargs.items() if v is not None}
+@dataclass
class VcsInfo:
- name = "vcs_info"
+ name: ClassVar = "vcs_info"
- def __init__(
- self,
- vcs: str,
- commit_id: str,
- requested_revision: Optional[str] = None,
- ) -> None:
- self.vcs = vcs
- self.requested_revision = requested_revision
- self.commit_id = commit_id
+ vcs: str
+ commit_id: str
+ requested_revision: Optional[str] = None
@classmethod
def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["VcsInfo"]:
@@ -139,14 +136,11 @@ class ArchiveInfo:
return _filter_none(hash=self.hash, hashes=self.hashes)
+@dataclass
class DirInfo:
- name = "dir_info"
+ name: ClassVar = "dir_info"
- def __init__(
- self,
- editable: bool = False,
- ) -> None:
- self.editable = editable
+ editable: bool = False
@classmethod
def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["DirInfo"]:
@@ -161,16 +155,11 @@ class DirInfo:
InfoType = Union[ArchiveInfo, DirInfo, VcsInfo]
+@dataclass
class DirectUrl:
- def __init__(
- self,
- url: str,
- info: InfoType,
- subdirectory: Optional[str] = None,
- ) -> None:
- self.url = url
- self.info = info
- self.subdirectory = subdirectory
+ url: str
+ info: InfoType
+ subdirectory: Optional[str] = None
def _remove_auth_from_netloc(self, netloc: str) -> str:
if "@" not in netloc:
diff --git a/contrib/python/pip/pip/_internal/models/link.py b/contrib/python/pip/pip/_internal/models/link.py
index 73041b864c..2f41f2f6a0 100644
--- a/contrib/python/pip/pip/_internal/models/link.py
+++ b/contrib/python/pip/pip/_internal/models/link.py
@@ -27,7 +27,6 @@ from pip._internal.utils.misc import (
split_auth_from_netloc,
splitext,
)
-from pip._internal.utils.models import KeyBasedCompareMixin
from pip._internal.utils.urls import path_to_url, url_to_path
if TYPE_CHECKING:
@@ -179,7 +178,8 @@ def _ensure_quoted_url(url: str) -> str:
return urllib.parse.urlunparse(result._replace(path=path))
-class Link(KeyBasedCompareMixin):
+@functools.total_ordering
+class Link:
"""Represents a parsed link from a Package Index's simple URL"""
__slots__ = [
@@ -254,8 +254,6 @@ class Link(KeyBasedCompareMixin):
self.yanked_reason = yanked_reason
self.metadata_file_data = metadata_file_data
- super().__init__(key=url, defining_class=Link)
-
self.cache_link_parsing = cache_link_parsing
self.egg_fragment = self._egg_fragment()
@@ -375,6 +373,19 @@ class Link(KeyBasedCompareMixin):
def __repr__(self) -> str:
return f"<Link {self}>"
+ def __hash__(self) -> int:
+ return hash(self.url)
+
+ def __eq__(self, other: Any) -> bool:
+ if not isinstance(other, Link):
+ return NotImplemented
+ return self.url == other.url
+
+ def __lt__(self, other: Any) -> bool:
+ if not isinstance(other, Link):
+ return NotImplemented
+ return self.url < other.url
+
@property
def url(self) -> str:
return self._url
diff --git a/contrib/python/pip/pip/_internal/models/scheme.py b/contrib/python/pip/pip/_internal/models/scheme.py
index f51190ac60..06a9a550e3 100644
--- a/contrib/python/pip/pip/_internal/models/scheme.py
+++ b/contrib/python/pip/pip/_internal/models/scheme.py
@@ -5,10 +5,12 @@ For a general overview of available schemes and their context, see
https://docs.python.org/3/install/index.html#alternate-installation.
"""
+from dataclasses import dataclass
SCHEME_KEYS = ["platlib", "purelib", "headers", "scripts", "data"]
+@dataclass(frozen=True)
class Scheme:
"""A Scheme holds paths which are used as the base directories for
artifacts associated with a Python package.
@@ -16,16 +18,8 @@ class Scheme:
__slots__ = SCHEME_KEYS
- def __init__(
- self,
- platlib: str,
- purelib: str,
- headers: str,
- scripts: str,
- data: str,
- ) -> None:
- self.platlib = platlib
- self.purelib = purelib
- self.headers = headers
- self.scripts = scripts
- self.data = data
+ platlib: str
+ purelib: str
+ headers: str
+ scripts: str
+ data: str
diff --git a/contrib/python/pip/pip/_internal/models/search_scope.py b/contrib/python/pip/pip/_internal/models/search_scope.py
index fe61e8116b..ee7bc86229 100644
--- a/contrib/python/pip/pip/_internal/models/search_scope.py
+++ b/contrib/python/pip/pip/_internal/models/search_scope.py
@@ -3,6 +3,7 @@ import logging
import os
import posixpath
import urllib.parse
+from dataclasses import dataclass
from typing import List
from pip._vendor.packaging.utils import canonicalize_name
@@ -14,14 +15,18 @@ from pip._internal.utils.misc import normalize_path, redact_auth_from_url
logger = logging.getLogger(__name__)
+@dataclass(frozen=True)
class SearchScope:
-
"""
Encapsulates the locations that pip is configured to search.
"""
__slots__ = ["find_links", "index_urls", "no_index"]
+ find_links: List[str]
+ index_urls: List[str]
+ no_index: bool
+
@classmethod
def create(
cls,
@@ -64,16 +69,6 @@ class SearchScope:
no_index=no_index,
)
- def __init__(
- self,
- find_links: List[str],
- index_urls: List[str],
- no_index: bool,
- ) -> None:
- self.find_links = find_links
- self.index_urls = index_urls
- self.no_index = no_index
-
def get_formatted_locations(self) -> str:
lines = []
redacted_index_urls = []
diff --git a/contrib/python/pip/pip/_internal/models/selection_prefs.py b/contrib/python/pip/pip/_internal/models/selection_prefs.py
index 977bc4caa7..e9b50aa517 100644
--- a/contrib/python/pip/pip/_internal/models/selection_prefs.py
+++ b/contrib/python/pip/pip/_internal/models/selection_prefs.py
@@ -3,6 +3,8 @@ from typing import Optional
from pip._internal.models.format_control import FormatControl
+# TODO: This needs Python 3.10's improved slots support for dataclasses
+# to be converted into a dataclass.
class SelectionPreferences:
"""
Encapsulates the candidate selection preferences for downloading
diff --git a/contrib/python/pip/pip/_internal/models/target_python.py b/contrib/python/pip/pip/_internal/models/target_python.py
index 67ea5da73a..88925a9fd0 100644
--- a/contrib/python/pip/pip/_internal/models/target_python.py
+++ b/contrib/python/pip/pip/_internal/models/target_python.py
@@ -8,7 +8,6 @@ from pip._internal.utils.misc import normalize_version_info
class TargetPython:
-
"""
Encapsulates the properties of a Python interpreter one is targeting
for a package install, download, etc.
diff --git a/contrib/python/pip/pip/_internal/models/wheel.py b/contrib/python/pip/pip/_internal/models/wheel.py
index a5dc12bdd6..36d4d2e785 100644
--- a/contrib/python/pip/pip/_internal/models/wheel.py
+++ b/contrib/python/pip/pip/_internal/models/wheel.py
@@ -1,6 +1,7 @@
"""Represents a wheel file and provides access to the various parts of the
name that have meaning.
"""
+
import re
from typing import Dict, Iterable, List
diff --git a/contrib/python/pip/pip/_internal/network/auth.py b/contrib/python/pip/pip/_internal/network/auth.py
index 94a82fa661..4705b55a7a 100644
--- a/contrib/python/pip/pip/_internal/network/auth.py
+++ b/contrib/python/pip/pip/_internal/network/auth.py
@@ -3,6 +3,7 @@
Contains interface (MultiDomainBasicAuth) and associated glue code for
providing credentials in the context of network requests.
"""
+
import logging
import os
import shutil
@@ -47,12 +48,12 @@ class KeyRingBaseProvider(ABC):
has_keyring: bool
@abstractmethod
- def get_auth_info(self, url: str, username: Optional[str]) -> Optional[AuthInfo]:
- ...
+ def get_auth_info(
+ self, url: str, username: Optional[str]
+ ) -> Optional[AuthInfo]: ...
@abstractmethod
- def save_auth_info(self, url: str, username: str, password: str) -> None:
- ...
+ def save_auth_info(self, url: str, username: str, password: str) -> None: ...
class KeyRingNullProvider(KeyRingBaseProvider):
@@ -151,7 +152,7 @@ class KeyRingCliProvider(KeyRingBaseProvider):
env["PYTHONIOENCODING"] = "utf-8"
subprocess.run(
[self.keyring, "set", service_name, username],
- input=f"{password}{os.linesep}".encode("utf-8"),
+ input=f"{password}{os.linesep}".encode(),
env=env,
check=True,
)
diff --git a/contrib/python/pip/pip/_internal/network/download.py b/contrib/python/pip/pip/_internal/network/download.py
index d1d43541e6..032fdd0314 100644
--- a/contrib/python/pip/pip/_internal/network/download.py
+++ b/contrib/python/pip/pip/_internal/network/download.py
@@ -1,5 +1,6 @@
"""Download files with progress indicators.
"""
+
import email.message
import logging
import mimetypes
diff --git a/contrib/python/pip/pip/_internal/network/session.py b/contrib/python/pip/pip/_internal/network/session.py
index f17efc5299..1765b4f6bd 100644
--- a/contrib/python/pip/pip/_internal/network/session.py
+++ b/contrib/python/pip/pip/_internal/network/session.py
@@ -3,6 +3,7 @@ network request configuration and behavior.
"""
import email.utils
+import functools
import io
import ipaddress
import json
@@ -106,6 +107,7 @@ def looks_like_ci() -> bool:
return any(name in os.environ for name in CI_ENVIRONMENT_VARIABLES)
+@functools.lru_cache(maxsize=1)
def user_agent() -> str:
"""
Return a string representing the user agent.
@@ -230,7 +232,7 @@ class LocalFSAdapter(BaseAdapter):
# to return a better error message:
resp.status_code = 404
resp.reason = type(exc).__name__
- resp.raw = io.BytesIO(f"{resp.reason}: {exc}".encode("utf8"))
+ resp.raw = io.BytesIO(f"{resp.reason}: {exc}".encode())
else:
modified = email.utils.formatdate(stats.st_mtime, usegmt=True)
content_type = mimetypes.guess_type(pathname)[0] or "text/plain"
diff --git a/contrib/python/pip/pip/_internal/operations/build/build_tracker.py b/contrib/python/pip/pip/_internal/operations/build/build_tracker.py
index 37919322b0..0ed8dd2359 100644
--- a/contrib/python/pip/pip/_internal/operations/build/build_tracker.py
+++ b/contrib/python/pip/pip/_internal/operations/build/build_tracker.py
@@ -3,9 +3,8 @@ import hashlib
import logging
import os
from types import TracebackType
-from typing import Dict, Generator, Optional, Set, Type, Union
+from typing import Dict, Generator, Optional, Type, Union
-from pip._internal.models.link import Link
from pip._internal.req.req_install import InstallRequirement
from pip._internal.utils.temp_dir import TempDirectory
@@ -99,7 +98,7 @@ class BuildTracker:
except FileNotFoundError:
pass
else:
- message = "{} is already being built: {}".format(req.link, contents)
+ message = f"{req.link} is already being built: {contents}"
raise LookupError(message)
# If we're here, req should really not be building already.
diff --git a/contrib/python/pip/pip/_internal/operations/build/metadata_legacy.py b/contrib/python/pip/pip/_internal/operations/build/metadata_legacy.py
index e60988d643..c01dd1c678 100644
--- a/contrib/python/pip/pip/_internal/operations/build/metadata_legacy.py
+++ b/contrib/python/pip/pip/_internal/operations/build/metadata_legacy.py
@@ -27,7 +27,7 @@ def _find_egg_info(directory: str) -> str:
if len(filenames) > 1:
raise InstallationError(
- "More than one .egg-info directory found in {}".format(directory)
+ f"More than one .egg-info directory found in {directory}"
)
return os.path.join(directory, filenames[0])
diff --git a/contrib/python/pip/pip/_internal/operations/build/wheel_legacy.py b/contrib/python/pip/pip/_internal/operations/build/wheel_legacy.py
index c5f0492ccb..3ee2a7058d 100644
--- a/contrib/python/pip/pip/_internal/operations/build/wheel_legacy.py
+++ b/contrib/python/pip/pip/_internal/operations/build/wheel_legacy.py
@@ -40,16 +40,16 @@ def get_legacy_build_wheel_path(
# Sort for determinism.
names = sorted(names)
if not names:
- msg = ("Legacy build of wheel for {!r} created no files.\n").format(name)
+ msg = f"Legacy build of wheel for {name!r} created no files.\n"
msg += format_command_result(command_args, command_output)
logger.warning(msg)
return None
if len(names) > 1:
msg = (
- "Legacy build of wheel for {!r} created more than one file.\n"
- "Filenames (choosing first): {}\n"
- ).format(name, names)
+ f"Legacy build of wheel for {name!r} created more than one file.\n"
+ f"Filenames (choosing first): {names}\n"
+ )
msg += format_command_result(command_args, command_output)
logger.warning(msg)
diff --git a/contrib/python/pip/pip/_internal/operations/check.py b/contrib/python/pip/pip/_internal/operations/check.py
index 90c6a58a55..623db76e22 100644
--- a/contrib/python/pip/pip/_internal/operations/check.py
+++ b/contrib/python/pip/pip/_internal/operations/check.py
@@ -5,28 +5,25 @@ import logging
from typing import Callable, Dict, List, NamedTuple, Optional, Set, Tuple
from pip._vendor.packaging.requirements import Requirement
-from pip._vendor.packaging.specifiers import LegacySpecifier
from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
-from pip._vendor.packaging.version import LegacyVersion
+from pip._vendor.packaging.version import Version
from pip._internal.distributions import make_distribution_for_install_requirement
from pip._internal.metadata import get_default_environment
-from pip._internal.metadata.base import DistributionVersion
from pip._internal.req.req_install import InstallRequirement
-from pip._internal.utils.deprecation import deprecated
logger = logging.getLogger(__name__)
class PackageDetails(NamedTuple):
- version: DistributionVersion
+ version: Version
dependencies: List[Requirement]
# Shorthands
PackageSet = Dict[NormalizedName, PackageDetails]
Missing = Tuple[NormalizedName, Requirement]
-Conflicting = Tuple[NormalizedName, DistributionVersion, Requirement]
+Conflicting = Tuple[NormalizedName, Version, Requirement]
MissingDict = Dict[NormalizedName, List[Missing]]
ConflictingDict = Dict[NormalizedName, List[Conflicting]]
@@ -46,7 +43,7 @@ def create_package_set_from_installed() -> Tuple[PackageSet, bool]:
package_set[name] = PackageDetails(dist.version, dependencies)
except (OSError, ValueError) as e:
# Don't crash on unreadable or broken metadata.
- logger.warning("Error parsing requirements for %s: %s", name, e)
+ logger.warning("Error parsing dependencies of %s: %s", name, e)
problems = True
return package_set, problems
@@ -60,8 +57,6 @@ def check_package_set(
package name and returns a boolean.
"""
- warn_legacy_versions_and_specifiers(package_set)
-
missing = {}
conflicting = {}
@@ -152,36 +147,3 @@ def _create_whitelist(
break
return packages_affected
-
-
-def warn_legacy_versions_and_specifiers(package_set: PackageSet) -> None:
- for project_name, package_details in package_set.items():
- if isinstance(package_details.version, LegacyVersion):
- deprecated(
- reason=(
- f"{project_name} {package_details.version} "
- f"has a non-standard version number."
- ),
- replacement=(
- f"to upgrade to a newer version of {project_name} "
- f"or contact the author to suggest that they "
- f"release a version with a conforming version number"
- ),
- issue=12063,
- gone_in="24.1",
- )
- for dep in package_details.dependencies:
- if any(isinstance(spec, LegacySpecifier) for spec in dep.specifier):
- deprecated(
- reason=(
- f"{project_name} {package_details.version} "
- f"has a non-standard dependency specifier {dep}."
- ),
- replacement=(
- f"to upgrade to a newer version of {project_name} "
- f"or contact the author to suggest that they "
- f"release a version with a conforming dependency specifiers"
- ),
- issue=12063,
- gone_in="24.1",
- )
diff --git a/contrib/python/pip/pip/_internal/operations/freeze.py b/contrib/python/pip/pip/_internal/operations/freeze.py
index 3544568451..bb1039fb77 100644
--- a/contrib/python/pip/pip/_internal/operations/freeze.py
+++ b/contrib/python/pip/pip/_internal/operations/freeze.py
@@ -4,7 +4,7 @@ import os
from typing import Container, Dict, Generator, Iterable, List, NamedTuple, Optional, Set
from pip._vendor.packaging.utils import canonicalize_name
-from pip._vendor.packaging.version import Version
+from pip._vendor.packaging.version import InvalidVersion
from pip._internal.exceptions import BadCommand, InstallationError
from pip._internal.metadata import BaseDistribution, get_environment
@@ -145,10 +145,13 @@ def freeze(
def _format_as_name_version(dist: BaseDistribution) -> str:
- dist_version = dist.version
- if isinstance(dist_version, Version):
+ try:
+ dist_version = dist.version
+ except InvalidVersion:
+ # legacy version
+ return f"{dist.raw_name}==={dist.raw_version}"
+ else:
return f"{dist.raw_name}=={dist_version}"
- return f"{dist.raw_name}==={dist_version}"
def _get_editable_info(dist: BaseDistribution) -> _EditableInfo:
diff --git a/contrib/python/pip/pip/_internal/operations/install/editable_legacy.py b/contrib/python/pip/pip/_internal/operations/install/editable_legacy.py
index bebe24e6d3..9aaa699a64 100644
--- a/contrib/python/pip/pip/_internal/operations/install/editable_legacy.py
+++ b/contrib/python/pip/pip/_internal/operations/install/editable_legacy.py
@@ -1,5 +1,6 @@
"""Legacy editable installation process, i.e. `setup.py develop`.
"""
+
import logging
from typing import Optional, Sequence
diff --git a/contrib/python/pip/pip/_internal/operations/install/wheel.py b/contrib/python/pip/pip/_internal/operations/install/wheel.py
index f67180c9e6..a02a193d22 100644
--- a/contrib/python/pip/pip/_internal/operations/install/wheel.py
+++ b/contrib/python/pip/pip/_internal/operations/install/wheel.py
@@ -28,6 +28,7 @@ from typing import (
List,
NewType,
Optional,
+ Protocol,
Sequence,
Set,
Tuple,
@@ -50,7 +51,7 @@ from pip._internal.metadata import (
from pip._internal.models.direct_url import DIRECT_URL_METADATA_NAME, DirectUrl
from pip._internal.models.scheme import SCHEME_KEYS, Scheme
from pip._internal.utils.filesystem import adjacent_tmp_file, replace
-from pip._internal.utils.misc import captured_stdout, ensure_dir, hash_file, partition
+from pip._internal.utils.misc import StreamWrapper, ensure_dir, hash_file, partition
from pip._internal.utils.unpacking import (
current_umask,
is_within_directory,
@@ -60,7 +61,6 @@ from pip._internal.utils.unpacking import (
from pip._internal.utils.wheel import parse_wheel
if TYPE_CHECKING:
- from typing import Protocol
class File(Protocol):
src_record_path: "RecordPath"
@@ -288,17 +288,15 @@ def get_console_script_specs(console: Dict[str, str]) -> List[str]:
# the wheel metadata at build time, and so if the wheel is installed with
# a *different* version of Python the entry points will be wrong. The
# correct fix for this is to enhance the metadata to be able to describe
- # such versioned entry points, but that won't happen till Metadata 2.0 is
- # available.
- # In the meantime, projects using versioned entry points will either have
+ # such versioned entry points.
+ # Currently, projects using versioned entry points will either have
# incorrect versioned entry points, or they will not be able to distribute
# "universal" wheels (i.e., they will need a wheel per Python version).
#
# Because setuptools and pip are bundled with _ensurepip and virtualenv,
- # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we
+ # we need to use universal wheels. As a workaround, we
# override the versioned entry points in the wheel and generate the
- # correct ones. This code is purely a short-term measure until Metadata 2.0
- # is available.
+ # correct ones.
#
# To add the level of hack in this section of code, in order to support
# ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment
@@ -507,9 +505,9 @@ def _install_wheel(
_, scheme_key, dest_subpath = normed_path.split(os.path.sep, 2)
except ValueError:
message = (
- "Unexpected file in {}: {!r}. .data directory contents"
- " should be named like: '<scheme key>/<path>'."
- ).format(wheel_path, record_path)
+ f"Unexpected file in {wheel_path}: {record_path!r}. .data directory"
+ " contents should be named like: '<scheme key>/<path>'."
+ )
raise InstallationError(message)
try:
@@ -517,10 +515,11 @@ def _install_wheel(
except KeyError:
valid_scheme_keys = ", ".join(sorted(scheme_paths))
message = (
- "Unknown scheme key used in {}: {} (for file {!r}). .data"
- " directory contents should be in subdirectories named"
- " with a valid scheme key ({})"
- ).format(wheel_path, scheme_key, record_path, valid_scheme_keys)
+ f"Unknown scheme key used in {wheel_path}: {scheme_key} "
+ f"(for file {record_path!r}). .data directory contents "
+ f"should be in subdirectories named with a valid scheme "
+ f"key ({valid_scheme_keys})"
+ )
raise InstallationError(message)
dest_path = os.path.join(scheme_path, dest_subpath)
@@ -604,7 +603,9 @@ def _install_wheel(
# Compile all of the pyc files for the installed files
if pycompile:
- with captured_stdout() as stdout:
+ with contextlib.redirect_stdout(
+ StreamWrapper.from_stream(sys.stdout)
+ ) as stdout:
with warnings.catch_warnings():
warnings.filterwarnings("ignore")
for path in pyc_source_file_paths():
diff --git a/contrib/python/pip/pip/_internal/operations/prepare.py b/contrib/python/pip/pip/_internal/operations/prepare.py
index 956717d1e5..e6aa344720 100644
--- a/contrib/python/pip/pip/_internal/operations/prepare.py
+++ b/contrib/python/pip/pip/_internal/operations/prepare.py
@@ -7,6 +7,7 @@
import mimetypes
import os
import shutil
+from dataclasses import dataclass
from pathlib import Path
from typing import Dict, Iterable, List, Optional
@@ -80,13 +81,14 @@ def unpack_vcs_link(link: Link, location: str, verbosity: int) -> None:
vcs_backend.unpack(location, url=hide_url(link.url), verbosity=verbosity)
+@dataclass
class File:
- def __init__(self, path: str, content_type: Optional[str]) -> None:
- self.path = path
- if content_type is None:
- self.content_type = mimetypes.guess_type(path)[0]
- else:
- self.content_type = content_type
+ path: str
+ content_type: Optional[str] = None
+
+ def __post_init__(self) -> None:
+ if self.content_type is None:
+ self.content_type = mimetypes.guess_type(self.path)[0]
def get_http_url(
diff --git a/contrib/python/pip/pip/_internal/req/__init__.py b/contrib/python/pip/pip/_internal/req/__init__.py
index 16de903a44..422d851d72 100644
--- a/contrib/python/pip/pip/_internal/req/__init__.py
+++ b/contrib/python/pip/pip/_internal/req/__init__.py
@@ -1,5 +1,6 @@
import collections
import logging
+from dataclasses import dataclass
from typing import Generator, List, Optional, Sequence, Tuple
from pip._internal.utils.logging import indent_log
@@ -18,12 +19,9 @@ __all__ = [
logger = logging.getLogger(__name__)
+@dataclass(frozen=True)
class InstallationResult:
- def __init__(self, name: str) -> None:
- self.name = name
-
- def __repr__(self) -> str:
- return f"InstallationResult(name={self.name!r})"
+ name: str
def _validate_requirements(
diff --git a/contrib/python/pip/pip/_internal/req/constructors.py b/contrib/python/pip/pip/_internal/req/constructors.py
index 7e2d0e5b87..b8e170f2a7 100644
--- a/contrib/python/pip/pip/_internal/req/constructors.py
+++ b/contrib/python/pip/pip/_internal/req/constructors.py
@@ -12,6 +12,7 @@ import copy
import logging
import os
import re
+from dataclasses import dataclass
from typing import Collection, Dict, List, Optional, Set, Tuple, Union
from pip._vendor.packaging.markers import Marker
@@ -132,8 +133,8 @@ def parse_editable(editable_req: str) -> Tuple[Optional[str], str, Set[str]]:
package_name = link.egg_fragment
if not package_name:
raise InstallationError(
- "Could not detect requirement name for '{}', please specify one "
- "with #egg=your_package_name".format(editable_req)
+ f"Could not detect requirement name for '{editable_req}', "
+ "please specify one with #egg=your_package_name"
)
return package_name, url, set()
@@ -191,18 +192,12 @@ def deduce_helpful_msg(req: str) -> str:
return msg
+@dataclass(frozen=True)
class RequirementParts:
- def __init__(
- self,
- requirement: Optional[Requirement],
- link: Optional[Link],
- markers: Optional[Marker],
- extras: Set[str],
- ):
- self.requirement = requirement
- self.link = link
- self.markers = markers
- self.extras = extras
+ requirement: Optional[Requirement]
+ link: Optional[Link]
+ markers: Optional[Marker]
+ extras: Set[str]
def parse_req_from_editable(editable_req: str) -> RequirementParts:
@@ -211,8 +206,8 @@ def parse_req_from_editable(editable_req: str) -> RequirementParts:
if name is not None:
try:
req: Optional[Requirement] = Requirement(name)
- except InvalidRequirement:
- raise InstallationError(f"Invalid requirement: '{name}'")
+ except InvalidRequirement as exc:
+ raise InstallationError(f"Invalid requirement: {name!r}: {exc}")
else:
req = None
@@ -364,8 +359,8 @@ def parse_req_from_line(name: str, line_source: Optional[str]) -> RequirementPar
def _parse_req_string(req_as_string: str) -> Requirement:
try:
- req = get_requirement(req_as_string)
- except InvalidRequirement:
+ return get_requirement(req_as_string)
+ except InvalidRequirement as exc:
if os.path.sep in req_as_string:
add_msg = "It looks like a path."
add_msg += deduce_helpful_msg(req_as_string)
@@ -375,21 +370,10 @@ def parse_req_from_line(name: str, line_source: Optional[str]) -> RequirementPar
add_msg = "= is not a valid operator. Did you mean == ?"
else:
add_msg = ""
- msg = with_source(f"Invalid requirement: {req_as_string!r}")
+ msg = with_source(f"Invalid requirement: {req_as_string!r}: {exc}")
if add_msg:
msg += f"\nHint: {add_msg}"
raise InstallationError(msg)
- else:
- # Deprecate extras after specifiers: "name>=1.0[extras]"
- # This currently works by accident because _strip_extras() parses
- # any extras in the end of the string and those are saved in
- # RequirementParts
- for spec in req.specifier:
- spec_str = str(spec)
- if spec_str.endswith("]"):
- msg = f"Extras after version '{spec_str}'."
- raise InstallationError(msg)
- return req
if req_as_string is not None:
req: Optional[Requirement] = _parse_req_string(req_as_string)
@@ -445,8 +429,8 @@ def install_req_from_req_string(
) -> InstallRequirement:
try:
req = get_requirement(req_string)
- except InvalidRequirement:
- raise InstallationError(f"Invalid requirement: '{req_string}'")
+ except InvalidRequirement as exc:
+ raise InstallationError(f"Invalid requirement: {req_string!r}: {exc}")
domains_not_allowed = [
PyPI.file_storage_domain,
diff --git a/contrib/python/pip/pip/_internal/req/req_file.py b/contrib/python/pip/pip/_internal/req/req_file.py
index 1ef3d5ef6e..53ad8674cd 100644
--- a/contrib/python/pip/pip/_internal/req/req_file.py
+++ b/contrib/python/pip/pip/_internal/req/req_file.py
@@ -17,6 +17,7 @@ from typing import (
Generator,
Iterable,
List,
+ NoReturn,
Optional,
Tuple,
)
@@ -24,17 +25,11 @@ from typing import (
from pip._internal.cli import cmdoptions
from pip._internal.exceptions import InstallationError, RequirementsFileParseError
from pip._internal.models.search_scope import SearchScope
-from pip._internal.network.session import PipSession
-from pip._internal.network.utils import raise_for_status
from pip._internal.utils.encoding import auto_decode
-from pip._internal.utils.urls import get_url_scheme
if TYPE_CHECKING:
- # NoReturn introduced in 3.6.2; imported only for type checking to maintain
- # pip compatibility with older patch versions of Python 3.6
- from typing import NoReturn
-
from pip._internal.index.package_finder import PackageFinder
+ from pip._internal.network.session import PipSession
__all__ = ["parse_requirements"]
@@ -136,7 +131,7 @@ class ParsedLine:
def parse_requirements(
filename: str,
- session: PipSession,
+ session: "PipSession",
finder: Optional["PackageFinder"] = None,
options: Optional[optparse.Values] = None,
constraint: bool = False,
@@ -213,7 +208,7 @@ def handle_option_line(
lineno: int,
finder: Optional["PackageFinder"] = None,
options: Optional[optparse.Values] = None,
- session: Optional[PipSession] = None,
+ session: Optional["PipSession"] = None,
) -> None:
if opts.hashes:
logger.warning(
@@ -281,7 +276,7 @@ def handle_line(
line: ParsedLine,
options: Optional[optparse.Values] = None,
finder: Optional["PackageFinder"] = None,
- session: Optional[PipSession] = None,
+ session: Optional["PipSession"] = None,
) -> Optional[ParsedRequirement]:
"""Handle a single parsed requirements line; This can result in
creating/yielding requirements, or updating the finder.
@@ -324,7 +319,7 @@ def handle_line(
class RequirementsFileParser:
def __init__(
self,
- session: PipSession,
+ session: "PipSession",
line_parser: LineParser,
) -> None:
self._session = session
@@ -529,7 +524,7 @@ def expand_env_variables(lines_enum: ReqFileLines) -> ReqFileLines:
yield line_number, line
-def get_file_content(url: str, session: PipSession) -> Tuple[str, str]:
+def get_file_content(url: str, session: "PipSession") -> Tuple[str, str]:
"""Gets the content of a file; it may be a filename, file: URL, or
http: URL. Returns (location, content). Content is unicode.
Respects # -*- coding: declarations on the retrieved files.
@@ -537,10 +532,12 @@ def get_file_content(url: str, session: PipSession) -> Tuple[str, str]:
:param url: File path or url.
:param session: PipSession instance.
"""
- scheme = get_url_scheme(url)
-
+ scheme = urllib.parse.urlsplit(url).scheme
# Pip has special support for file:// URLs (LocalFSAdapter).
if scheme in ["http", "https", "file"]:
+ # Delay importing heavy network modules until absolutely necessary.
+ from pip._internal.network.utils import raise_for_status
+
resp = session.get(url)
raise_for_status(resp)
return resp.url, resp.text
diff --git a/contrib/python/pip/pip/_internal/req/req_install.py b/contrib/python/pip/pip/_internal/req/req_install.py
index a65611c320..213278588d 100644
--- a/contrib/python/pip/pip/_internal/req/req_install.py
+++ b/contrib/python/pip/pip/_internal/req/req_install.py
@@ -52,7 +52,6 @@ from pip._internal.utils.misc import (
redact_auth_from_requirement,
redact_auth_from_url,
)
-from pip._internal.utils.packaging import safe_extra
from pip._internal.utils.subprocess import runner_with_spinner_message
from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
from pip._internal.utils.unpacking import unpack_file
@@ -222,8 +221,9 @@ class InstallRequirement:
return s
def __repr__(self) -> str:
- return "<{} object: {} editable={!r}>".format(
- self.__class__.__name__, str(self), self.editable
+ return (
+ f"<{self.__class__.__name__} object: "
+ f"{str(self)} editable={self.editable!r}>"
)
def format_debug(self) -> str:
@@ -244,7 +244,7 @@ class InstallRequirement:
return None
return self.req.name
- @functools.lru_cache() # use cached_property in python 3.8+
+ @functools.cached_property
def supports_pyproject_editable(self) -> bool:
if not self.use_pep517:
return False
@@ -283,12 +283,7 @@ class InstallRequirement:
extras_requested = ("",)
if self.markers is not None:
return any(
- self.markers.evaluate({"extra": extra})
- # TODO: Remove these two variants when packaging is upgraded to
- # support the marker comparison logic specified in PEP 685.
- or self.markers.evaluate({"extra": safe_extra(extra)})
- or self.markers.evaluate({"extra": canonicalize_name(extra)})
- for extra in extras_requested
+ self.markers.evaluate({"extra": extra}) for extra in extras_requested
)
else:
return True
@@ -542,7 +537,7 @@ class InstallRequirement:
if (
self.editable
and self.use_pep517
- and not self.supports_pyproject_editable()
+ and not self.supports_pyproject_editable
and not os.path.isfile(self.setup_py_path)
and not os.path.isfile(self.setup_cfg_path)
):
@@ -568,7 +563,7 @@ class InstallRequirement:
if (
self.editable
and self.permit_editable_wheels
- and self.supports_pyproject_editable()
+ and self.supports_pyproject_editable
):
self.metadata_directory = generate_editable_metadata(
build_env=self.build_env,
diff --git a/contrib/python/pip/pip/_internal/req/req_set.py b/contrib/python/pip/pip/_internal/req/req_set.py
index bf36114e80..ec7a6e07a2 100644
--- a/contrib/python/pip/pip/_internal/req/req_set.py
+++ b/contrib/python/pip/pip/_internal/req/req_set.py
@@ -2,12 +2,9 @@ import logging
from collections import OrderedDict
from typing import Dict, List
-from pip._vendor.packaging.specifiers import LegacySpecifier
from pip._vendor.packaging.utils import canonicalize_name
-from pip._vendor.packaging.version import LegacyVersion
from pip._internal.req.req_install import InstallRequirement
-from pip._internal.utils.deprecation import deprecated
logger = logging.getLogger(__name__)
@@ -83,37 +80,3 @@ class RequirementSet:
for install_req in self.all_requirements
if not install_req.constraint and not install_req.satisfied_by
]
-
- def warn_legacy_versions_and_specifiers(self) -> None:
- for req in self.requirements_to_install:
- version = req.get_dist().version
- if isinstance(version, LegacyVersion):
- deprecated(
- reason=(
- f"pip has selected the non standard version {version} "
- f"of {req}. In the future this version will be "
- f"ignored as it isn't standard compliant."
- ),
- replacement=(
- "set or update constraints to select another version "
- "or contact the package author to fix the version number"
- ),
- issue=12063,
- gone_in="24.1",
- )
- for dep in req.get_dist().iter_dependencies():
- if any(isinstance(spec, LegacySpecifier) for spec in dep.specifier):
- deprecated(
- reason=(
- f"pip has selected {req} {version} which has non "
- f"standard dependency specifier {dep}. "
- f"In the future this version of {req} will be "
- f"ignored as it isn't standard compliant."
- ),
- replacement=(
- "set or update constraints to select another version "
- "or contact the package author to fix the version number"
- ),
- issue=12063,
- gone_in="24.1",
- )
diff --git a/contrib/python/pip/pip/_internal/req/req_uninstall.py b/contrib/python/pip/pip/_internal/req/req_uninstall.py
index 707fde1b2b..26df20844b 100644
--- a/contrib/python/pip/pip/_internal/req/req_uninstall.py
+++ b/contrib/python/pip/pip/_internal/req/req_uninstall.py
@@ -5,7 +5,7 @@ import sysconfig
from importlib.util import cache_from_source
from typing import Any, Callable, Dict, Generator, Iterable, List, Optional, Set, Tuple
-from pip._internal.exceptions import UninstallationError
+from pip._internal.exceptions import LegacyDistutilsInstall, UninstallMissingRecord
from pip._internal.locations import get_bin_prefix, get_bin_user
from pip._internal.metadata import BaseDistribution
from pip._internal.utils.compat import WINDOWS
@@ -61,7 +61,7 @@ def uninstallation_paths(dist: BaseDistribution) -> Generator[str, None, None]:
UninstallPathSet.add() takes care of the __pycache__ .py[co].
- If RECORD is not found, raises UninstallationError,
+ If RECORD is not found, raises an error,
with possible information from the INSTALLER file.
https://packaging.python.org/specifications/recording-installed-packages/
@@ -71,17 +71,7 @@ def uninstallation_paths(dist: BaseDistribution) -> Generator[str, None, None]:
entries = dist.iter_declared_entries()
if entries is None:
- msg = f"Cannot uninstall {dist}, RECORD file not found."
- installer = dist.installer
- if not installer or installer == "pip":
- dep = f"{dist.raw_name}=={dist.version}"
- msg += (
- " You might be able to recover from this via: "
- f"'pip install --force-reinstall --no-deps {dep}'."
- )
- else:
- msg += f" Hint: The package was installed by {installer}."
- raise UninstallationError(msg)
+ raise UninstallMissingRecord(distribution=dist)
for entry in entries:
path = os.path.join(location, entry)
@@ -315,7 +305,7 @@ class UninstallPathSet:
# Create local cache of normalize_path results. Creating an UninstallPathSet
# can result in hundreds/thousands of redundant calls to normalize_path with
# the same args, which hurts performance.
- self._normalize_path_cached = functools.lru_cache()(normalize_path)
+ self._normalize_path_cached = functools.lru_cache(normalize_path)
def _permitted(self, path: str) -> bool:
"""
@@ -367,7 +357,7 @@ class UninstallPathSet:
)
return
- dist_name_version = f"{self._dist.raw_name}-{self._dist.version}"
+ dist_name_version = f"{self._dist.raw_name}-{self._dist.raw_version}"
logger.info("Uninstalling %s:", dist_name_version)
with indent_log():
@@ -509,13 +499,7 @@ class UninstallPathSet:
paths_to_remove.add(f"{path}.pyo")
elif dist.installed_by_distutils:
- raise UninstallationError(
- "Cannot uninstall {!r}. It is a distutils installed project "
- "and thus we cannot accurately determine which files belong "
- "to it which would lead to only a partial uninstall.".format(
- dist.raw_name,
- )
- )
+ raise LegacyDistutilsInstall(distribution=dist)
elif dist.installed_as_egg:
# package installed by easy_install
diff --git a/contrib/python/pip/pip/_internal/resolution/legacy/resolver.py b/contrib/python/pip/pip/_internal/resolution/legacy/resolver.py
index 5ddb848a9b..1dd0d7041b 100644
--- a/contrib/python/pip/pip/_internal/resolution/legacy/resolver.py
+++ b/contrib/python/pip/pip/_internal/resolution/legacy/resolver.py
@@ -10,9 +10,6 @@ for sub-dependencies
a. "first found, wins" (where the order is breadth first)
"""
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
import logging
import sys
from collections import defaultdict
@@ -52,7 +49,7 @@ from pip._internal.utils.packaging import check_requires_python
logger = logging.getLogger(__name__)
-DiscoveredDependencies = DefaultDict[str, List[InstallRequirement]]
+DiscoveredDependencies = DefaultDict[Optional[str], List[InstallRequirement]]
def _check_dist_requires_python(
@@ -104,9 +101,8 @@ def _check_dist_requires_python(
return
raise UnsupportedPythonVersion(
- "Package {!r} requires a different Python: {} not in {!r}".format(
- dist.raw_name, version, requires_python
- )
+ f"Package {dist.raw_name!r} requires a different Python: "
+ f"{version} not in {requires_python!r}"
)
@@ -246,9 +242,9 @@ class Resolver(BaseResolver):
return [install_req], None
try:
- existing_req: Optional[
- InstallRequirement
- ] = requirement_set.get_requirement(install_req.name)
+ existing_req: Optional[InstallRequirement] = (
+ requirement_set.get_requirement(install_req.name)
+ )
except KeyError:
existing_req = None
@@ -263,9 +259,8 @@ class Resolver(BaseResolver):
)
if has_conflicting_requirement:
raise InstallationError(
- "Double requirement given: {} (already in {}, name={!r})".format(
- install_req, existing_req, install_req.name
- )
+ f"Double requirement given: {install_req} "
+ f"(already in {existing_req}, name={install_req.name!r})"
)
# When no existing requirement exists, add the requirement as a
@@ -323,6 +318,7 @@ class Resolver(BaseResolver):
"""
# Don't uninstall the conflict if doing a user install and the
# conflict is not a user install.
+ assert req.satisfied_by is not None
if not self.use_user_site or req.satisfied_by.in_usersite:
req.should_reinstall = True
req.satisfied_by = None
@@ -421,6 +417,8 @@ class Resolver(BaseResolver):
if self.wheel_cache is None or self.preparer.require_hashes:
return
+
+ assert req.link is not None, "_find_requirement_link unexpectedly returned None"
cache_entry = self.wheel_cache.get_cache_entry(
link=req.link,
package_name=req.name,
@@ -534,6 +532,7 @@ class Resolver(BaseResolver):
with indent_log():
# We add req_to_install before its dependencies, so that we
# can refer to it when adding dependencies.
+ assert req_to_install.name is not None
if not requirement_set.has_requirement(req_to_install.name):
# 'unnamed' requirements will get added here
# 'unnamed' requirements can only come from being directly
diff --git a/contrib/python/pip/pip/_internal/resolution/resolvelib/base.py b/contrib/python/pip/pip/_internal/resolution/resolvelib/base.py
index 9c0ef5ca7b..0f31dc9b30 100644
--- a/contrib/python/pip/pip/_internal/resolution/resolvelib/base.py
+++ b/contrib/python/pip/pip/_internal/resolution/resolvelib/base.py
@@ -1,15 +1,15 @@
-from typing import FrozenSet, Iterable, Optional, Tuple, Union
+from dataclasses import dataclass
+from typing import FrozenSet, Iterable, Optional, Tuple
from pip._vendor.packaging.specifiers import SpecifierSet
from pip._vendor.packaging.utils import NormalizedName
-from pip._vendor.packaging.version import LegacyVersion, Version
+from pip._vendor.packaging.version import Version
from pip._internal.models.link import Link, links_equivalent
from pip._internal.req.req_install import InstallRequirement
from pip._internal.utils.hashes import Hashes
CandidateLookup = Tuple[Optional["Candidate"], Optional[InstallRequirement]]
-CandidateVersion = Union[LegacyVersion, Version]
def format_name(project: NormalizedName, extras: FrozenSet[NormalizedName]) -> str:
@@ -19,13 +19,11 @@ def format_name(project: NormalizedName, extras: FrozenSet[NormalizedName]) -> s
return f"{project}[{extras_expr}]"
+@dataclass(frozen=True)
class Constraint:
- def __init__(
- self, specifier: SpecifierSet, hashes: Hashes, links: FrozenSet[Link]
- ) -> None:
- self.specifier = specifier
- self.hashes = hashes
- self.links = links
+ specifier: SpecifierSet
+ hashes: Hashes
+ links: FrozenSet[Link]
@classmethod
def empty(cls) -> "Constraint":
@@ -116,7 +114,7 @@ class Candidate:
raise NotImplementedError("Override in subclass")
@property
- def version(self) -> CandidateVersion:
+ def version(self) -> Version:
raise NotImplementedError("Override in subclass")
@property
diff --git a/contrib/python/pip/pip/_internal/resolution/resolvelib/candidates.py b/contrib/python/pip/pip/_internal/resolution/resolvelib/candidates.py
index 4125cda2b7..d30d477be6 100644
--- a/contrib/python/pip/pip/_internal/resolution/resolvelib/candidates.py
+++ b/contrib/python/pip/pip/_internal/resolution/resolvelib/candidates.py
@@ -2,6 +2,7 @@ import logging
import sys
from typing import TYPE_CHECKING, Any, FrozenSet, Iterable, Optional, Tuple, Union, cast
+from pip._vendor.packaging.requirements import InvalidRequirement
from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
from pip._vendor.packaging.version import Version
@@ -9,6 +10,7 @@ from pip._internal.exceptions import (
HashError,
InstallationSubprocessError,
MetadataInconsistent,
+ MetadataInvalid,
)
from pip._internal.metadata import BaseDistribution
from pip._internal.models.link import Link, links_equivalent
@@ -21,7 +23,7 @@ from pip._internal.req.req_install import InstallRequirement
from pip._internal.utils.direct_url_helpers import direct_url_from_link
from pip._internal.utils.misc import normalize_version_info
-from .base import Candidate, CandidateVersion, Requirement, format_name
+from .base import Candidate, Requirement, format_name
if TYPE_CHECKING:
from .factory import Factory
@@ -145,7 +147,7 @@ class _InstallRequirementBackedCandidate(Candidate):
ireq: InstallRequirement,
factory: "Factory",
name: Optional[NormalizedName] = None,
- version: Optional[CandidateVersion] = None,
+ version: Optional[Version] = None,
) -> None:
self._link = link
self._source_link = source_link
@@ -154,6 +156,7 @@ class _InstallRequirementBackedCandidate(Candidate):
self._name = name
self._version = version
self.dist = self._prepare()
+ self._hash: Optional[int] = None
def __str__(self) -> str:
return f"{self.name} {self.version}"
@@ -162,7 +165,11 @@ class _InstallRequirementBackedCandidate(Candidate):
return f"{self.__class__.__name__}({str(self._link)!r})"
def __hash__(self) -> int:
- return hash((self.__class__, self._link))
+ if self._hash is not None:
+ return self._hash
+
+ self._hash = hash((self.__class__, self._link))
+ return self._hash
def __eq__(self, other: Any) -> bool:
if isinstance(other, self.__class__):
@@ -185,16 +192,15 @@ class _InstallRequirementBackedCandidate(Candidate):
return self.project_name
@property
- def version(self) -> CandidateVersion:
+ def version(self) -> Version:
if self._version is None:
self._version = self.dist.version
return self._version
def format_for_error(self) -> str:
- return "{} {} (from {})".format(
- self.name,
- self.version,
- self._link.file_path if self._link.is_file else self._link,
+ return (
+ f"{self.name} {self.version} "
+ f"(from {self._link.file_path if self._link.is_file else self._link})"
)
def _prepare_distribution(self) -> BaseDistribution:
@@ -216,6 +222,13 @@ class _InstallRequirementBackedCandidate(Candidate):
str(self._version),
str(dist.version),
)
+ # check dependencies are valid
+ # TODO performance: this means we iterate the dependencies at least twice,
+ # we may want to cache parsed Requires-Dist
+ try:
+ list(dist.iter_dependencies(list(dist.iter_provided_extras())))
+ except InvalidRequirement as e:
+ raise MetadataInvalid(self._ireq, str(e))
def _prepare(self) -> BaseDistribution:
try:
@@ -253,7 +266,7 @@ class LinkCandidate(_InstallRequirementBackedCandidate):
template: InstallRequirement,
factory: "Factory",
name: Optional[NormalizedName] = None,
- version: Optional[CandidateVersion] = None,
+ version: Optional[Version] = None,
) -> None:
source_link = link
cache_entry = factory.get_wheel_cache_entry(source_link, name)
@@ -269,9 +282,9 @@ class LinkCandidate(_InstallRequirementBackedCandidate):
# Version may not be present for PEP 508 direct URLs
if version is not None:
wheel_version = Version(wheel.version)
- assert version == wheel_version, "{!r} != {!r} for wheel {}".format(
- version, wheel_version, name
- )
+ assert (
+ version == wheel_version
+ ), f"{version!r} != {wheel_version!r} for wheel {name}"
if cache_entry is not None:
assert ireq.link.is_wheel
@@ -310,7 +323,7 @@ class EditableCandidate(_InstallRequirementBackedCandidate):
template: InstallRequirement,
factory: "Factory",
name: Optional[NormalizedName] = None,
- version: Optional[CandidateVersion] = None,
+ version: Optional[Version] = None,
) -> None:
super().__init__(
link=link,
@@ -353,13 +366,13 @@ class AlreadyInstalledCandidate(Candidate):
def __repr__(self) -> str:
return f"{self.__class__.__name__}({self.dist!r})"
- def __hash__(self) -> int:
- return hash((self.__class__, self.name, self.version))
+ def __eq__(self, other: object) -> bool:
+ if not isinstance(other, AlreadyInstalledCandidate):
+ return NotImplemented
+ return self.name == other.name and self.version == other.version
- def __eq__(self, other: Any) -> bool:
- if isinstance(other, self.__class__):
- return self.name == other.name and self.version == other.version
- return False
+ def __hash__(self) -> int:
+ return hash((self.name, self.version))
@property
def project_name(self) -> NormalizedName:
@@ -370,7 +383,7 @@ class AlreadyInstalledCandidate(Candidate):
return self.project_name
@property
- def version(self) -> CandidateVersion:
+ def version(self) -> Version:
if self._version is None:
self._version = self.dist.version
return self._version
@@ -434,14 +447,6 @@ class ExtrasCandidate(Candidate):
"""
self.base = base
self.extras = frozenset(canonicalize_name(e) for e in extras)
- # If any extras are requested in their non-normalized forms, keep track
- # of their raw values. This is needed when we look up dependencies
- # since PEP 685 has not been implemented for marker-matching, and using
- # the non-normalized extra for lookup ensures the user can select a
- # non-normalized extra in a package with its non-normalized form.
- # TODO: Remove this attribute when packaging is upgraded to support the
- # marker comparison logic specified in PEP 685.
- self._unnormalized_extras = extras.difference(self.extras)
self._comes_from = comes_from if comes_from is not None else self.base._ireq
def __str__(self) -> str:
@@ -469,7 +474,7 @@ class ExtrasCandidate(Candidate):
return format_name(self.base.project_name, self.extras)
@property
- def version(self) -> CandidateVersion:
+ def version(self) -> Version:
return self.base.version
def format_for_error(self) -> str:
@@ -489,50 +494,6 @@ class ExtrasCandidate(Candidate):
def source_link(self) -> Optional[Link]:
return self.base.source_link
- def _warn_invalid_extras(
- self,
- requested: FrozenSet[str],
- valid: FrozenSet[str],
- ) -> None:
- """Emit warnings for invalid extras being requested.
-
- This emits a warning for each requested extra that is not in the
- candidate's ``Provides-Extra`` list.
- """
- invalid_extras_to_warn = frozenset(
- extra
- for extra in requested
- if extra not in valid
- # If an extra is requested in an unnormalized form, skip warning
- # about the normalized form being missing.
- and extra in self.extras
- )
- if not invalid_extras_to_warn:
- return
- for extra in sorted(invalid_extras_to_warn):
- logger.warning(
- "%s %s does not provide the extra '%s'",
- self.base.name,
- self.version,
- extra,
- )
-
- def _calculate_valid_requested_extras(self) -> FrozenSet[str]:
- """Get a list of valid extras requested by this candidate.
-
- The user (or upstream dependant) may have specified extras that the
- candidate doesn't support. Any unsupported extras are dropped, and each
- cause a warning to be logged here.
- """
- requested_extras = self.extras.union(self._unnormalized_extras)
- valid_extras = frozenset(
- extra
- for extra in requested_extras
- if self.base.dist.is_extra_provided(extra)
- )
- self._warn_invalid_extras(requested_extras, valid_extras)
- return valid_extras
-
def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]:
factory = self.base._factory
@@ -542,7 +503,18 @@ class ExtrasCandidate(Candidate):
if not with_requires:
return
- valid_extras = self._calculate_valid_requested_extras()
+ # The user may have specified extras that the candidate doesn't
+ # support. We ignore any unsupported extras here.
+ valid_extras = self.extras.intersection(self.base.dist.iter_provided_extras())
+ invalid_extras = self.extras.difference(self.base.dist.iter_provided_extras())
+ for extra in sorted(invalid_extras):
+ logger.warning(
+ "%s %s does not provide the extra '%s'",
+ self.base.name,
+ self.version,
+ extra,
+ )
+
for r in self.base.dist.iter_dependencies(valid_extras):
yield from factory.make_requirements_from_spec(
str(r),
@@ -584,7 +556,7 @@ class RequiresPythonCandidate(Candidate):
return REQUIRES_PYTHON_IDENTIFIER
@property
- def version(self) -> CandidateVersion:
+ def version(self) -> Version:
return self._version
def format_for_error(self) -> str:
diff --git a/contrib/python/pip/pip/_internal/resolution/resolvelib/factory.py b/contrib/python/pip/pip/_internal/resolution/resolvelib/factory.py
index 4adeb4309c..1f31d834b0 100644
--- a/contrib/python/pip/pip/_internal/resolution/resolvelib/factory.py
+++ b/contrib/python/pip/pip/_internal/resolution/resolvelib/factory.py
@@ -3,6 +3,7 @@ import functools
import logging
from typing import (
TYPE_CHECKING,
+ Callable,
Dict,
FrozenSet,
Iterable,
@@ -11,6 +12,7 @@ from typing import (
Mapping,
NamedTuple,
Optional,
+ Protocol,
Sequence,
Set,
Tuple,
@@ -21,6 +23,7 @@ from typing import (
from pip._vendor.packaging.requirements import InvalidRequirement
from pip._vendor.packaging.specifiers import SpecifierSet
from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
+from pip._vendor.packaging.version import Version
from pip._vendor.resolvelib import ResolutionImpossible
from pip._internal.cache import CacheEntry, WheelCache
@@ -28,6 +31,7 @@ from pip._internal.exceptions import (
DistributionNotFound,
InstallationError,
MetadataInconsistent,
+ MetadataInvalid,
UnsupportedPythonVersion,
UnsupportedWheel,
)
@@ -50,7 +54,7 @@ from pip._internal.utils.hashes import Hashes
from pip._internal.utils.packaging import get_requirement
from pip._internal.utils.virtualenv import running_under_virtualenv
-from .base import Candidate, CandidateVersion, Constraint, Requirement
+from .base import Candidate, Constraint, Requirement
from .candidates import (
AlreadyInstalledCandidate,
BaseCandidate,
@@ -70,7 +74,6 @@ from .requirements import (
)
if TYPE_CHECKING:
- from typing import Protocol
class ConflictCause(Protocol):
requirement: RequiresPythonRequirement
@@ -177,7 +180,7 @@ class Factory:
extras: FrozenSet[str],
template: InstallRequirement,
name: Optional[NormalizedName],
- version: Optional[CandidateVersion],
+ version: Optional[Version],
) -> Optional[Candidate]:
base: Optional[BaseCandidate] = self._make_base_candidate_from_link(
link, template, name, version
@@ -191,7 +194,7 @@ class Factory:
link: Link,
template: InstallRequirement,
name: Optional[NormalizedName],
- version: Optional[CandidateVersion],
+ version: Optional[Version],
) -> Optional[BaseCandidate]:
# TODO: Check already installed candidate, and use it if the link and
# editable flag match.
@@ -211,7 +214,7 @@ class Factory:
name=name,
version=version,
)
- except MetadataInconsistent as e:
+ except (MetadataInconsistent, MetadataInvalid) as e:
logger.info(
"Discarding [blue underline]%s[/]: [yellow]%s[reset]",
link,
@@ -391,6 +394,7 @@ class Factory:
incompatibilities: Mapping[str, Iterator[Candidate]],
constraint: Constraint,
prefers_installed: bool,
+ is_satisfied_by: Callable[[Requirement, Candidate], bool],
) -> Iterable[Candidate]:
# Collect basic lookup information from the requirements.
explicit_candidates: Set[Candidate] = set()
@@ -456,7 +460,7 @@ class Factory:
for c in explicit_candidates
if id(c) not in incompat_ids
and constraint.is_satisfied_by(c)
- and all(req.is_satisfied_by(c) for req in requirements[identifier])
+ and all(is_satisfied_by(req, c) for req in requirements[identifier])
)
def _make_requirements_from_install_req(
@@ -668,8 +672,8 @@ class Factory:
cands = self._finder.find_all_candidates(req.project_name)
skipped_by_requires_python = self._finder.requires_python_skipped_reasons()
- versions_set: Set[CandidateVersion] = set()
- yanked_versions_set: Set[CandidateVersion] = set()
+ versions_set: Set[Version] = set()
+ yanked_versions_set: Set[Version] = set()
for c in cands:
is_yanked = c.link.is_yanked if c.link else False
if is_yanked:
@@ -799,7 +803,7 @@ class Factory:
+ "\n\n"
+ "To fix this you could try to:\n"
+ "1. loosen the range of package versions you've specified\n"
- + "2. remove package versions to allow pip attempt to solve "
+ + "2. remove package versions to allow pip to attempt to solve "
+ "the dependency conflict\n"
)
diff --git a/contrib/python/pip/pip/_internal/resolution/resolvelib/found_candidates.py b/contrib/python/pip/pip/_internal/resolution/resolvelib/found_candidates.py
index 8663097b44..a1d57e0f4b 100644
--- a/contrib/python/pip/pip/_internal/resolution/resolvelib/found_candidates.py
+++ b/contrib/python/pip/pip/_internal/resolution/resolvelib/found_candidates.py
@@ -9,13 +9,18 @@ something.
"""
import functools
+import logging
from collections.abc import Sequence
from typing import TYPE_CHECKING, Any, Callable, Iterator, Optional, Set, Tuple
from pip._vendor.packaging.version import _BaseVersion
+from pip._internal.exceptions import MetadataInvalid
+
from .base import Candidate
+logger = logging.getLogger(__name__)
+
IndexCandidateInfo = Tuple[_BaseVersion, Callable[[], Optional[Candidate]]]
if TYPE_CHECKING:
@@ -44,11 +49,25 @@ def _iter_built(infos: Iterator[IndexCandidateInfo]) -> Iterator[Candidate]:
for version, func in infos:
if version in versions_found:
continue
- candidate = func()
- if candidate is None:
- continue
- yield candidate
- versions_found.add(version)
+ try:
+ candidate = func()
+ except MetadataInvalid as e:
+ logger.warning(
+ "Ignoring version %s of %s since it has invalid metadata:\n"
+ "%s\n"
+ "Please use pip<24.1 if you need to use this version.",
+ version,
+ e.ireq.name,
+ e,
+ )
+ # Mark version as found to avoid trying other candidates with the same
+ # version, since they most likely have invalid metadata as well.
+ versions_found.add(version)
+ else:
+ if candidate is None:
+ continue
+ yield candidate
+ versions_found.add(version)
def _iter_built_with_prepended(
diff --git a/contrib/python/pip/pip/_internal/resolution/resolvelib/provider.py b/contrib/python/pip/pip/_internal/resolution/resolvelib/provider.py
index 315fb9c890..fb0dd85f11 100644
--- a/contrib/python/pip/pip/_internal/resolution/resolvelib/provider.py
+++ b/contrib/python/pip/pip/_internal/resolution/resolvelib/provider.py
@@ -1,5 +1,6 @@
import collections
import math
+from functools import lru_cache
from typing import (
TYPE_CHECKING,
Dict,
@@ -234,8 +235,10 @@ class PipProvider(_ProviderBase):
constraint=constraint,
prefers_installed=(not _eligible_for_upgrade(identifier)),
incompatibilities=incompatibilities,
+ is_satisfied_by=self.is_satisfied_by,
)
+ @lru_cache(maxsize=None)
def is_satisfied_by(self, requirement: Requirement, candidate: Candidate) -> bool:
return requirement.is_satisfied_by(candidate)
diff --git a/contrib/python/pip/pip/_internal/resolution/resolvelib/requirements.py b/contrib/python/pip/pip/_internal/resolution/resolvelib/requirements.py
index 4af4a9f25a..b04f41b219 100644
--- a/contrib/python/pip/pip/_internal/resolution/resolvelib/requirements.py
+++ b/contrib/python/pip/pip/_internal/resolution/resolvelib/requirements.py
@@ -1,3 +1,5 @@
+from typing import Any, Optional
+
from pip._vendor.packaging.specifiers import SpecifierSet
from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
@@ -17,6 +19,14 @@ class ExplicitRequirement(Requirement):
def __repr__(self) -> str:
return f"{self.__class__.__name__}({self.candidate!r})"
+ def __hash__(self) -> int:
+ return hash(self.candidate)
+
+ def __eq__(self, other: Any) -> bool:
+ if not isinstance(other, ExplicitRequirement):
+ return False
+ return self.candidate == other.candidate
+
@property
def project_name(self) -> NormalizedName:
# No need to canonicalize - the candidate did this
@@ -41,14 +51,36 @@ class SpecifierRequirement(Requirement):
def __init__(self, ireq: InstallRequirement) -> None:
assert ireq.link is None, "This is a link, not a specifier"
self._ireq = ireq
+ self._equal_cache: Optional[str] = None
+ self._hash: Optional[int] = None
self._extras = frozenset(canonicalize_name(e) for e in self._ireq.extras)
+ @property
+ def _equal(self) -> str:
+ if self._equal_cache is not None:
+ return self._equal_cache
+
+ self._equal_cache = str(self._ireq)
+ return self._equal_cache
+
def __str__(self) -> str:
return str(self._ireq.req)
def __repr__(self) -> str:
return f"{self.__class__.__name__}({str(self._ireq.req)!r})"
+ def __eq__(self, other: object) -> bool:
+ if not isinstance(other, SpecifierRequirement):
+ return NotImplemented
+ return self._equal == other._equal
+
+ def __hash__(self) -> int:
+ if self._hash is not None:
+ return self._hash
+
+ self._hash = hash(self._equal)
+ return self._hash
+
@property
def project_name(self) -> NormalizedName:
assert self._ireq.req, "Specifier-backed ireq is always PEP 508"
@@ -96,14 +128,38 @@ class SpecifierWithoutExtrasRequirement(SpecifierRequirement):
def __init__(self, ireq: InstallRequirement) -> None:
assert ireq.link is None, "This is a link, not a specifier"
self._ireq = install_req_drop_extras(ireq)
+ self._equal_cache: Optional[str] = None
+ self._hash: Optional[int] = None
self._extras = frozenset(canonicalize_name(e) for e in self._ireq.extras)
+ @property
+ def _equal(self) -> str:
+ if self._equal_cache is not None:
+ return self._equal_cache
+
+ self._equal_cache = str(self._ireq)
+ return self._equal_cache
+
+ def __eq__(self, other: object) -> bool:
+ if not isinstance(other, SpecifierWithoutExtrasRequirement):
+ return NotImplemented
+ return self._equal == other._equal
+
+ def __hash__(self) -> int:
+ if self._hash is not None:
+ return self._hash
+
+ self._hash = hash(self._equal)
+ return self._hash
+
class RequiresPythonRequirement(Requirement):
"""A requirement representing Requires-Python metadata."""
def __init__(self, specifier: SpecifierSet, match: Candidate) -> None:
self.specifier = specifier
+ self._specifier_string = str(specifier) # for faster __eq__
+ self._hash: Optional[int] = None
self._candidate = match
def __str__(self) -> str:
@@ -112,6 +168,21 @@ class RequiresPythonRequirement(Requirement):
def __repr__(self) -> str:
return f"{self.__class__.__name__}({str(self.specifier)!r})"
+ def __hash__(self) -> int:
+ if self._hash is not None:
+ return self._hash
+
+ self._hash = hash((self._specifier_string, self._candidate))
+ return self._hash
+
+ def __eq__(self, other: Any) -> bool:
+ if not isinstance(other, RequiresPythonRequirement):
+ return False
+ return (
+ self._specifier_string == other._specifier_string
+ and self._candidate == other._candidate
+ )
+
@property
def project_name(self) -> NormalizedName:
return self._candidate.project_name
@@ -148,6 +219,14 @@ class UnsatisfiableRequirement(Requirement):
def __repr__(self) -> str:
return f"{self.__class__.__name__}({str(self._name)!r})"
+ def __eq__(self, other: object) -> bool:
+ if not isinstance(other, UnsatisfiableRequirement):
+ return NotImplemented
+ return self._name == other._name
+
+ def __hash__(self) -> int:
+ return hash(self._name)
+
@property
def project_name(self) -> NormalizedName:
return self._name
diff --git a/contrib/python/pip/pip/_internal/self_outdated_check.py b/contrib/python/pip/pip/_internal/self_outdated_check.py
index 0f64ae0e61..2185f2fb10 100644
--- a/contrib/python/pip/pip/_internal/self_outdated_check.py
+++ b/contrib/python/pip/pip/_internal/self_outdated_check.py
@@ -9,6 +9,7 @@ import sys
from dataclasses import dataclass
from typing import Any, Callable, Dict, Optional
+from pip._vendor.packaging.version import Version
from pip._vendor.packaging.version import parse as parse_version
from pip._vendor.rich.console import Group
from pip._vendor.rich.markup import escape
@@ -17,7 +18,6 @@ from pip._vendor.rich.text import Text
from pip._internal.index.collector import LinkCollector
from pip._internal.index.package_finder import PackageFinder
from pip._internal.metadata import get_default_environment
-from pip._internal.metadata.base import DistributionVersion
from pip._internal.models.selection_prefs import SelectionPreferences
from pip._internal.network.session import PipSession
from pip._internal.utils.compat import WINDOWS
@@ -191,7 +191,7 @@ def _self_version_check_logic(
*,
state: SelfCheckState,
current_time: datetime.datetime,
- local_version: DistributionVersion,
+ local_version: Version,
get_remote_version: Callable[[], Optional[str]],
) -> Optional[UpgradePrompt]:
remote_version_str = state.get(current_time)
diff --git a/contrib/python/pip/pip/_internal/utils/_jaraco_text.py b/contrib/python/pip/pip/_internal/utils/_jaraco_text.py
index e06947c051..6ccf53b7ac 100644
--- a/contrib/python/pip/pip/_internal/utils/_jaraco_text.py
+++ b/contrib/python/pip/pip/_internal/utils/_jaraco_text.py
@@ -88,7 +88,7 @@ def join_continuation(lines):
['foobarbaz']
Not sure why, but...
- The character preceeding the backslash is also elided.
+ The character preceding the backslash is also elided.
>>> list(join_continuation(['goo\\', 'dly']))
['godly']
diff --git a/contrib/python/pip/pip/_internal/utils/compat.py b/contrib/python/pip/pip/_internal/utils/compat.py
index 3f4d300cef..d8b54e4ee5 100644
--- a/contrib/python/pip/pip/_internal/utils/compat.py
+++ b/contrib/python/pip/pip/_internal/utils/compat.py
@@ -1,9 +1,11 @@
"""Stuff that differs in different Python versions and platform
distributions."""
+import importlib.resources
import logging
import os
import sys
+from typing import IO
__all__ = ["get_path_uid", "stdlib_pkgs", "WINDOWS"]
@@ -51,6 +53,20 @@ def get_path_uid(path: str) -> int:
return file_uid
+# The importlib.resources.open_text function was deprecated in 3.11 with suggested
+# replacement we use below.
+if sys.version_info < (3, 11):
+ open_text_resource = importlib.resources.open_text
+else:
+
+ def open_text_resource(
+ package: str, resource: str, encoding: str = "utf-8", errors: str = "strict"
+ ) -> IO[str]:
+ return (importlib.resources.files(package) / resource).open(
+ "r", encoding=encoding, errors=errors
+ )
+
+
# packages in the stdlib that may have installation metadata, but should not be
# considered 'installed'. this theoretically could be determined based on
# dist.location (py27:`sysconfig.get_paths()['stdlib']`,
diff --git a/contrib/python/pip/pip/_internal/utils/deprecation.py b/contrib/python/pip/pip/_internal/utils/deprecation.py
index 72bd6f25a5..0911147e78 100644
--- a/contrib/python/pip/pip/_internal/utils/deprecation.py
+++ b/contrib/python/pip/pip/_internal/utils/deprecation.py
@@ -87,9 +87,11 @@ def deprecated(
(reason, f"{DEPRECATION_MSG_PREFIX}{{}}"),
(
gone_in,
- "pip {} will enforce this behaviour change."
- if not is_gone
- else "Since pip {}, this is no longer supported.",
+ (
+ "pip {} will enforce this behaviour change."
+ if not is_gone
+ else "Since pip {}, this is no longer supported."
+ ),
),
(
replacement,
@@ -97,9 +99,11 @@ def deprecated(
),
(
feature_flag,
- "You can use the flag --use-feature={} to test the upcoming behaviour."
- if not is_gone
- else None,
+ (
+ "You can use the flag --use-feature={} to test the upcoming behaviour."
+ if not is_gone
+ else None
+ ),
),
(
issue,
diff --git a/contrib/python/pip/pip/_internal/utils/direct_url_helpers.py b/contrib/python/pip/pip/_internal/utils/direct_url_helpers.py
index 0e8e5e1608..66020d3964 100644
--- a/contrib/python/pip/pip/_internal/utils/direct_url_helpers.py
+++ b/contrib/python/pip/pip/_internal/utils/direct_url_helpers.py
@@ -12,8 +12,8 @@ def direct_url_as_pep440_direct_reference(direct_url: DirectUrl, name: str) -> s
requirement = name + " @ "
fragments = []
if isinstance(direct_url.info, VcsInfo):
- requirement += "{}+{}@{}".format(
- direct_url.info.vcs, direct_url.url, direct_url.info.commit_id
+ requirement += (
+ f"{direct_url.info.vcs}+{direct_url.url}@{direct_url.info.commit_id}"
)
elif isinstance(direct_url.info, ArchiveInfo):
requirement += direct_url.url
diff --git a/contrib/python/pip/pip/_internal/utils/hashes.py b/contrib/python/pip/pip/_internal/utils/hashes.py
index 843cffc6b3..c073b09dd9 100644
--- a/contrib/python/pip/pip/_internal/utils/hashes.py
+++ b/contrib/python/pip/pip/_internal/utils/hashes.py
@@ -1,5 +1,5 @@
import hashlib
-from typing import TYPE_CHECKING, BinaryIO, Dict, Iterable, List, Optional
+from typing import TYPE_CHECKING, BinaryIO, Dict, Iterable, List, NoReturn, Optional
from pip._internal.exceptions import HashMismatch, HashMissing, InstallationError
from pip._internal.utils.misc import read_chunks
@@ -7,10 +7,6 @@ from pip._internal.utils.misc import read_chunks
if TYPE_CHECKING:
from hashlib import _Hash
- # NoReturn introduced in 3.6.2; imported only for type checking to maintain
- # pip compatibility with older patch versions of Python 3.6
- from typing import NoReturn
-
# The recommended hash algo of the moment. Change this whenever the state of
# the art changes; it won't hurt backward compatibility.
diff --git a/contrib/python/pip/pip/_internal/utils/logging.py b/contrib/python/pip/pip/_internal/utils/logging.py
index 95982dfb69..90df257821 100644
--- a/contrib/python/pip/pip/_internal/utils/logging.py
+++ b/contrib/python/pip/pip/_internal/utils/logging.py
@@ -212,7 +212,6 @@ class MaxLevelFilter(Filter):
class ExcludeLoggerFilter(Filter):
-
"""
A logging Filter that excludes records from a logger (or its children).
"""
diff --git a/contrib/python/pip/pip/_internal/utils/misc.py b/contrib/python/pip/pip/_internal/utils/misc.py
index 1ad3f6162a..48771c0991 100644
--- a/contrib/python/pip/pip/_internal/utils/misc.py
+++ b/contrib/python/pip/pip/_internal/utils/misc.py
@@ -1,4 +1,3 @@
-import contextlib
import errno
import getpass
import hashlib
@@ -11,6 +10,7 @@ import stat
import sys
import sysconfig
import urllib.parse
+from dataclasses import dataclass
from functools import partial
from io import StringIO
from itertools import filterfalse, tee, zip_longest
@@ -20,7 +20,6 @@ from typing import (
Any,
BinaryIO,
Callable,
- ContextManager,
Dict,
Generator,
Iterable,
@@ -56,7 +55,6 @@ __all__ = [
"normalize_path",
"renames",
"get_prog",
- "captured_stdout",
"ensure_dir",
"remove_auth_from_url",
"check_externally_managed",
@@ -399,40 +397,6 @@ class StreamWrapper(StringIO):
return self.orig_stream.encoding
-@contextlib.contextmanager
-def captured_output(stream_name: str) -> Generator[StreamWrapper, None, None]:
- """Return a context manager used by captured_stdout/stdin/stderr
- that temporarily replaces the sys stream *stream_name* with a StringIO.
-
- Taken from Lib/support/__init__.py in the CPython repo.
- """
- orig_stdout = getattr(sys, stream_name)
- setattr(sys, stream_name, StreamWrapper.from_stream(orig_stdout))
- try:
- yield getattr(sys, stream_name)
- finally:
- setattr(sys, stream_name, orig_stdout)
-
-
-def captured_stdout() -> ContextManager[StreamWrapper]:
- """Capture the output of sys.stdout:
-
- with captured_stdout() as stdout:
- print('hello')
- self.assertEqual(stdout.getvalue(), 'hello\n')
-
- Taken from Lib/support/__init__.py in the CPython repo.
- """
- return captured_output("stdout")
-
-
-def captured_stderr() -> ContextManager[StreamWrapper]:
- """
- See captured_stdout().
- """
- return captured_output("stderr")
-
-
# Simulates an enum
def enum(*sequential: Any, **named: Any) -> Type[Any]:
enums = dict(zip(sequential, range(len(sequential))), **named)
@@ -580,10 +544,10 @@ def redact_auth_from_requirement(req: Requirement) -> str:
return str(req).replace(req.url, redact_auth_from_url(req.url))
+@dataclass(frozen=True)
class HiddenText:
- def __init__(self, secret: str, redacted: str) -> None:
- self.secret = secret
- self.redacted = redacted
+ secret: str
+ redacted: str
def __repr__(self) -> str:
return f"<HiddenText {str(self)!r}>"
@@ -781,3 +745,36 @@ class ConfiguredBuildBackendHookCaller(BuildBackendHookCaller):
config_settings=cs,
_allow_fallback=_allow_fallback,
)
+
+
+def warn_if_run_as_root() -> None:
+ """Output a warning for sudo users on Unix.
+
+ In a virtual environment, sudo pip still writes to virtualenv.
+ On Windows, users may run pip as Administrator without issues.
+ This warning only applies to Unix root users outside of virtualenv.
+ """
+ if running_under_virtualenv():
+ return
+ if not hasattr(os, "getuid"):
+ return
+ # On Windows, there are no "system managed" Python packages. Installing as
+ # Administrator via pip is the correct way of updating system environments.
+ #
+ # We choose sys.platform over utils.compat.WINDOWS here to enable Mypy platform
+ # checks: https://mypy.readthedocs.io/en/stable/common_issues.html
+ if sys.platform == "win32" or sys.platform == "cygwin":
+ return
+
+ if os.getuid() != 0:
+ return
+
+ logger.warning(
+ "Running pip as the 'root' user can result in broken permissions and "
+ "conflicting behaviour with the system package manager, possibly "
+ "rendering your system unusable."
+ "It is recommended to use a virtual environment instead: "
+ "https://pip.pypa.io/warnings/venv. "
+ "Use the --root-user-action option if you know what you are doing and "
+ "want to suppress this warning."
+ )
diff --git a/contrib/python/pip/pip/_internal/utils/models.py b/contrib/python/pip/pip/_internal/utils/models.py
deleted file mode 100644
index b6bb21a8b2..0000000000
--- a/contrib/python/pip/pip/_internal/utils/models.py
+++ /dev/null
@@ -1,39 +0,0 @@
-"""Utilities for defining models
-"""
-
-import operator
-from typing import Any, Callable, Type
-
-
-class KeyBasedCompareMixin:
- """Provides comparison capabilities that is based on a key"""
-
- __slots__ = ["_compare_key", "_defining_class"]
-
- def __init__(self, key: Any, defining_class: Type["KeyBasedCompareMixin"]) -> None:
- self._compare_key = key
- self._defining_class = defining_class
-
- def __hash__(self) -> int:
- return hash(self._compare_key)
-
- def __lt__(self, other: Any) -> bool:
- return self._compare(other, operator.__lt__)
-
- def __le__(self, other: Any) -> bool:
- return self._compare(other, operator.__le__)
-
- def __gt__(self, other: Any) -> bool:
- return self._compare(other, operator.__gt__)
-
- def __ge__(self, other: Any) -> bool:
- return self._compare(other, operator.__ge__)
-
- def __eq__(self, other: Any) -> bool:
- return self._compare(other, operator.__eq__)
-
- def _compare(self, other: Any, method: Callable[[Any, Any], bool]) -> bool:
- if not isinstance(other, self._defining_class):
- return NotImplemented
-
- return method(self._compare_key, other._compare_key)
diff --git a/contrib/python/pip/pip/_internal/utils/subprocess.py b/contrib/python/pip/pip/_internal/utils/subprocess.py
index 79580b0532..cb2e23f007 100644
--- a/contrib/python/pip/pip/_internal/utils/subprocess.py
+++ b/contrib/python/pip/pip/_internal/utils/subprocess.py
@@ -2,16 +2,7 @@ import logging
import os
import shlex
import subprocess
-from typing import (
- TYPE_CHECKING,
- Any,
- Callable,
- Iterable,
- List,
- Mapping,
- Optional,
- Union,
-)
+from typing import Any, Callable, Iterable, List, Literal, Mapping, Optional, Union
from pip._vendor.rich.markup import escape
@@ -20,12 +11,6 @@ from pip._internal.exceptions import InstallationSubprocessError
from pip._internal.utils.logging import VERBOSE, subprocess_logger
from pip._internal.utils.misc import HiddenText
-if TYPE_CHECKING:
- # Literal was introduced in Python 3.8.
- #
- # TODO: Remove `if TYPE_CHECKING` when dropping support for Python 3.7.
- from typing import Literal
-
CommandArgs = List[Union[str, HiddenText]]
diff --git a/contrib/python/pip/pip/_internal/utils/unpacking.py b/contrib/python/pip/pip/_internal/utils/unpacking.py
index 78b5c13ced..341269550c 100644
--- a/contrib/python/pip/pip/_internal/utils/unpacking.py
+++ b/contrib/python/pip/pip/_internal/utils/unpacking.py
@@ -5,6 +5,7 @@ import logging
import os
import shutil
import stat
+import sys
import tarfile
import zipfile
from typing import Iterable, List, Optional
@@ -85,12 +86,16 @@ def is_within_directory(directory: str, target: str) -> bool:
return prefix == abs_directory
+def _get_default_mode_plus_executable() -> int:
+ return 0o777 & ~current_umask() | 0o111
+
+
def set_extracted_file_to_default_mode_plus_executable(path: str) -> None:
"""
Make file present at path have execute for user/group/world
(chmod +x) is no-op on windows per python docs
"""
- os.chmod(path, (0o777 & ~current_umask() | 0o111))
+ os.chmod(path, _get_default_mode_plus_executable())
def zip_item_is_executable(info: ZipInfo) -> bool:
@@ -151,8 +156,8 @@ def untar_file(filename: str, location: str) -> None:
Untar the file (with path `filename`) to the destination `location`.
All files are written based on system defaults and umask (i.e. permissions
are not preserved), except that regular file members with any execute
- permissions (user, group, or world) have "chmod +x" applied after being
- written. Note that for windows, any execute changes using os.chmod are
+ permissions (user, group, or world) have "chmod +x" applied on top of the
+ default. Note that for windows, any execute changes using os.chmod are
no-ops per the python docs.
"""
ensure_dir(location)
@@ -170,62 +175,127 @@ def untar_file(filename: str, location: str) -> None:
filename,
)
mode = "r:*"
+
tar = tarfile.open(filename, mode, encoding="utf-8")
try:
leading = has_leading_dir([member.name for member in tar.getmembers()])
- for member in tar.getmembers():
- fn = member.name
- if leading:
- fn = split_leading_dir(fn)[1]
- path = os.path.join(location, fn)
- if not is_within_directory(location, path):
- message = (
- "The tar file ({}) has a file ({}) trying to install "
- "outside target directory ({})"
- )
- raise InstallationError(message.format(filename, path, location))
- if member.isdir():
- ensure_dir(path)
- elif member.issym():
- try:
- tar._extract_member(member, path)
- except Exception as exc:
- # Some corrupt tar files seem to produce this
- # (specifically bad symlinks)
- logger.warning(
- "In the tar file %s the member %s is invalid: %s",
- filename,
- member.name,
- exc,
- )
- continue
- else:
+
+ # PEP 706 added `tarfile.data_filter`, and made some other changes to
+ # Python's tarfile module (see below). The features were backported to
+ # security releases.
+ try:
+ data_filter = tarfile.data_filter
+ except AttributeError:
+ _untar_without_filter(filename, location, tar, leading)
+ else:
+ default_mode_plus_executable = _get_default_mode_plus_executable()
+
+ def pip_filter(member: tarfile.TarInfo, path: str) -> tarfile.TarInfo:
+ if leading:
+ member.name = split_leading_dir(member.name)[1]
+ orig_mode = member.mode
try:
- fp = tar.extractfile(member)
- except (KeyError, AttributeError) as exc:
- # Some corrupt tar files seem to produce this
- # (specifically bad symlinks)
- logger.warning(
- "In the tar file %s the member %s is invalid: %s",
- filename,
- member.name,
- exc,
+ try:
+ member = data_filter(member, location)
+ except tarfile.LinkOutsideDestinationError:
+ if sys.version_info[:3] in {
+ (3, 8, 17),
+ (3, 9, 17),
+ (3, 10, 12),
+ (3, 11, 4),
+ }:
+ # The tarfile filter in specific Python versions
+ # raises LinkOutsideDestinationError on valid input
+ # (https://github.com/python/cpython/issues/107845)
+ # Ignore the error there, but do use the
+ # more lax `tar_filter`
+ member = tarfile.tar_filter(member, location)
+ else:
+ raise
+ except tarfile.TarError as exc:
+ message = "Invalid member in the tar file {}: {}"
+ # Filter error messages mention the member name.
+ # No need to add it here.
+ raise InstallationError(
+ message.format(
+ filename,
+ exc,
+ )
)
- continue
- ensure_dir(os.path.dirname(path))
- assert fp is not None
- with open(path, "wb") as destfp:
- shutil.copyfileobj(fp, destfp)
- fp.close()
- # Update the timestamp (useful for cython compiled files)
- tar.utime(member, path)
- # member have any execute permissions for user/group/world?
- if member.mode & 0o111:
- set_extracted_file_to_default_mode_plus_executable(path)
+ if member.isfile() and orig_mode & 0o111:
+ member.mode = default_mode_plus_executable
+ else:
+ # See PEP 706 note above.
+ # The PEP changed this from `int` to `Optional[int]`,
+ # where None means "use the default". Mypy doesn't
+ # know this yet.
+ member.mode = None # type: ignore [assignment]
+ return member
+
+ tar.extractall(location, filter=pip_filter)
+
finally:
tar.close()
+def _untar_without_filter(
+ filename: str,
+ location: str,
+ tar: tarfile.TarFile,
+ leading: bool,
+) -> None:
+ """Fallback for Python without tarfile.data_filter"""
+ for member in tar.getmembers():
+ fn = member.name
+ if leading:
+ fn = split_leading_dir(fn)[1]
+ path = os.path.join(location, fn)
+ if not is_within_directory(location, path):
+ message = (
+ "The tar file ({}) has a file ({}) trying to install "
+ "outside target directory ({})"
+ )
+ raise InstallationError(message.format(filename, path, location))
+ if member.isdir():
+ ensure_dir(path)
+ elif member.issym():
+ try:
+ tar._extract_member(member, path)
+ except Exception as exc:
+ # Some corrupt tar files seem to produce this
+ # (specifically bad symlinks)
+ logger.warning(
+ "In the tar file %s the member %s is invalid: %s",
+ filename,
+ member.name,
+ exc,
+ )
+ continue
+ else:
+ try:
+ fp = tar.extractfile(member)
+ except (KeyError, AttributeError) as exc:
+ # Some corrupt tar files seem to produce this
+ # (specifically bad symlinks)
+ logger.warning(
+ "In the tar file %s the member %s is invalid: %s",
+ filename,
+ member.name,
+ exc,
+ )
+ continue
+ ensure_dir(os.path.dirname(path))
+ assert fp is not None
+ with open(path, "wb") as destfp:
+ shutil.copyfileobj(fp, destfp)
+ fp.close()
+ # Update the timestamp (useful for cython compiled files)
+ tar.utime(member, path)
+ # member have any execute permissions for user/group/world?
+ if member.mode & 0o111:
+ set_extracted_file_to_default_mode_plus_executable(path)
+
+
def unpack_file(
filename: str,
location: str,
diff --git a/contrib/python/pip/pip/_internal/utils/urls.py b/contrib/python/pip/pip/_internal/utils/urls.py
index 6ba2e04f35..9f34f882a1 100644
--- a/contrib/python/pip/pip/_internal/utils/urls.py
+++ b/contrib/python/pip/pip/_internal/utils/urls.py
@@ -2,17 +2,10 @@ import os
import string
import urllib.parse
import urllib.request
-from typing import Optional
from .compat import WINDOWS
-def get_url_scheme(url: str) -> Optional[str]:
- if ":" not in url:
- return None
- return url.split(":", 1)[0].lower()
-
-
def path_to_url(path: str) -> str:
"""
Convert a path to a file: URL. The path will be made absolute and have
diff --git a/contrib/python/pip/pip/_internal/utils/wheel.py b/contrib/python/pip/pip/_internal/utils/wheel.py
index 3551f8f19b..f85aee8a3f 100644
--- a/contrib/python/pip/pip/_internal/utils/wheel.py
+++ b/contrib/python/pip/pip/_internal/utils/wheel.py
@@ -28,7 +28,7 @@ def parse_wheel(wheel_zip: ZipFile, name: str) -> Tuple[str, Message]:
metadata = wheel_metadata(wheel_zip, info_dir)
version = wheel_version(metadata)
except UnsupportedWheel as e:
- raise UnsupportedWheel(f"{name} has an invalid wheel, {str(e)}")
+ raise UnsupportedWheel(f"{name} has an invalid wheel, {e}")
check_compatibility(version, name)
diff --git a/contrib/python/pip/pip/_internal/vcs/bazaar.py b/contrib/python/pip/pip/_internal/vcs/bazaar.py
index 20a17ed092..c754b7cc5c 100644
--- a/contrib/python/pip/pip/_internal/vcs/bazaar.py
+++ b/contrib/python/pip/pip/_internal/vcs/bazaar.py
@@ -44,13 +44,13 @@ class Bazaar(VersionControl):
display_path(dest),
)
if verbosity <= 0:
- flag = "--quiet"
+ flags = ["--quiet"]
elif verbosity == 1:
- flag = ""
+ flags = []
else:
- flag = f"-{'v'*verbosity}"
+ flags = [f"-{'v'*verbosity}"]
cmd_args = make_command(
- "checkout", "--lightweight", flag, rev_options.to_args(), url, dest
+ "checkout", "--lightweight", *flags, rev_options.to_args(), url, dest
)
self.run_command(cmd_args)
diff --git a/contrib/python/pip/pip/_internal/vcs/git.py b/contrib/python/pip/pip/_internal/vcs/git.py
index 8c242cf895..0425debb3a 100644
--- a/contrib/python/pip/pip/_internal/vcs/git.py
+++ b/contrib/python/pip/pip/_internal/vcs/git.py
@@ -4,6 +4,7 @@ import pathlib
import re
import urllib.parse
import urllib.request
+from dataclasses import replace
from typing import List, Optional, Tuple
from pip._internal.exceptions import BadCommand, InstallationError
@@ -217,7 +218,7 @@ class Git(VersionControl):
if sha is not None:
rev_options = rev_options.make_new(sha)
- rev_options.branch_name = rev if is_branch else None
+ rev_options = replace(rev_options, branch_name=(rev if is_branch else None))
return rev_options
diff --git a/contrib/python/pip/pip/_internal/vcs/subversion.py b/contrib/python/pip/pip/_internal/vcs/subversion.py
index 16d93a67b7..f359266d9c 100644
--- a/contrib/python/pip/pip/_internal/vcs/subversion.py
+++ b/contrib/python/pip/pip/_internal/vcs/subversion.py
@@ -288,12 +288,12 @@ class Subversion(VersionControl):
display_path(dest),
)
if verbosity <= 0:
- flag = "--quiet"
+ flags = ["--quiet"]
else:
- flag = ""
+ flags = []
cmd_args = make_command(
"checkout",
- flag,
+ *flags,
self.get_remote_call_options(),
rev_options.to_args(),
url,
diff --git a/contrib/python/pip/pip/_internal/vcs/versioncontrol.py b/contrib/python/pip/pip/_internal/vcs/versioncontrol.py
index 46ca2799b7..a4133165e9 100644
--- a/contrib/python/pip/pip/_internal/vcs/versioncontrol.py
+++ b/contrib/python/pip/pip/_internal/vcs/versioncontrol.py
@@ -5,13 +5,14 @@ import os
import shutil
import sys
import urllib.parse
+from dataclasses import dataclass, field
from typing import (
- TYPE_CHECKING,
Any,
Dict,
Iterable,
Iterator,
List,
+ Literal,
Mapping,
Optional,
Tuple,
@@ -37,14 +38,6 @@ from pip._internal.utils.subprocess import (
format_command_args,
make_command,
)
-from pip._internal.utils.urls import get_url_scheme
-
-if TYPE_CHECKING:
- # Literal was introduced in Python 3.8.
- #
- # TODO: Remove `if TYPE_CHECKING` when dropping support for Python 3.7.
- from typing import Literal
-
__all__ = ["vcs"]
@@ -58,8 +51,8 @@ def is_url(name: str) -> bool:
"""
Return true if the name looks like a URL.
"""
- scheme = get_url_scheme(name)
- if scheme is None:
+ scheme = urllib.parse.urlsplit(name).scheme
+ if not scheme:
return False
return scheme in ["http", "https", "file", "ftp"] + vcs.all_schemes
@@ -121,34 +114,22 @@ class RemoteNotValidError(Exception):
self.url = url
+@dataclass(frozen=True)
class RevOptions:
-
"""
Encapsulates a VCS-specific revision to install, along with any VCS
install options.
- Instances of this class should be treated as if immutable.
+ Args:
+ vc_class: a VersionControl subclass.
+ rev: the name of the revision to install.
+ extra_args: a list of extra options.
"""
- def __init__(
- self,
- vc_class: Type["VersionControl"],
- rev: Optional[str] = None,
- extra_args: Optional[CommandArgs] = None,
- ) -> None:
- """
- Args:
- vc_class: a VersionControl subclass.
- rev: the name of the revision to install.
- extra_args: a list of extra options.
- """
- if extra_args is None:
- extra_args = []
-
- self.extra_args = extra_args
- self.rev = rev
- self.vc_class = vc_class
- self.branch_name: Optional[str] = None
+ vc_class: Type["VersionControl"]
+ rev: Optional[str] = None
+ extra_args: CommandArgs = field(default_factory=list)
+ branch_name: Optional[str] = None
def __repr__(self) -> str:
return f"<RevOptions {self.vc_class.name}: rev={self.rev!r}>"
@@ -362,7 +343,7 @@ class VersionControl:
rev: the name of a revision to install.
extra_args: a list of extra options.
"""
- return RevOptions(cls, rev, extra_args=extra_args)
+ return RevOptions(cls, rev, extra_args=extra_args or [])
@classmethod
def _is_local_repository(cls, repo: str) -> bool:
@@ -660,6 +641,8 @@ class VersionControl:
log_failed_cmd=log_failed_cmd,
stdout_only=stdout_only,
)
+ except NotADirectoryError:
+ raise BadCommand(f"Cannot find command {cls.name!r} - invalid PATH")
except FileNotFoundError:
# errno.ENOENT = no such file or directory
# In other words, the VCS executable isn't available
diff --git a/contrib/python/pip/pip/_internal/wheel_builder.py b/contrib/python/pip/pip/_internal/wheel_builder.py
index b1debe3496..93f8e1f5b2 100644
--- a/contrib/python/pip/pip/_internal/wheel_builder.py
+++ b/contrib/python/pip/pip/_internal/wheel_builder.py
@@ -70,7 +70,7 @@ def _should_build(
if req.editable:
# we only build PEP 660 editable requirements
- return req.supports_pyproject_editable()
+ return req.supports_pyproject_editable
return True
diff --git a/contrib/python/pip/pip/_vendor/__init__.py b/contrib/python/pip/pip/_vendor/__init__.py
index c1884baf3d..50537ab9de 100644
--- a/contrib/python/pip/pip/_vendor/__init__.py
+++ b/contrib/python/pip/pip/_vendor/__init__.py
@@ -60,13 +60,8 @@ if DEBUNDLED:
# Actually alias all of our vendored dependencies.
vendored("cachecontrol")
vendored("certifi")
- vendored("colorama")
vendored("distlib")
vendored("distro")
- vendored("six")
- vendored("six.moves")
- vendored("six.moves.urllib")
- vendored("six.moves.urllib.parse")
vendored("packaging")
vendored("packaging.version")
vendored("packaging.specifiers")
diff --git a/contrib/python/pip/pip/_vendor/cachecontrol/__init__.py b/contrib/python/pip/pip/_vendor/cachecontrol/__init__.py
index 4d20bc9b12..b34b0fcbd4 100644
--- a/contrib/python/pip/pip/_vendor/cachecontrol/__init__.py
+++ b/contrib/python/pip/pip/_vendor/cachecontrol/__init__.py
@@ -8,7 +8,7 @@ Make it easy to import from cachecontrol without long namespaces.
"""
__author__ = "Eric Larson"
__email__ = "eric@ionrock.org"
-__version__ = "0.13.1"
+__version__ = "0.14.0"
from pip._vendor.cachecontrol.adapter import CacheControlAdapter
from pip._vendor.cachecontrol.controller import CacheController
diff --git a/contrib/python/pip/pip/_vendor/cachecontrol/adapter.py b/contrib/python/pip/pip/_vendor/cachecontrol/adapter.py
index 3e83e308db..fbb4ecc887 100644
--- a/contrib/python/pip/pip/_vendor/cachecontrol/adapter.py
+++ b/contrib/python/pip/pip/_vendor/cachecontrol/adapter.py
@@ -125,21 +125,21 @@ class CacheControlAdapter(HTTPAdapter):
else:
# Wrap the response file with a wrapper that will cache the
# response when the stream has been consumed.
- response._fp = CallbackFileWrapper( # type: ignore[attr-defined]
- response._fp, # type: ignore[attr-defined]
+ response._fp = CallbackFileWrapper( # type: ignore[assignment]
+ response._fp, # type: ignore[arg-type]
functools.partial(
self.controller.cache_response, request, response
),
)
if response.chunked:
- super_update_chunk_length = response._update_chunk_length # type: ignore[attr-defined]
+ super_update_chunk_length = response._update_chunk_length
def _update_chunk_length(self: HTTPResponse) -> None:
super_update_chunk_length()
if self.chunk_left == 0:
- self._fp._close() # type: ignore[attr-defined]
+ self._fp._close() # type: ignore[union-attr]
- response._update_chunk_length = types.MethodType( # type: ignore[attr-defined]
+ response._update_chunk_length = types.MethodType( # type: ignore[method-assign]
_update_chunk_length, response
)
diff --git a/contrib/python/pip/pip/_vendor/cachecontrol/caches/file_cache.py b/contrib/python/pip/pip/_vendor/cachecontrol/caches/file_cache.py
index 1fd2801308..e6e3a57947 100644
--- a/contrib/python/pip/pip/_vendor/cachecontrol/caches/file_cache.py
+++ b/contrib/python/pip/pip/_vendor/cachecontrol/caches/file_cache.py
@@ -6,7 +6,8 @@ from __future__ import annotations
import hashlib
import os
from textwrap import dedent
-from typing import IO, TYPE_CHECKING
+from typing import IO, TYPE_CHECKING, Union
+from pathlib import Path
from pip._vendor.cachecontrol.cache import BaseCache, SeparateBodyBaseCache
from pip._vendor.cachecontrol.controller import CacheController
@@ -63,7 +64,7 @@ class _FileCacheMixin:
def __init__(
self,
- directory: str,
+ directory: str | Path,
forever: bool = False,
filemode: int = 0o0600,
dirmode: int = 0o0700,
@@ -79,7 +80,7 @@ class _FileCacheMixin:
"""
NOTE: In order to use the FileCache you must have
filelock installed. You can install it via pip:
- pip install filelock
+ pip install cachecontrol[filecache]
"""
)
raise ImportError(notice)
diff --git a/contrib/python/pip/pip/_vendor/cachecontrol/controller.py b/contrib/python/pip/pip/_vendor/cachecontrol/controller.py
index 586b9f97b8..d7dd86e5f7 100644
--- a/contrib/python/pip/pip/_vendor/cachecontrol/controller.py
+++ b/contrib/python/pip/pip/_vendor/cachecontrol/controller.py
@@ -142,6 +142,11 @@ class CacheController:
"""
Load a cached response, or return None if it's not available.
"""
+ # We do not support caching of partial content: so if the request contains a
+ # Range header then we don't want to load anything from the cache.
+ if "Range" in request.headers:
+ return None
+
cache_url = request.url
assert cache_url is not None
cache_data = self.cache.get(cache_url)
@@ -480,7 +485,7 @@ class CacheController:
cached_response.headers.update(
{
k: v
- for k, v in response.headers.items() # type: ignore[no-untyped-call]
+ for k, v in response.headers.items()
if k.lower() not in excluded_headers
}
)
diff --git a/contrib/python/pip/pip/_vendor/cachecontrol/heuristics.py b/contrib/python/pip/pip/_vendor/cachecontrol/heuristics.py
index b9d72ca4ac..f6e5634e38 100644
--- a/contrib/python/pip/pip/_vendor/cachecontrol/heuristics.py
+++ b/contrib/python/pip/pip/_vendor/cachecontrol/heuristics.py
@@ -68,7 +68,7 @@ class OneDayCache(BaseHeuristic):
if "expires" not in response.headers:
date = parsedate(response.headers["date"])
- expires = expire_after(timedelta(days=1), date=datetime(*date[:6], tzinfo=timezone.utc)) # type: ignore[misc]
+ expires = expire_after(timedelta(days=1), date=datetime(*date[:6], tzinfo=timezone.utc)) # type: ignore[index,misc]
headers["expires"] = datetime_to_header(expires)
headers["cache-control"] = "public"
return headers
diff --git a/contrib/python/pip/pip/_vendor/cachecontrol/serialize.py b/contrib/python/pip/pip/_vendor/cachecontrol/serialize.py
index f9e967c3c3..a49487a149 100644
--- a/contrib/python/pip/pip/_vendor/cachecontrol/serialize.py
+++ b/contrib/python/pip/pip/_vendor/cachecontrol/serialize.py
@@ -32,13 +32,13 @@ class Serializer:
# also update the response with a new file handler to be
# sure it acts as though it was never read.
body = response.read(decode_content=False)
- response._fp = io.BytesIO(body) # type: ignore[attr-defined]
+ response._fp = io.BytesIO(body) # type: ignore[assignment]
response.length_remaining = len(body)
data = {
"response": {
"body": body, # Empty bytestring if body is stored separately
- "headers": {str(k): str(v) for k, v in response.headers.items()}, # type: ignore[no-untyped-call]
+ "headers": {str(k): str(v) for k, v in response.headers.items()},
"status": response.status,
"version": response.version,
"reason": str(response.reason),
@@ -72,31 +72,14 @@ class Serializer:
if not data:
return None
- # Determine what version of the serializer the data was serialized
- # with
- try:
- ver, data = data.split(b",", 1)
- except ValueError:
- ver = b"cc=0"
-
- # Make sure that our "ver" is actually a version and isn't a false
- # positive from a , being in the data stream.
- if ver[:3] != b"cc=":
- data = ver + data
- ver = b"cc=0"
-
- # Get the version number out of the cc=N
- verstr = ver.split(b"=", 1)[-1].decode("ascii")
-
- # Dispatch to the actual load method for the given version
- try:
- return getattr(self, f"_loads_v{verstr}")(request, data, body_file) # type: ignore[no-any-return]
-
- except AttributeError:
- # This is a version we don't have a loads function for, so we'll
- # just treat it as a miss and return None
+ # Previous versions of this library supported other serialization
+ # formats, but these have all been removed.
+ if not data.startswith(f"cc={self.serde_version},".encode()):
return None
+ data = data[5:]
+ return self._loads_v4(request, data, body_file)
+
def prepare_response(
self,
request: PreparedRequest,
@@ -149,49 +132,6 @@ class Serializer:
return HTTPResponse(body=body, preload_content=False, **cached["response"])
- def _loads_v0(
- self,
- request: PreparedRequest,
- data: bytes,
- body_file: IO[bytes] | None = None,
- ) -> None:
- # The original legacy cache data. This doesn't contain enough
- # information to construct everything we need, so we'll treat this as
- # a miss.
- return None
-
- def _loads_v1(
- self,
- request: PreparedRequest,
- data: bytes,
- body_file: IO[bytes] | None = None,
- ) -> HTTPResponse | None:
- # The "v1" pickled cache format. This is no longer supported
- # for security reasons, so we treat it as a miss.
- return None
-
- def _loads_v2(
- self,
- request: PreparedRequest,
- data: bytes,
- body_file: IO[bytes] | None = None,
- ) -> HTTPResponse | None:
- # The "v2" compressed base64 cache format.
- # This has been removed due to age and poor size/performance
- # characteristics, so we treat it as a miss.
- return None
-
- def _loads_v3(
- self,
- request: PreparedRequest,
- data: bytes,
- body_file: IO[bytes] | None = None,
- ) -> None:
- # Due to Python 2 encoding issues, it's impossible to know for sure
- # exactly how to load v3 entries, thus we'll treat these as a miss so
- # that they get rewritten out as v4 entries.
- return None
-
def _loads_v4(
self,
request: PreparedRequest,
diff --git a/contrib/python/pip/pip/_vendor/certifi/__init__.py b/contrib/python/pip/pip/_vendor/certifi/__init__.py
index 8ce89cef70..1c91f3ec93 100644
--- a/contrib/python/pip/pip/_vendor/certifi/__init__.py
+++ b/contrib/python/pip/pip/_vendor/certifi/__init__.py
@@ -1,4 +1,4 @@
from .core import contents, where
__all__ = ["contents", "where"]
-__version__ = "2023.07.22"
+__version__ = "2024.02.02"
diff --git a/contrib/python/pip/pip/_vendor/certifi/cacert.pem b/contrib/python/pip/pip/_vendor/certifi/cacert.pem
index 02123695d0..fac3c31909 100644
--- a/contrib/python/pip/pip/_vendor/certifi/cacert.pem
+++ b/contrib/python/pip/pip/_vendor/certifi/cacert.pem
@@ -245,34 +245,6 @@ mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK
4SVhM7JZG+Ju1zdXtg2pEto=
-----END CERTIFICATE-----
-# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1
-# Subject: O=SECOM Trust.net OU=Security Communication RootCA1
-# Label: "Security Communication Root CA"
-# Serial: 0
-# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a
-# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7
-# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c
------BEGIN CERTIFICATE-----
-MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY
-MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t
-dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5
-WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD
-VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8
-9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ
-DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9
-Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N
-QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ
-xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G
-A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T
-AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG
-kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr
-Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5
-Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU
-JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot
-RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw==
------END CERTIFICATE-----
-
# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
# Label: "XRamp Global CA Root"
@@ -881,49 +853,6 @@ Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
WD9f
-----END CERTIFICATE-----
-# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
-# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
-# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068"
-# Serial: 6047274297262753887
-# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3
-# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa
-# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef
------BEGIN CERTIFICATE-----
-MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE
-BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h
-cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy
-MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg
-Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi
-MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9
-thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM
-cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG
-L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i
-NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h
-X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b
-m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy
-Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja
-EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T
-KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF
-6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh
-OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD
-VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD
-VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
-cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv
-ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl
-AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF
-661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9
-am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1
-ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481
-PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS
-3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k
-SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF
-3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM
-ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g
-StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz
-Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB
-jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
------END CERTIFICATE-----
-
# Issuer: CN=Izenpe.com O=IZENPE S.A.
# Subject: CN=Izenpe.com O=IZENPE S.A.
# Label: "Izenpe.com"
@@ -4633,3 +4562,253 @@ o7Ey7Nmj1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5
dDTedk+SKlOxJTnbPP/lPqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcE
oji2jbDwN/zIIX8/syQbPYtuzE2wFg2WHYMfRsCbvUOZ58SWLs5fyQ==
-----END CERTIFICATE-----
+
+# Issuer: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc.
+# Subject: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc.
+# Label: "TrustAsia Global Root CA G3"
+# Serial: 576386314500428537169965010905813481816650257167
+# MD5 Fingerprint: 30:42:1b:b7:bb:81:75:35:e4:16:4f:53:d2:94:de:04
+# SHA1 Fingerprint: 63:cf:b6:c1:27:2b:56:e4:88:8e:1c:23:9a:b6:2e:81:47:24:c3:c7
+# SHA256 Fingerprint: e0:d3:22:6a:eb:11:63:c2:e4:8f:f9:be:3b:50:b4:c6:43:1b:e7:bb:1e:ac:c5:c3:6b:5d:5e:c5:09:03:9a:08
+-----BEGIN CERTIFICATE-----
+MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEM
+BQAwWjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dp
+ZXMsIEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAe
+Fw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEwMTlaMFoxCzAJBgNVBAYTAkNOMSUw
+IwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtU
+cnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNS
+T1QY4SxzlZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqK
+AtCWHwDNBSHvBm3dIZwZQ0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1
+nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/VP68czH5GX6zfZBCK70bwkPAPLfSIC7Ep
+qq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1AgdB4SQXMeJNnKziyhWTXA
+yB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm9WAPzJMs
+hH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gX
+zhqcD0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAv
+kV34PmVACxmZySYgWmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msT
+f9FkPz2ccEblooV7WIQn3MSAPmeamseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jA
+uPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCFTIcQcf+eQxuulXUtgQIDAQAB
+o2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj7zjKsK5Xf/Ih
+MBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E
+BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4
+wM8zAQLpw6o1D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2
+XFNFV1pF1AWZLy4jVe5jaN/TG3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1
+JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNjduMNhXJEIlU/HHzp/LgV6FL6qj6j
+ITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstlcHboCoWASzY9M/eV
+VHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys+TIx
+xHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1on
+AX1daBli2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d
+7XB4tmBZrOFdRWOPyN9yaFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2Ntjj
+gKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsASZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV
++Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFRJQJ6+N1rZdVtTTDIZbpo
+FGWsJwt0ivKH
+-----END CERTIFICATE-----
+
+# Issuer: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc.
+# Subject: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc.
+# Label: "TrustAsia Global Root CA G4"
+# Serial: 451799571007117016466790293371524403291602933463
+# MD5 Fingerprint: 54:dd:b2:d7:5f:d8:3e:ed:7c:e0:0b:2e:cc:ed:eb:eb
+# SHA1 Fingerprint: 57:73:a5:61:5d:80:b2:e6:ac:38:82:fc:68:07:31:ac:9f:b5:92:5a
+# SHA256 Fingerprint: be:4b:56:cb:50:56:c0:13:6a:52:6d:f4:44:50:8d:aa:36:a0:b5:4f:42:e4:ac:38:f7:2a:f4:70:e4:79:65:4c
+-----BEGIN CERTIFICATE-----
+MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMw
+WjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs
+IEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0y
+MTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJaMFoxCzAJBgNVBAYTAkNOMSUwIwYD
+VQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtUcnVz
+dEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATx
+s8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbw
+LxYI+hW8m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJij
+YzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mD
+pm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/pDHel4NZg6ZvccveMA4GA1UdDwEB/wQE
+AwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AAbbd+NvBNEU/zy4k6LHiR
+UKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xkdUfFVZDj
+/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=CommScope Public Trust ECC Root-01 O=CommScope
+# Subject: CN=CommScope Public Trust ECC Root-01 O=CommScope
+# Label: "CommScope Public Trust ECC Root-01"
+# Serial: 385011430473757362783587124273108818652468453534
+# MD5 Fingerprint: 3a:40:a7:fc:03:8c:9c:38:79:2f:3a:a2:6c:b6:0a:16
+# SHA1 Fingerprint: 07:86:c0:d8:dd:8e:c0:80:98:06:98:d0:58:7a:ef:de:a6:cc:a2:5d
+# SHA256 Fingerprint: 11:43:7c:da:7b:b4:5e:41:36:5f:45:b3:9a:38:98:6b:0d:e0:0d:ef:34:8e:0c:7b:b0:87:36:33:80:0b:c3:8b
+-----BEGIN CERTIFICATE-----
+MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMw
+TjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29t
+bVNjb3BlIFB1YmxpYyBUcnVzdCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNa
+Fw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2Nv
+cGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDEw
+djAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLxeP0C
+flfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJE
+hRGnSjot6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
+VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggq
+hkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg
+2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liWpDVfG2XqYZpwI7UNo5uS
+Um9poIyNStDuiw7LR47QjRE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=CommScope Public Trust ECC Root-02 O=CommScope
+# Subject: CN=CommScope Public Trust ECC Root-02 O=CommScope
+# Label: "CommScope Public Trust ECC Root-02"
+# Serial: 234015080301808452132356021271193974922492992893
+# MD5 Fingerprint: 59:b0:44:d5:65:4d:b8:5c:55:19:92:02:b6:d1:94:b2
+# SHA1 Fingerprint: 3c:3f:ef:57:0f:fe:65:93:86:9e:a0:fe:b0:f6:ed:8e:d1:13:c7:e5
+# SHA256 Fingerprint: 2f:fb:7f:81:3b:bb:b3:c8:9a:b4:e8:16:2d:0f:16:d7:15:09:a8:30:cc:9d:73:c2:62:e5:14:08:75:d1:ad:4a
+-----BEGIN CERTIFICATE-----
+MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMw
+TjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29t
+bVNjb3BlIFB1YmxpYyBUcnVzdCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRa
+Fw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2Nv
+cGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDIw
+djAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/MMDAL
+j2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmU
+v4RDsNuESgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
+VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggq
+hkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/n
+ich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs73u1Z/GtMMH9ZzkXpc2AV
+mkzw5l4lIhVtwodZ0LKOag==
+-----END CERTIFICATE-----
+
+# Issuer: CN=CommScope Public Trust RSA Root-01 O=CommScope
+# Subject: CN=CommScope Public Trust RSA Root-01 O=CommScope
+# Label: "CommScope Public Trust RSA Root-01"
+# Serial: 354030733275608256394402989253558293562031411421
+# MD5 Fingerprint: 0e:b4:15:bc:87:63:5d:5d:02:73:d4:26:38:68:73:d8
+# SHA1 Fingerprint: 6d:0a:5f:f7:b4:23:06:b4:85:b3:b7:97:64:fc:ac:75:f5:33:f2:93
+# SHA256 Fingerprint: 02:bd:f9:6e:2a:45:dd:9b:f1:8f:c7:e1:db:df:21:a0:37:9b:a3:c9:c2:61:03:44:cf:d8:d6:06:fe:c1:ed:81
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQEL
+BQAwTjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwi
+Q29tbVNjb3BlIFB1YmxpYyBUcnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1
+NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21t
+U2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFJvb3Qt
+MDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45FtnYSk
+YZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslh
+suitQDy6uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0al
+DrJLpA6lfO741GIDuZNqihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3Oj
+WiE260f6GBfZumbCk6SP/F2krfxQapWsvCQz0b2If4b19bJzKo98rwjyGpg/qYFl
+P8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/cZip8UlF1y5mO6D1cv547
+KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTifBSeolz7p
+UcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/
+kQO9lLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JO
+Hg9O5j9ZpSPcPYeoKFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkB
+Ea801M/XrmLTBQe0MXXgDW1XT2mH+VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6U
+CBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm45P3luG0wDQYJ
+KoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6
+NWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQ
+nmhUQo8mUuJM3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+
+QgvfKNmwrZggvkN80V4aCRckjXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2v
+trV0KnahP/t1MJ+UXjulYPPLXAziDslg+MkfFoom3ecnf+slpoq9uC02EJqxWE2a
+aE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/WNyVntHKLr4W96ioD
+j8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+o/E4
+Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0w
+lREQKC6/oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHn
+YfkUyq+Dj7+vsQpZXdxc1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVoc
+icCMb3SgazNNtQEo/a2tiRc7ppqEvOuM6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw
+-----END CERTIFICATE-----
+
+# Issuer: CN=CommScope Public Trust RSA Root-02 O=CommScope
+# Subject: CN=CommScope Public Trust RSA Root-02 O=CommScope
+# Label: "CommScope Public Trust RSA Root-02"
+# Serial: 480062499834624527752716769107743131258796508494
+# MD5 Fingerprint: e1:29:f9:62:7b:76:e2:96:6d:f3:d4:d7:0f:ae:1f:aa
+# SHA1 Fingerprint: ea:b0:e2:52:1b:89:93:4c:11:68:f2:d8:9a:ac:22:4c:a3:8a:57:ae
+# SHA256 Fingerprint: ff:e9:43:d7:93:42:4b:4f:7c:44:0c:1c:3d:64:8d:53:63:f3:4b:82:dc:87:aa:7a:9f:11:8f:c5:de:e1:01:f1
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQEL
+BQAwTjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwi
+Q29tbVNjb3BlIFB1YmxpYyBUcnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2
+NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21t
+U2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFJvb3Qt
+MDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3VrCLE
+NQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0
+kyI9p+Kx7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1C
+rWDaSWqVcN3SAOLMV2MCe5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxz
+hkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2WWy09X6GDRl224yW4fKcZgBzqZUPckXk2
+LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rpM9kzXzehxfCrPfp4sOcs
+n/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIfhs1w/tku
+FT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5
+kQMreyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3
+wNemKfrb3vOTlycEVS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6v
+wQcQeKwRoi9C8DfF8rhW3Q5iLc4tVn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs
+5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7GxcJXvYXowDQYJ
+KoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB
+KCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3
++VGXu6TwYofF1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbyme
+APnCKfWxkxlSaRosTKCL4BWaMS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3Nyq
+pgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xdgSGn2rtO/+YHqP65DSdsu3BaVXoT
+6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2OHG1QAk8mGEPej1WF
+sQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+NmYWvt
+PjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2d
+lklyALKrdVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670
+v64fG9PiO/yzcnMcmyiQiRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17O
+rg3bhzjlP1v9mxnhMUF6cKojawHhRUzNlM47ni3niAIi9G7oyOzWPPO5std3eqx7
+-----END CERTIFICATE-----
+
+# Issuer: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH
+# Subject: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH
+# Label: "Telekom Security TLS ECC Root 2020"
+# Serial: 72082518505882327255703894282316633856
+# MD5 Fingerprint: c1:ab:fe:6a:10:2c:03:8d:bc:1c:22:32:c0:85:a7:fd
+# SHA1 Fingerprint: c0:f8:96:c5:a9:3b:01:06:21:07:da:18:42:48:bc:e9:9d:88:d5:ec
+# SHA256 Fingerprint: 57:8a:f4:de:d0:85:3f:4e:59:98:db:4a:ea:f9:cb:ea:8d:94:5f:60:b6:20:a3:8d:1a:3c:13:b2:bc:7b:a8:e1
+-----BEGIN CERTIFICATE-----
+MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQsw
+CQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBH
+bWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIw
+MB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIzNTk1OVowYzELMAkGA1UEBhMCREUx
+JzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkGA1UE
+AwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqGSM49
+AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/O
+tdKPD/M12kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDP
+f8iAC8GXs7s1J8nCG6NCMEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6f
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cA
+MGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZMo7k+5Dck2TOrbRBR2Di
+z6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdUga/sf+Rn
+27iQ7t0l
+-----END CERTIFICATE-----
+
+# Issuer: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH
+# Subject: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH
+# Label: "Telekom Security TLS RSA Root 2023"
+# Serial: 44676229530606711399881795178081572759
+# MD5 Fingerprint: bf:5b:eb:54:40:cd:48:71:c4:20:8d:7d:de:0a:42:f2
+# SHA1 Fingerprint: 54:d3:ac:b3:bd:57:56:f6:85:9d:ce:e5:c3:21:e2:d4:ad:83:d0:93
+# SHA256 Fingerprint: ef:c6:5c:ad:bb:59:ad:b6:ef:e8:4d:a2:23:11:b3:56:24:b7:1b:3b:1e:a0:da:8b:66:55:17:4e:c8:97:86:46
+-----BEGIN CERTIFICATE-----
+MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBj
+MQswCQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0
+eSBHbWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAy
+MDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMyNzIzNTk1OVowYzELMAkGA1UEBhMC
+REUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkG
+A1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIwDQYJ
+KoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9
+cUD/h3VCKSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHV
+cp6R+SPWcHu79ZvB7JPPGeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMA
+U6DksquDOFczJZSfvkgdmOGjup5czQRxUX11eKvzWarE4GC+j4NSuHUaQTXtvPM6
+Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWol8hHD/BeEIvnHRz+sTug
+BTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9FIS3R/qy
+8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73J
+co4vzLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg
+8qKrBC7m8kwOFjQgrIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8
+rFEz0ciD0cmfHdRHNCk+y7AO+oMLKFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12
+mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7SWWO/gLCMk3PLNaaZlSJhZQNg
++y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtqeX
+gj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2
+p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQ
+pGv7qHBFfLp+sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm
+9S3ul0A8Yute1hTWjOKWi0FpkzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErw
+M807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy/SKE8YXJN3nptT+/XOR0so8RYgDd
+GGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4mZqTuXNnQkYRIer+
+CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtzaL1t
+xKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+
+w6jv/naaoqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aK
+L4x35bcF7DvB7L6Gs4a8wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+lj
+X273CXE2whJdV/LItM3z7gLfEdxquVeEHVlNjM7IDiPCtyaaEBRx/pOyiriA8A4Q
+ntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0o82bNSQ3+pCTE4FCxpgm
+dTdmQRCsu/WU48IxK63nI1bMNSWSs1A=
+-----END CERTIFICATE-----
diff --git a/contrib/python/pip/pip/_vendor/certifi/core.py b/contrib/python/pip/pip/_vendor/certifi/core.py
index c3e546604c..70e0c3bdbd 100644
--- a/contrib/python/pip/pip/_vendor/certifi/core.py
+++ b/contrib/python/pip/pip/_vendor/certifi/core.py
@@ -5,6 +5,10 @@ certifi.py
This module returns the installation location of cacert.pem or its contents.
"""
import sys
+import atexit
+
+def exit_cacert_ctx() -> None:
+ _CACERT_CTX.__exit__(None, None, None) # type: ignore[union-attr]
if sys.version_info >= (3, 11):
@@ -35,6 +39,7 @@ if sys.version_info >= (3, 11):
# we will also store that at the global level as well.
_CACERT_CTX = as_file(files("pip._vendor.certifi").joinpath("cacert.pem"))
_CACERT_PATH = str(_CACERT_CTX.__enter__())
+ atexit.register(exit_cacert_ctx)
return _CACERT_PATH
@@ -70,6 +75,7 @@ elif sys.version_info >= (3, 7):
# we will also store that at the global level as well.
_CACERT_CTX = get_path("pip._vendor.certifi", "cacert.pem")
_CACERT_PATH = str(_CACERT_CTX.__enter__())
+ atexit.register(exit_cacert_ctx)
return _CACERT_PATH
diff --git a/contrib/python/pip/pip/_vendor/chardet/__init__.py b/contrib/python/pip/pip/_vendor/chardet/__init__.py
deleted file mode 100644
index fe581623d8..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/__init__.py
+++ /dev/null
@@ -1,115 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import List, Union
-
-from .charsetgroupprober import CharSetGroupProber
-from .charsetprober import CharSetProber
-from .enums import InputState
-from .resultdict import ResultDict
-from .universaldetector import UniversalDetector
-from .version import VERSION, __version__
-
-__all__ = ["UniversalDetector", "detect", "detect_all", "__version__", "VERSION"]
-
-
-def detect(
- byte_str: Union[bytes, bytearray], should_rename_legacy: bool = False
-) -> ResultDict:
- """
- Detect the encoding of the given byte string.
-
- :param byte_str: The byte sequence to examine.
- :type byte_str: ``bytes`` or ``bytearray``
- :param should_rename_legacy: Should we rename legacy encodings
- to their more modern equivalents?
- :type should_rename_legacy: ``bool``
- """
- if not isinstance(byte_str, bytearray):
- if not isinstance(byte_str, bytes):
- raise TypeError(
- f"Expected object of type bytes or bytearray, got: {type(byte_str)}"
- )
- byte_str = bytearray(byte_str)
- detector = UniversalDetector(should_rename_legacy=should_rename_legacy)
- detector.feed(byte_str)
- return detector.close()
-
-
-def detect_all(
- byte_str: Union[bytes, bytearray],
- ignore_threshold: bool = False,
- should_rename_legacy: bool = False,
-) -> List[ResultDict]:
- """
- Detect all the possible encodings of the given byte string.
-
- :param byte_str: The byte sequence to examine.
- :type byte_str: ``bytes`` or ``bytearray``
- :param ignore_threshold: Include encodings that are below
- ``UniversalDetector.MINIMUM_THRESHOLD``
- in results.
- :type ignore_threshold: ``bool``
- :param should_rename_legacy: Should we rename legacy encodings
- to their more modern equivalents?
- :type should_rename_legacy: ``bool``
- """
- if not isinstance(byte_str, bytearray):
- if not isinstance(byte_str, bytes):
- raise TypeError(
- f"Expected object of type bytes or bytearray, got: {type(byte_str)}"
- )
- byte_str = bytearray(byte_str)
-
- detector = UniversalDetector(should_rename_legacy=should_rename_legacy)
- detector.feed(byte_str)
- detector.close()
-
- if detector.input_state == InputState.HIGH_BYTE:
- results: List[ResultDict] = []
- probers: List[CharSetProber] = []
- for prober in detector.charset_probers:
- if isinstance(prober, CharSetGroupProber):
- probers.extend(p for p in prober.probers)
- else:
- probers.append(prober)
- for prober in probers:
- if ignore_threshold or prober.get_confidence() > detector.MINIMUM_THRESHOLD:
- charset_name = prober.charset_name or ""
- lower_charset_name = charset_name.lower()
- # Use Windows encoding name instead of ISO-8859 if we saw any
- # extra Windows-specific bytes
- if lower_charset_name.startswith("iso-8859") and detector.has_win_bytes:
- charset_name = detector.ISO_WIN_MAP.get(
- lower_charset_name, charset_name
- )
- # Rename legacy encodings with superset encodings if asked
- if should_rename_legacy:
- charset_name = detector.LEGACY_MAP.get(
- charset_name.lower(), charset_name
- )
- results.append(
- {
- "encoding": charset_name,
- "confidence": prober.get_confidence(),
- "language": prober.language,
- }
- )
- if len(results) > 0:
- return sorted(results, key=lambda result: -result["confidence"])
-
- return [detector.result]
diff --git a/contrib/python/pip/pip/_vendor/chardet/big5freq.py b/contrib/python/pip/pip/_vendor/chardet/big5freq.py
deleted file mode 100644
index 87d9f972ed..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/big5freq.py
+++ /dev/null
@@ -1,386 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-# Big5 frequency table
-# by Taiwan's Mandarin Promotion Council
-# <http://www.edu.tw:81/mandr/>
-#
-# 128 --> 0.42261
-# 256 --> 0.57851
-# 512 --> 0.74851
-# 1024 --> 0.89384
-# 2048 --> 0.97583
-#
-# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98
-# Random Distribution Ration = 512/(5401-512)=0.105
-#
-# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
-
-BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75
-
-# Char to FreqOrder table
-BIG5_TABLE_SIZE = 5376
-# fmt: off
-BIG5_CHAR_TO_FREQ_ORDER = (
- 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16
-3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32
-1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48
- 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64
-3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80
-4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96
-5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112
- 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128
- 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144
- 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160
-2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176
-1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192
-3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208
- 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224
-1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240
-3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256
-2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272
- 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288
-3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304
-1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320
-5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336
- 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352
-5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368
-1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384
- 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400
- 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416
-3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432
-3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448
- 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464
-2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480
-2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496
- 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512
- 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528
-3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544
-1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560
-1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576
-1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592
-2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608
- 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624
-4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640
-1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656
-5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672
-2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688
- 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704
- 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720
- 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736
- 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752
-5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768
- 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784
-1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800
- 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816
- 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832
-5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848
-1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864
- 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880
-3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896
-4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912
-3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928
- 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944
- 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960
-1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976
-4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992
-3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008
-3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024
-2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040
-5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056
-3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072
-5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088
-1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104
-2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120
-1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136
- 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152
-1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168
-4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184
-3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200
- 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216
- 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232
- 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248
-2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264
-5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280
-1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296
-2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312
-1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328
-1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344
-5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360
-5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376
-5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392
-3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408
-4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424
-4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440
-2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456
-5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472
-3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488
- 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504
-5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520
-5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536
-1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552
-2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568
-3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584
-4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600
-5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616
-3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632
-4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648
-1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664
-1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680
-4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696
-1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712
- 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728
-1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744
-1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760
-3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776
- 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792
-5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808
-2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824
-1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840
-1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856
-5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872
- 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888
-4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904
- 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920
-2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936
- 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952
-1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968
-1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984
- 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000
-4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016
-4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032
-1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048
-3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064
-5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080
-5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096
-1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112
-2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128
-1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144
-3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160
-2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176
-3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192
-2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208
-4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224
-4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240
-3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256
- 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272
-3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288
- 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304
-3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320
-4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336
-3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352
-1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368
-5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384
- 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400
-5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416
-1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432
- 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448
-4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464
-4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480
- 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496
-2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512
-2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528
-3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544
-1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560
-4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576
-2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592
-1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608
-1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624
-2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640
-3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656
-1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672
-5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688
-1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704
-4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720
-1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736
- 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752
-1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768
-4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784
-4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800
-2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816
-1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832
-4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848
- 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864
-5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880
-2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896
-3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912
-4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928
- 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944
-5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960
-5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976
-1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992
-4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008
-4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024
-2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040
-3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056
-3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072
-2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088
-1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104
-4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120
-3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136
-3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152
-2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168
-4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184
-5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200
-3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216
-2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232
-3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248
-1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264
-2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280
-3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296
-4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312
-2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328
-2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344
-5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360
-1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376
-2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392
-1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408
-3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424
-4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440
-2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456
-3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472
-3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488
-2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504
-4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520
-2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536
-3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552
-4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568
-5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584
-3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600
- 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616
-1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632
-4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648
-1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664
-4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680
-5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696
- 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712
-5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728
-5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744
-2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760
-3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776
-2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792
-2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808
- 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824
-1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840
-4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856
-3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872
-3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888
- 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904
-2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920
- 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936
-2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952
-4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968
-1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984
-4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000
-1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016
-3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032
- 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048
-3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064
-5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080
-5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096
-3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112
-3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128
-1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144
-2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160
-5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176
-1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192
-1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208
-3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224
- 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240
-1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256
-4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272
-5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288
-2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304
-3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320
- 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336
-1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352
-2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368
-2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384
-5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400
-5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416
-5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432
-2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448
-2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464
-1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480
-4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496
-3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512
-3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528
-4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544
-4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560
-2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576
-2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592
-5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608
-4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624
-5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640
-4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656
- 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672
- 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688
-1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704
-3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720
-4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736
-1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752
-5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768
-2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784
-2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800
-3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816
-5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832
-1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848
-3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864
-5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880
-1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896
-5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912
-2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928
-3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944
-2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960
-3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976
-3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992
-3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008
-4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024
- 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040
-2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056
-4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072
-3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088
-5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104
-1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120
-5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136
- 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152
-1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168
- 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184
-4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200
-1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216
-4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232
-1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248
- 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264
-3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280
-4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296
-5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312
- 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328
-3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344
- 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360
-2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376
-)
-# fmt: on
diff --git a/contrib/python/pip/pip/_vendor/chardet/big5prober.py b/contrib/python/pip/pip/_vendor/chardet/big5prober.py
deleted file mode 100644
index ef09c60e32..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/big5prober.py
+++ /dev/null
@@ -1,47 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .chardistribution import Big5DistributionAnalysis
-from .codingstatemachine import CodingStateMachine
-from .mbcharsetprober import MultiByteCharSetProber
-from .mbcssm import BIG5_SM_MODEL
-
-
-class Big5Prober(MultiByteCharSetProber):
- def __init__(self) -> None:
- super().__init__()
- self.coding_sm = CodingStateMachine(BIG5_SM_MODEL)
- self.distribution_analyzer = Big5DistributionAnalysis()
- self.reset()
-
- @property
- def charset_name(self) -> str:
- return "Big5"
-
- @property
- def language(self) -> str:
- return "Chinese"
diff --git a/contrib/python/pip/pip/_vendor/chardet/chardistribution.py b/contrib/python/pip/pip/_vendor/chardet/chardistribution.py
deleted file mode 100644
index 176cb99640..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/chardistribution.py
+++ /dev/null
@@ -1,261 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import Tuple, Union
-
-from .big5freq import (
- BIG5_CHAR_TO_FREQ_ORDER,
- BIG5_TABLE_SIZE,
- BIG5_TYPICAL_DISTRIBUTION_RATIO,
-)
-from .euckrfreq import (
- EUCKR_CHAR_TO_FREQ_ORDER,
- EUCKR_TABLE_SIZE,
- EUCKR_TYPICAL_DISTRIBUTION_RATIO,
-)
-from .euctwfreq import (
- EUCTW_CHAR_TO_FREQ_ORDER,
- EUCTW_TABLE_SIZE,
- EUCTW_TYPICAL_DISTRIBUTION_RATIO,
-)
-from .gb2312freq import (
- GB2312_CHAR_TO_FREQ_ORDER,
- GB2312_TABLE_SIZE,
- GB2312_TYPICAL_DISTRIBUTION_RATIO,
-)
-from .jisfreq import (
- JIS_CHAR_TO_FREQ_ORDER,
- JIS_TABLE_SIZE,
- JIS_TYPICAL_DISTRIBUTION_RATIO,
-)
-from .johabfreq import JOHAB_TO_EUCKR_ORDER_TABLE
-
-
-class CharDistributionAnalysis:
- ENOUGH_DATA_THRESHOLD = 1024
- SURE_YES = 0.99
- SURE_NO = 0.01
- MINIMUM_DATA_THRESHOLD = 3
-
- def __init__(self) -> None:
- # Mapping table to get frequency order from char order (get from
- # GetOrder())
- self._char_to_freq_order: Tuple[int, ...] = tuple()
- self._table_size = 0 # Size of above table
- # This is a constant value which varies from language to language,
- # used in calculating confidence. See
- # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html
- # for further detail.
- self.typical_distribution_ratio = 0.0
- self._done = False
- self._total_chars = 0
- self._freq_chars = 0
- self.reset()
-
- def reset(self) -> None:
- """reset analyser, clear any state"""
- # If this flag is set to True, detection is done and conclusion has
- # been made
- self._done = False
- self._total_chars = 0 # Total characters encountered
- # The number of characters whose frequency order is less than 512
- self._freq_chars = 0
-
- def feed(self, char: Union[bytes, bytearray], char_len: int) -> None:
- """feed a character with known length"""
- if char_len == 2:
- # we only care about 2-bytes character in our distribution analysis
- order = self.get_order(char)
- else:
- order = -1
- if order >= 0:
- self._total_chars += 1
- # order is valid
- if order < self._table_size:
- if 512 > self._char_to_freq_order[order]:
- self._freq_chars += 1
-
- def get_confidence(self) -> float:
- """return confidence based on existing data"""
- # if we didn't receive any character in our consideration range,
- # return negative answer
- if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD:
- return self.SURE_NO
-
- if self._total_chars != self._freq_chars:
- r = self._freq_chars / (
- (self._total_chars - self._freq_chars) * self.typical_distribution_ratio
- )
- if r < self.SURE_YES:
- return r
-
- # normalize confidence (we don't want to be 100% sure)
- return self.SURE_YES
-
- def got_enough_data(self) -> bool:
- # It is not necessary to receive all data to draw conclusion.
- # For charset detection, certain amount of data is enough
- return self._total_chars > self.ENOUGH_DATA_THRESHOLD
-
- def get_order(self, _: Union[bytes, bytearray]) -> int:
- # We do not handle characters based on the original encoding string,
- # but convert this encoding string to a number, here called order.
- # This allows multiple encodings of a language to share one frequency
- # table.
- return -1
-
-
-class EUCTWDistributionAnalysis(CharDistributionAnalysis):
- def __init__(self) -> None:
- super().__init__()
- self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER
- self._table_size = EUCTW_TABLE_SIZE
- self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO
-
- def get_order(self, byte_str: Union[bytes, bytearray]) -> int:
- # for euc-TW encoding, we are interested
- # first byte range: 0xc4 -- 0xfe
- # second byte range: 0xa1 -- 0xfe
- # no validation needed here. State machine has done that
- first_char = byte_str[0]
- if first_char >= 0xC4:
- return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1
- return -1
-
-
-class EUCKRDistributionAnalysis(CharDistributionAnalysis):
- def __init__(self) -> None:
- super().__init__()
- self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER
- self._table_size = EUCKR_TABLE_SIZE
- self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO
-
- def get_order(self, byte_str: Union[bytes, bytearray]) -> int:
- # for euc-KR encoding, we are interested
- # first byte range: 0xb0 -- 0xfe
- # second byte range: 0xa1 -- 0xfe
- # no validation needed here. State machine has done that
- first_char = byte_str[0]
- if first_char >= 0xB0:
- return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1
- return -1
-
-
-class JOHABDistributionAnalysis(CharDistributionAnalysis):
- def __init__(self) -> None:
- super().__init__()
- self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER
- self._table_size = EUCKR_TABLE_SIZE
- self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO
-
- def get_order(self, byte_str: Union[bytes, bytearray]) -> int:
- first_char = byte_str[0]
- if 0x88 <= first_char < 0xD4:
- code = first_char * 256 + byte_str[1]
- return JOHAB_TO_EUCKR_ORDER_TABLE.get(code, -1)
- return -1
-
-
-class GB2312DistributionAnalysis(CharDistributionAnalysis):
- def __init__(self) -> None:
- super().__init__()
- self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER
- self._table_size = GB2312_TABLE_SIZE
- self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO
-
- def get_order(self, byte_str: Union[bytes, bytearray]) -> int:
- # for GB2312 encoding, we are interested
- # first byte range: 0xb0 -- 0xfe
- # second byte range: 0xa1 -- 0xfe
- # no validation needed here. State machine has done that
- first_char, second_char = byte_str[0], byte_str[1]
- if (first_char >= 0xB0) and (second_char >= 0xA1):
- return 94 * (first_char - 0xB0) + second_char - 0xA1
- return -1
-
-
-class Big5DistributionAnalysis(CharDistributionAnalysis):
- def __init__(self) -> None:
- super().__init__()
- self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER
- self._table_size = BIG5_TABLE_SIZE
- self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO
-
- def get_order(self, byte_str: Union[bytes, bytearray]) -> int:
- # for big5 encoding, we are interested
- # first byte range: 0xa4 -- 0xfe
- # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe
- # no validation needed here. State machine has done that
- first_char, second_char = byte_str[0], byte_str[1]
- if first_char >= 0xA4:
- if second_char >= 0xA1:
- return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63
- return 157 * (first_char - 0xA4) + second_char - 0x40
- return -1
-
-
-class SJISDistributionAnalysis(CharDistributionAnalysis):
- def __init__(self) -> None:
- super().__init__()
- self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER
- self._table_size = JIS_TABLE_SIZE
- self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO
-
- def get_order(self, byte_str: Union[bytes, bytearray]) -> int:
- # for sjis encoding, we are interested
- # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe
- # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe
- # no validation needed here. State machine has done that
- first_char, second_char = byte_str[0], byte_str[1]
- if 0x81 <= first_char <= 0x9F:
- order = 188 * (first_char - 0x81)
- elif 0xE0 <= first_char <= 0xEF:
- order = 188 * (first_char - 0xE0 + 31)
- else:
- return -1
- order = order + second_char - 0x40
- if second_char > 0x7F:
- order = -1
- return order
-
-
-class EUCJPDistributionAnalysis(CharDistributionAnalysis):
- def __init__(self) -> None:
- super().__init__()
- self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER
- self._table_size = JIS_TABLE_SIZE
- self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO
-
- def get_order(self, byte_str: Union[bytes, bytearray]) -> int:
- # for euc-JP encoding, we are interested
- # first byte range: 0xa0 -- 0xfe
- # second byte range: 0xa1 -- 0xfe
- # no validation needed here. State machine has done that
- char = byte_str[0]
- if char >= 0xA0:
- return 94 * (char - 0xA1) + byte_str[1] - 0xA1
- return -1
diff --git a/contrib/python/pip/pip/_vendor/chardet/charsetgroupprober.py b/contrib/python/pip/pip/_vendor/chardet/charsetgroupprober.py
deleted file mode 100644
index 6def56b4a7..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/charsetgroupprober.py
+++ /dev/null
@@ -1,106 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import List, Optional, Union
-
-from .charsetprober import CharSetProber
-from .enums import LanguageFilter, ProbingState
-
-
-class CharSetGroupProber(CharSetProber):
- def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None:
- super().__init__(lang_filter=lang_filter)
- self._active_num = 0
- self.probers: List[CharSetProber] = []
- self._best_guess_prober: Optional[CharSetProber] = None
-
- def reset(self) -> None:
- super().reset()
- self._active_num = 0
- for prober in self.probers:
- prober.reset()
- prober.active = True
- self._active_num += 1
- self._best_guess_prober = None
-
- @property
- def charset_name(self) -> Optional[str]:
- if not self._best_guess_prober:
- self.get_confidence()
- if not self._best_guess_prober:
- return None
- return self._best_guess_prober.charset_name
-
- @property
- def language(self) -> Optional[str]:
- if not self._best_guess_prober:
- self.get_confidence()
- if not self._best_guess_prober:
- return None
- return self._best_guess_prober.language
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- for prober in self.probers:
- if not prober.active:
- continue
- state = prober.feed(byte_str)
- if not state:
- continue
- if state == ProbingState.FOUND_IT:
- self._best_guess_prober = prober
- self._state = ProbingState.FOUND_IT
- return self.state
- if state == ProbingState.NOT_ME:
- prober.active = False
- self._active_num -= 1
- if self._active_num <= 0:
- self._state = ProbingState.NOT_ME
- return self.state
- return self.state
-
- def get_confidence(self) -> float:
- state = self.state
- if state == ProbingState.FOUND_IT:
- return 0.99
- if state == ProbingState.NOT_ME:
- return 0.01
- best_conf = 0.0
- self._best_guess_prober = None
- for prober in self.probers:
- if not prober.active:
- self.logger.debug("%s not active", prober.charset_name)
- continue
- conf = prober.get_confidence()
- self.logger.debug(
- "%s %s confidence = %s", prober.charset_name, prober.language, conf
- )
- if best_conf < conf:
- best_conf = conf
- self._best_guess_prober = prober
- if not self._best_guess_prober:
- return 0.0
- return best_conf
diff --git a/contrib/python/pip/pip/_vendor/chardet/charsetprober.py b/contrib/python/pip/pip/_vendor/chardet/charsetprober.py
deleted file mode 100644
index a103ca1135..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/charsetprober.py
+++ /dev/null
@@ -1,147 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-import logging
-import re
-from typing import Optional, Union
-
-from .enums import LanguageFilter, ProbingState
-
-INTERNATIONAL_WORDS_PATTERN = re.compile(
- b"[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?"
-)
-
-
-class CharSetProber:
-
- SHORTCUT_THRESHOLD = 0.95
-
- def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None:
- self._state = ProbingState.DETECTING
- self.active = True
- self.lang_filter = lang_filter
- self.logger = logging.getLogger(__name__)
-
- def reset(self) -> None:
- self._state = ProbingState.DETECTING
-
- @property
- def charset_name(self) -> Optional[str]:
- return None
-
- @property
- def language(self) -> Optional[str]:
- raise NotImplementedError
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- raise NotImplementedError
-
- @property
- def state(self) -> ProbingState:
- return self._state
-
- def get_confidence(self) -> float:
- return 0.0
-
- @staticmethod
- def filter_high_byte_only(buf: Union[bytes, bytearray]) -> bytes:
- buf = re.sub(b"([\x00-\x7F])+", b" ", buf)
- return buf
-
- @staticmethod
- def filter_international_words(buf: Union[bytes, bytearray]) -> bytearray:
- """
- We define three types of bytes:
- alphabet: english alphabets [a-zA-Z]
- international: international characters [\x80-\xFF]
- marker: everything else [^a-zA-Z\x80-\xFF]
- The input buffer can be thought to contain a series of words delimited
- by markers. This function works to filter all words that contain at
- least one international character. All contiguous sequences of markers
- are replaced by a single space ascii character.
- This filter applies to all scripts which do not use English characters.
- """
- filtered = bytearray()
-
- # This regex expression filters out only words that have at-least one
- # international character. The word may include one marker character at
- # the end.
- words = INTERNATIONAL_WORDS_PATTERN.findall(buf)
-
- for word in words:
- filtered.extend(word[:-1])
-
- # If the last character in the word is a marker, replace it with a
- # space as markers shouldn't affect our analysis (they are used
- # similarly across all languages and may thus have similar
- # frequencies).
- last_char = word[-1:]
- if not last_char.isalpha() and last_char < b"\x80":
- last_char = b" "
- filtered.extend(last_char)
-
- return filtered
-
- @staticmethod
- def remove_xml_tags(buf: Union[bytes, bytearray]) -> bytes:
- """
- Returns a copy of ``buf`` that retains only the sequences of English
- alphabet and high byte characters that are not between <> characters.
- This filter can be applied to all scripts which contain both English
- characters and extended ASCII characters, but is currently only used by
- ``Latin1Prober``.
- """
- filtered = bytearray()
- in_tag = False
- prev = 0
- buf = memoryview(buf).cast("c")
-
- for curr, buf_char in enumerate(buf):
- # Check if we're coming out of or entering an XML tag
-
- # https://github.com/python/typeshed/issues/8182
- if buf_char == b">": # type: ignore[comparison-overlap]
- prev = curr + 1
- in_tag = False
- # https://github.com/python/typeshed/issues/8182
- elif buf_char == b"<": # type: ignore[comparison-overlap]
- if curr > prev and not in_tag:
- # Keep everything after last non-extended-ASCII,
- # non-alphabetic character
- filtered.extend(buf[prev:curr])
- # Output a space to delimit stretch we kept
- filtered.extend(b" ")
- in_tag = True
-
- # If we're not in a tag...
- if not in_tag:
- # Keep everything after last non-extended-ASCII, non-alphabetic
- # character
- filtered.extend(buf[prev:])
-
- return filtered
diff --git a/contrib/python/pip/pip/_vendor/chardet/cli/__init__.py b/contrib/python/pip/pip/_vendor/chardet/cli/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/cli/__init__.py
+++ /dev/null
diff --git a/contrib/python/pip/pip/_vendor/chardet/cli/chardetect.py b/contrib/python/pip/pip/_vendor/chardet/cli/chardetect.py
deleted file mode 100644
index 43f6e144f6..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/cli/chardetect.py
+++ /dev/null
@@ -1,112 +0,0 @@
-"""
-Script which takes one or more file paths and reports on their detected
-encodings
-
-Example::
-
- % chardetect somefile someotherfile
- somefile: windows-1252 with confidence 0.5
- someotherfile: ascii with confidence 1.0
-
-If no paths are provided, it takes its input from stdin.
-
-"""
-
-
-import argparse
-import sys
-from typing import Iterable, List, Optional
-
-from .. import __version__
-from ..universaldetector import UniversalDetector
-
-
-def description_of(
- lines: Iterable[bytes],
- name: str = "stdin",
- minimal: bool = False,
- should_rename_legacy: bool = False,
-) -> Optional[str]:
- """
- Return a string describing the probable encoding of a file or
- list of strings.
-
- :param lines: The lines to get the encoding of.
- :type lines: Iterable of bytes
- :param name: Name of file or collection of lines
- :type name: str
- :param should_rename_legacy: Should we rename legacy encodings to
- their more modern equivalents?
- :type should_rename_legacy: ``bool``
- """
- u = UniversalDetector(should_rename_legacy=should_rename_legacy)
- for line in lines:
- line = bytearray(line)
- u.feed(line)
- # shortcut out of the loop to save reading further - particularly useful if we read a BOM.
- if u.done:
- break
- u.close()
- result = u.result
- if minimal:
- return result["encoding"]
- if result["encoding"]:
- return f'{name}: {result["encoding"]} with confidence {result["confidence"]}'
- return f"{name}: no result"
-
-
-def main(argv: Optional[List[str]] = None) -> None:
- """
- Handles command line arguments and gets things started.
-
- :param argv: List of arguments, as if specified on the command-line.
- If None, ``sys.argv[1:]`` is used instead.
- :type argv: list of str
- """
- # Get command line arguments
- parser = argparse.ArgumentParser(
- description=(
- "Takes one or more file paths and reports their detected encodings"
- )
- )
- parser.add_argument(
- "input",
- help="File whose encoding we would like to determine. (default: stdin)",
- type=argparse.FileType("rb"),
- nargs="*",
- default=[sys.stdin.buffer],
- )
- parser.add_argument(
- "--minimal",
- help="Print only the encoding to standard output",
- action="store_true",
- )
- parser.add_argument(
- "-l",
- "--legacy",
- help="Rename legacy encodings to more modern ones.",
- action="store_true",
- )
- parser.add_argument(
- "--version", action="version", version=f"%(prog)s {__version__}"
- )
- args = parser.parse_args(argv)
-
- for f in args.input:
- if f.isatty():
- print(
- "You are running chardetect interactively. Press "
- "CTRL-D twice at the start of a blank line to signal the "
- "end of your input. If you want help, run chardetect "
- "--help\n",
- file=sys.stderr,
- )
- print(
- description_of(
- f, f.name, minimal=args.minimal, should_rename_legacy=args.legacy
- )
- )
-
-
-if __name__ == "__main__":
- main()
diff --git a/contrib/python/pip/pip/_vendor/chardet/codingstatemachine.py b/contrib/python/pip/pip/_vendor/chardet/codingstatemachine.py
deleted file mode 100644
index 8ed4a8773b..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/codingstatemachine.py
+++ /dev/null
@@ -1,90 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-import logging
-
-from .codingstatemachinedict import CodingStateMachineDict
-from .enums import MachineState
-
-
-class CodingStateMachine:
- """
- A state machine to verify a byte sequence for a particular encoding. For
- each byte the detector receives, it will feed that byte to every active
- state machine available, one byte at a time. The state machine changes its
- state based on its previous state and the byte it receives. There are 3
- states in a state machine that are of interest to an auto-detector:
-
- START state: This is the state to start with, or a legal byte sequence
- (i.e. a valid code point) for character has been identified.
-
- ME state: This indicates that the state machine identified a byte sequence
- that is specific to the charset it is designed for and that
- there is no other possible encoding which can contain this byte
- sequence. This will to lead to an immediate positive answer for
- the detector.
-
- ERROR state: This indicates the state machine identified an illegal byte
- sequence for that encoding. This will lead to an immediate
- negative answer for this encoding. Detector will exclude this
- encoding from consideration from here on.
- """
-
- def __init__(self, sm: CodingStateMachineDict) -> None:
- self._model = sm
- self._curr_byte_pos = 0
- self._curr_char_len = 0
- self._curr_state = MachineState.START
- self.active = True
- self.logger = logging.getLogger(__name__)
- self.reset()
-
- def reset(self) -> None:
- self._curr_state = MachineState.START
-
- def next_state(self, c: int) -> int:
- # for each byte we get its class
- # if it is first byte, we also get byte length
- byte_class = self._model["class_table"][c]
- if self._curr_state == MachineState.START:
- self._curr_byte_pos = 0
- self._curr_char_len = self._model["char_len_table"][byte_class]
- # from byte's class and state_table, we get its next state
- curr_state = self._curr_state * self._model["class_factor"] + byte_class
- self._curr_state = self._model["state_table"][curr_state]
- self._curr_byte_pos += 1
- return self._curr_state
-
- def get_current_charlen(self) -> int:
- return self._curr_char_len
-
- def get_coding_state_machine(self) -> str:
- return self._model["name"]
-
- @property
- def language(self) -> str:
- return self._model["language"]
diff --git a/contrib/python/pip/pip/_vendor/chardet/codingstatemachinedict.py b/contrib/python/pip/pip/_vendor/chardet/codingstatemachinedict.py
deleted file mode 100644
index 7a3c4c7e3f..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/codingstatemachinedict.py
+++ /dev/null
@@ -1,19 +0,0 @@
-from typing import TYPE_CHECKING, Tuple
-
-if TYPE_CHECKING:
- # TypedDict was introduced in Python 3.8.
- #
- # TODO: Remove the else block and TYPE_CHECKING check when dropping support
- # for Python 3.7.
- from typing import TypedDict
-
- class CodingStateMachineDict(TypedDict, total=False):
- class_table: Tuple[int, ...]
- class_factor: int
- state_table: Tuple[int, ...]
- char_len_table: Tuple[int, ...]
- name: str
- language: str # Optional key
-
-else:
- CodingStateMachineDict = dict
diff --git a/contrib/python/pip/pip/_vendor/chardet/cp949prober.py b/contrib/python/pip/pip/_vendor/chardet/cp949prober.py
deleted file mode 100644
index fa7307ed89..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/cp949prober.py
+++ /dev/null
@@ -1,49 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .chardistribution import EUCKRDistributionAnalysis
-from .codingstatemachine import CodingStateMachine
-from .mbcharsetprober import MultiByteCharSetProber
-from .mbcssm import CP949_SM_MODEL
-
-
-class CP949Prober(MultiByteCharSetProber):
- def __init__(self) -> None:
- super().__init__()
- self.coding_sm = CodingStateMachine(CP949_SM_MODEL)
- # NOTE: CP949 is a superset of EUC-KR, so the distribution should be
- # not different.
- self.distribution_analyzer = EUCKRDistributionAnalysis()
- self.reset()
-
- @property
- def charset_name(self) -> str:
- return "CP949"
-
- @property
- def language(self) -> str:
- return "Korean"
diff --git a/contrib/python/pip/pip/_vendor/chardet/enums.py b/contrib/python/pip/pip/_vendor/chardet/enums.py
deleted file mode 100644
index 5e3e198233..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/enums.py
+++ /dev/null
@@ -1,85 +0,0 @@
-"""
-All of the Enums that are used throughout the chardet package.
-
-:author: Dan Blanchard (dan.blanchard@gmail.com)
-"""
-
-from enum import Enum, Flag
-
-
-class InputState:
- """
- This enum represents the different states a universal detector can be in.
- """
-
- PURE_ASCII = 0
- ESC_ASCII = 1
- HIGH_BYTE = 2
-
-
-class LanguageFilter(Flag):
- """
- This enum represents the different language filters we can apply to a
- ``UniversalDetector``.
- """
-
- NONE = 0x00
- CHINESE_SIMPLIFIED = 0x01
- CHINESE_TRADITIONAL = 0x02
- JAPANESE = 0x04
- KOREAN = 0x08
- NON_CJK = 0x10
- ALL = 0x1F
- CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL
- CJK = CHINESE | JAPANESE | KOREAN
-
-
-class ProbingState(Enum):
- """
- This enum represents the different states a prober can be in.
- """
-
- DETECTING = 0
- FOUND_IT = 1
- NOT_ME = 2
-
-
-class MachineState:
- """
- This enum represents the different states a state machine can be in.
- """
-
- START = 0
- ERROR = 1
- ITS_ME = 2
-
-
-class SequenceLikelihood:
- """
- This enum represents the likelihood of a character following the previous one.
- """
-
- NEGATIVE = 0
- UNLIKELY = 1
- LIKELY = 2
- POSITIVE = 3
-
- @classmethod
- def get_num_categories(cls) -> int:
- """:returns: The number of likelihood categories in the enum."""
- return 4
-
-
-class CharacterCategory:
- """
- This enum represents the different categories language models for
- ``SingleByteCharsetProber`` put characters into.
-
- Anything less than CONTROL is considered a letter.
- """
-
- UNDEFINED = 255
- LINE_BREAK = 254
- SYMBOL = 253
- DIGIT = 252
- CONTROL = 251
diff --git a/contrib/python/pip/pip/_vendor/chardet/escprober.py b/contrib/python/pip/pip/_vendor/chardet/escprober.py
deleted file mode 100644
index fd713830d3..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/escprober.py
+++ /dev/null
@@ -1,102 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import Optional, Union
-
-from .charsetprober import CharSetProber
-from .codingstatemachine import CodingStateMachine
-from .enums import LanguageFilter, MachineState, ProbingState
-from .escsm import (
- HZ_SM_MODEL,
- ISO2022CN_SM_MODEL,
- ISO2022JP_SM_MODEL,
- ISO2022KR_SM_MODEL,
-)
-
-
-class EscCharSetProber(CharSetProber):
- """
- This CharSetProber uses a "code scheme" approach for detecting encodings,
- whereby easily recognizable escape or shift sequences are relied on to
- identify these encodings.
- """
-
- def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None:
- super().__init__(lang_filter=lang_filter)
- self.coding_sm = []
- if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED:
- self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL))
- self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL))
- if self.lang_filter & LanguageFilter.JAPANESE:
- self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL))
- if self.lang_filter & LanguageFilter.KOREAN:
- self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL))
- self.active_sm_count = 0
- self._detected_charset: Optional[str] = None
- self._detected_language: Optional[str] = None
- self._state = ProbingState.DETECTING
- self.reset()
-
- def reset(self) -> None:
- super().reset()
- for coding_sm in self.coding_sm:
- coding_sm.active = True
- coding_sm.reset()
- self.active_sm_count = len(self.coding_sm)
- self._detected_charset = None
- self._detected_language = None
-
- @property
- def charset_name(self) -> Optional[str]:
- return self._detected_charset
-
- @property
- def language(self) -> Optional[str]:
- return self._detected_language
-
- def get_confidence(self) -> float:
- return 0.99 if self._detected_charset else 0.00
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- for c in byte_str:
- for coding_sm in self.coding_sm:
- if not coding_sm.active:
- continue
- coding_state = coding_sm.next_state(c)
- if coding_state == MachineState.ERROR:
- coding_sm.active = False
- self.active_sm_count -= 1
- if self.active_sm_count <= 0:
- self._state = ProbingState.NOT_ME
- return self.state
- elif coding_state == MachineState.ITS_ME:
- self._state = ProbingState.FOUND_IT
- self._detected_charset = coding_sm.get_coding_state_machine()
- self._detected_language = coding_sm.language
- return self.state
-
- return self.state
diff --git a/contrib/python/pip/pip/_vendor/chardet/escsm.py b/contrib/python/pip/pip/_vendor/chardet/escsm.py
deleted file mode 100644
index 11d4adf771..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/escsm.py
+++ /dev/null
@@ -1,261 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .codingstatemachinedict import CodingStateMachineDict
-from .enums import MachineState
-
-# fmt: off
-HZ_CLS = (
- 1, 0, 0, 0, 0, 0, 0, 0, # 00 - 07
- 0, 0, 0, 0, 0, 0, 0, 0, # 08 - 0f
- 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17
- 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f
- 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27
- 0, 0, 0, 0, 0, 0, 0, 0, # 28 - 2f
- 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37
- 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f
- 0, 0, 0, 0, 0, 0, 0, 0, # 40 - 47
- 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f
- 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57
- 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f
- 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67
- 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f
- 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77
- 0, 0, 0, 4, 0, 5, 2, 0, # 78 - 7f
- 1, 1, 1, 1, 1, 1, 1, 1, # 80 - 87
- 1, 1, 1, 1, 1, 1, 1, 1, # 88 - 8f
- 1, 1, 1, 1, 1, 1, 1, 1, # 90 - 97
- 1, 1, 1, 1, 1, 1, 1, 1, # 98 - 9f
- 1, 1, 1, 1, 1, 1, 1, 1, # a0 - a7
- 1, 1, 1, 1, 1, 1, 1, 1, # a8 - af
- 1, 1, 1, 1, 1, 1, 1, 1, # b0 - b7
- 1, 1, 1, 1, 1, 1, 1, 1, # b8 - bf
- 1, 1, 1, 1, 1, 1, 1, 1, # c0 - c7
- 1, 1, 1, 1, 1, 1, 1, 1, # c8 - cf
- 1, 1, 1, 1, 1, 1, 1, 1, # d0 - d7
- 1, 1, 1, 1, 1, 1, 1, 1, # d8 - df
- 1, 1, 1, 1, 1, 1, 1, 1, # e0 - e7
- 1, 1, 1, 1, 1, 1, 1, 1, # e8 - ef
- 1, 1, 1, 1, 1, 1, 1, 1, # f0 - f7
- 1, 1, 1, 1, 1, 1, 1, 1, # f8 - ff
-)
-
-HZ_ST = (
-MachineState.START, MachineState.ERROR, 3, MachineState.START, MachineState.START, MachineState.START, MachineState.ERROR, MachineState.ERROR, # 00-07
-MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 08-0f
-MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.START, MachineState.START, 4, MachineState.ERROR, # 10-17
- 5, MachineState.ERROR, 6, MachineState.ERROR, 5, 5, 4, MachineState.ERROR, # 18-1f
- 4, MachineState.ERROR, 4, 4, 4, MachineState.ERROR, 4, MachineState.ERROR, # 20-27
- 4, MachineState.ITS_ME, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 28-2f
-)
-# fmt: on
-
-HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0)
-
-HZ_SM_MODEL: CodingStateMachineDict = {
- "class_table": HZ_CLS,
- "class_factor": 6,
- "state_table": HZ_ST,
- "char_len_table": HZ_CHAR_LEN_TABLE,
- "name": "HZ-GB-2312",
- "language": "Chinese",
-}
-
-# fmt: off
-ISO2022CN_CLS = (
- 2, 0, 0, 0, 0, 0, 0, 0, # 00 - 07
- 0, 0, 0, 0, 0, 0, 0, 0, # 08 - 0f
- 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17
- 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f
- 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27
- 0, 3, 0, 0, 0, 0, 0, 0, # 28 - 2f
- 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37
- 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f
- 0, 0, 0, 4, 0, 0, 0, 0, # 40 - 47
- 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f
- 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57
- 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f
- 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67
- 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f
- 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77
- 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f
- 2, 2, 2, 2, 2, 2, 2, 2, # 80 - 87
- 2, 2, 2, 2, 2, 2, 2, 2, # 88 - 8f
- 2, 2, 2, 2, 2, 2, 2, 2, # 90 - 97
- 2, 2, 2, 2, 2, 2, 2, 2, # 98 - 9f
- 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7
- 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af
- 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7
- 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf
- 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7
- 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf
- 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7
- 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df
- 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7
- 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef
- 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7
- 2, 2, 2, 2, 2, 2, 2, 2, # f8 - ff
-)
-
-ISO2022CN_ST = (
- MachineState.START, 3, MachineState.ERROR, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 00-07
- MachineState.START, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 08-0f
- MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 10-17
- MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 4, MachineState.ERROR, # 18-1f
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 20-27
- 5, 6, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 28-2f
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 30-37
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.START, # 38-3f
-)
-# fmt: on
-
-ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0)
-
-ISO2022CN_SM_MODEL: CodingStateMachineDict = {
- "class_table": ISO2022CN_CLS,
- "class_factor": 9,
- "state_table": ISO2022CN_ST,
- "char_len_table": ISO2022CN_CHAR_LEN_TABLE,
- "name": "ISO-2022-CN",
- "language": "Chinese",
-}
-
-# fmt: off
-ISO2022JP_CLS = (
- 2, 0, 0, 0, 0, 0, 0, 0, # 00 - 07
- 0, 0, 0, 0, 0, 0, 2, 2, # 08 - 0f
- 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17
- 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f
- 0, 0, 0, 0, 7, 0, 0, 0, # 20 - 27
- 3, 0, 0, 0, 0, 0, 0, 0, # 28 - 2f
- 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37
- 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f
- 6, 0, 4, 0, 8, 0, 0, 0, # 40 - 47
- 0, 9, 5, 0, 0, 0, 0, 0, # 48 - 4f
- 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57
- 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f
- 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67
- 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f
- 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77
- 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f
- 2, 2, 2, 2, 2, 2, 2, 2, # 80 - 87
- 2, 2, 2, 2, 2, 2, 2, 2, # 88 - 8f
- 2, 2, 2, 2, 2, 2, 2, 2, # 90 - 97
- 2, 2, 2, 2, 2, 2, 2, 2, # 98 - 9f
- 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7
- 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af
- 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7
- 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf
- 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7
- 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf
- 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7
- 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df
- 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7
- 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef
- 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7
- 2, 2, 2, 2, 2, 2, 2, 2, # f8 - ff
-)
-
-ISO2022JP_ST = (
- MachineState.START, 3, MachineState.ERROR, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 00-07
- MachineState.START, MachineState.START, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 08-0f
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 10-17
- MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, # 18-1f
- MachineState.ERROR, 5, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 4, MachineState.ERROR, MachineState.ERROR, # 20-27
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 6, MachineState.ITS_ME, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, # 28-2f
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, # 30-37
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 38-3f
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.START, MachineState.START, # 40-47
-)
-# fmt: on
-
-ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
-
-ISO2022JP_SM_MODEL: CodingStateMachineDict = {
- "class_table": ISO2022JP_CLS,
- "class_factor": 10,
- "state_table": ISO2022JP_ST,
- "char_len_table": ISO2022JP_CHAR_LEN_TABLE,
- "name": "ISO-2022-JP",
- "language": "Japanese",
-}
-
-# fmt: off
-ISO2022KR_CLS = (
- 2, 0, 0, 0, 0, 0, 0, 0, # 00 - 07
- 0, 0, 0, 0, 0, 0, 0, 0, # 08 - 0f
- 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17
- 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f
- 0, 0, 0, 0, 3, 0, 0, 0, # 20 - 27
- 0, 4, 0, 0, 0, 0, 0, 0, # 28 - 2f
- 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37
- 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f
- 0, 0, 0, 5, 0, 0, 0, 0, # 40 - 47
- 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f
- 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57
- 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f
- 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67
- 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f
- 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77
- 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f
- 2, 2, 2, 2, 2, 2, 2, 2, # 80 - 87
- 2, 2, 2, 2, 2, 2, 2, 2, # 88 - 8f
- 2, 2, 2, 2, 2, 2, 2, 2, # 90 - 97
- 2, 2, 2, 2, 2, 2, 2, 2, # 98 - 9f
- 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7
- 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af
- 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7
- 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf
- 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7
- 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf
- 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7
- 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df
- 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7
- 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef
- 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7
- 2, 2, 2, 2, 2, 2, 2, 2, # f8 - ff
-)
-
-ISO2022KR_ST = (
- MachineState.START, 3, MachineState.ERROR, MachineState.START, MachineState.START, MachineState.START, MachineState.ERROR, MachineState.ERROR, # 00-07
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 08-0f
- MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 4, MachineState.ERROR, MachineState.ERROR, # 10-17
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 5, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 18-1f
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 20-27
-)
-# fmt: on
-
-ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0)
-
-ISO2022KR_SM_MODEL: CodingStateMachineDict = {
- "class_table": ISO2022KR_CLS,
- "class_factor": 6,
- "state_table": ISO2022KR_ST,
- "char_len_table": ISO2022KR_CHAR_LEN_TABLE,
- "name": "ISO-2022-KR",
- "language": "Korean",
-}
diff --git a/contrib/python/pip/pip/_vendor/chardet/eucjpprober.py b/contrib/python/pip/pip/_vendor/chardet/eucjpprober.py
deleted file mode 100644
index 39487f4098..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/eucjpprober.py
+++ /dev/null
@@ -1,102 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import Union
-
-from .chardistribution import EUCJPDistributionAnalysis
-from .codingstatemachine import CodingStateMachine
-from .enums import MachineState, ProbingState
-from .jpcntx import EUCJPContextAnalysis
-from .mbcharsetprober import MultiByteCharSetProber
-from .mbcssm import EUCJP_SM_MODEL
-
-
-class EUCJPProber(MultiByteCharSetProber):
- def __init__(self) -> None:
- super().__init__()
- self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL)
- self.distribution_analyzer = EUCJPDistributionAnalysis()
- self.context_analyzer = EUCJPContextAnalysis()
- self.reset()
-
- def reset(self) -> None:
- super().reset()
- self.context_analyzer.reset()
-
- @property
- def charset_name(self) -> str:
- return "EUC-JP"
-
- @property
- def language(self) -> str:
- return "Japanese"
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- assert self.coding_sm is not None
- assert self.distribution_analyzer is not None
-
- for i, byte in enumerate(byte_str):
- # PY3K: byte_str is a byte array, so byte is an int, not a byte
- coding_state = self.coding_sm.next_state(byte)
- if coding_state == MachineState.ERROR:
- self.logger.debug(
- "%s %s prober hit error at byte %s",
- self.charset_name,
- self.language,
- i,
- )
- self._state = ProbingState.NOT_ME
- break
- if coding_state == MachineState.ITS_ME:
- self._state = ProbingState.FOUND_IT
- break
- if coding_state == MachineState.START:
- char_len = self.coding_sm.get_current_charlen()
- if i == 0:
- self._last_char[1] = byte
- self.context_analyzer.feed(self._last_char, char_len)
- self.distribution_analyzer.feed(self._last_char, char_len)
- else:
- self.context_analyzer.feed(byte_str[i - 1 : i + 1], char_len)
- self.distribution_analyzer.feed(byte_str[i - 1 : i + 1], char_len)
-
- self._last_char[0] = byte_str[-1]
-
- if self.state == ProbingState.DETECTING:
- if self.context_analyzer.got_enough_data() and (
- self.get_confidence() > self.SHORTCUT_THRESHOLD
- ):
- self._state = ProbingState.FOUND_IT
-
- return self.state
-
- def get_confidence(self) -> float:
- assert self.distribution_analyzer is not None
-
- context_conf = self.context_analyzer.get_confidence()
- distrib_conf = self.distribution_analyzer.get_confidence()
- return max(context_conf, distrib_conf)
diff --git a/contrib/python/pip/pip/_vendor/chardet/euckrfreq.py b/contrib/python/pip/pip/_vendor/chardet/euckrfreq.py
deleted file mode 100644
index 7dc3b10387..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/euckrfreq.py
+++ /dev/null
@@ -1,196 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-# Sampling from about 20M text materials include literature and computer technology
-
-# 128 --> 0.79
-# 256 --> 0.92
-# 512 --> 0.986
-# 1024 --> 0.99944
-# 2048 --> 0.99999
-#
-# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24
-# Random Distribution Ration = 512 / (2350-512) = 0.279.
-#
-# Typical Distribution Ratio
-
-EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0
-
-EUCKR_TABLE_SIZE = 2352
-
-# Char to FreqOrder table ,
-# fmt: off
-EUCKR_CHAR_TO_FREQ_ORDER = (
- 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87,
-1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398,
-1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734,
- 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739,
- 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622,
- 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750,
-1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856,
- 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205,
- 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779,
-1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19,
-1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567,
-1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797,
-1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802,
-1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899,
- 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818,
-1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409,
-1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697,
-1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770,
-1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723,
- 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416,
-1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300,
- 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083,
- 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857,
-1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871,
- 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420,
-1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885,
- 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889,
- 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893,
-1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317,
-1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841,
-1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910,
-1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610,
- 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375,
-1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939,
- 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870,
- 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934,
-1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888,
-1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950,
-1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065,
-1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002,
-1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965,
-1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467,
- 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285,
- 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7,
- 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979,
-1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985,
- 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994,
-1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250,
- 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824,
- 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003,
-2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745,
- 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61,
- 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023,
-2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032,
-2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912,
-2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224,
- 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012,
- 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050,
-2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681,
- 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414,
-1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068,
-2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075,
-1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850,
-2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606,
-2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449,
-1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452,
- 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112,
-2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121,
-2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130,
- 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274,
- 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139,
-2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721,
-1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298,
-2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463,
-2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747,
-2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285,
-2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187,
-2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10,
-2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350,
-1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201,
-2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972,
-2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219,
-2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233,
-2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242,
-2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247,
-1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178,
-1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255,
-2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259,
-1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262,
-2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702,
-1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273,
- 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541,
-2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117,
- 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187,
-2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800,
- 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312,
-2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229,
-2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315,
- 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484,
-2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170,
-1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335,
- 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601,
-1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395,
-2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354,
-1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476,
-2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035,
- 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498,
-2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310,
-1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389,
-2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504,
-1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505,
-2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145,
-1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624,
- 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700,
-2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221,
-2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377,
- 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448,
- 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485,
-1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705,
-1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465,
- 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471,
-2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997,
-2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486,
- 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494,
- 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771,
- 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323,
-2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491,
- 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510,
- 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519,
-2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532,
-2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199,
- 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544,
-2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247,
-1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441,
- 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562,
-2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362,
-2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583,
-2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465,
- 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431,
- 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151,
- 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596,
-2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406,
-2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611,
-2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619,
-1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628,
-2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042,
- 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256
-)
-# fmt: on
diff --git a/contrib/python/pip/pip/_vendor/chardet/euckrprober.py b/contrib/python/pip/pip/_vendor/chardet/euckrprober.py
deleted file mode 100644
index 1fc5de0462..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/euckrprober.py
+++ /dev/null
@@ -1,47 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .chardistribution import EUCKRDistributionAnalysis
-from .codingstatemachine import CodingStateMachine
-from .mbcharsetprober import MultiByteCharSetProber
-from .mbcssm import EUCKR_SM_MODEL
-
-
-class EUCKRProber(MultiByteCharSetProber):
- def __init__(self) -> None:
- super().__init__()
- self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL)
- self.distribution_analyzer = EUCKRDistributionAnalysis()
- self.reset()
-
- @property
- def charset_name(self) -> str:
- return "EUC-KR"
-
- @property
- def language(self) -> str:
- return "Korean"
diff --git a/contrib/python/pip/pip/_vendor/chardet/euctwfreq.py b/contrib/python/pip/pip/_vendor/chardet/euctwfreq.py
deleted file mode 100644
index 4900ccc160..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/euctwfreq.py
+++ /dev/null
@@ -1,388 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-# EUCTW frequency table
-# Converted from big5 work
-# by Taiwan's Mandarin Promotion Council
-# <http:#www.edu.tw:81/mandr/>
-
-# 128 --> 0.42261
-# 256 --> 0.57851
-# 512 --> 0.74851
-# 1024 --> 0.89384
-# 2048 --> 0.97583
-#
-# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98
-# Random Distribution Ration = 512/(5401-512)=0.105
-#
-# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
-
-EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75
-
-# Char to FreqOrder table
-EUCTW_TABLE_SIZE = 5376
-
-# fmt: off
-EUCTW_CHAR_TO_FREQ_ORDER = (
- 1, 1800, 1506, 255, 1431, 198, 9, 82, 6, 7310, 177, 202, 3615, 1256, 2808, 110, # 2742
- 3735, 33, 3241, 261, 76, 44, 2113, 16, 2931, 2184, 1176, 659, 3868, 26, 3404, 2643, # 2758
- 1198, 3869, 3313, 4060, 410, 2211, 302, 590, 361, 1963, 8, 204, 58, 4296, 7311, 1931, # 2774
- 63, 7312, 7313, 317, 1614, 75, 222, 159, 4061, 2412, 1480, 7314, 3500, 3068, 224, 2809, # 2790
- 3616, 3, 10, 3870, 1471, 29, 2774, 1135, 2852, 1939, 873, 130, 3242, 1123, 312, 7315, # 2806
- 4297, 2051, 507, 252, 682, 7316, 142, 1914, 124, 206, 2932, 34, 3501, 3173, 64, 604, # 2822
- 7317, 2494, 1976, 1977, 155, 1990, 645, 641, 1606, 7318, 3405, 337, 72, 406, 7319, 80, # 2838
- 630, 238, 3174, 1509, 263, 939, 1092, 2644, 756, 1440, 1094, 3406, 449, 69, 2969, 591, # 2854
- 179, 2095, 471, 115, 2034, 1843, 60, 50, 2970, 134, 806, 1868, 734, 2035, 3407, 180, # 2870
- 995, 1607, 156, 537, 2893, 688, 7320, 319, 1305, 779, 2144, 514, 2374, 298, 4298, 359, # 2886
- 2495, 90, 2707, 1338, 663, 11, 906, 1099, 2545, 20, 2436, 182, 532, 1716, 7321, 732, # 2902
- 1376, 4062, 1311, 1420, 3175, 25, 2312, 1056, 113, 399, 382, 1949, 242, 3408, 2467, 529, # 2918
- 3243, 475, 1447, 3617, 7322, 117, 21, 656, 810, 1297, 2295, 2329, 3502, 7323, 126, 4063, # 2934
- 706, 456, 150, 613, 4299, 71, 1118, 2036, 4064, 145, 3069, 85, 835, 486, 2114, 1246, # 2950
- 1426, 428, 727, 1285, 1015, 800, 106, 623, 303, 1281, 7324, 2127, 2354, 347, 3736, 221, # 2966
- 3503, 3110, 7325, 1955, 1153, 4065, 83, 296, 1199, 3070, 192, 624, 93, 7326, 822, 1897, # 2982
- 2810, 3111, 795, 2064, 991, 1554, 1542, 1592, 27, 43, 2853, 859, 139, 1456, 860, 4300, # 2998
- 437, 712, 3871, 164, 2392, 3112, 695, 211, 3017, 2096, 195, 3872, 1608, 3504, 3505, 3618, # 3014
- 3873, 234, 811, 2971, 2097, 3874, 2229, 1441, 3506, 1615, 2375, 668, 2076, 1638, 305, 228, # 3030
- 1664, 4301, 467, 415, 7327, 262, 2098, 1593, 239, 108, 300, 200, 1033, 512, 1247, 2077, # 3046
- 7328, 7329, 2173, 3176, 3619, 2673, 593, 845, 1062, 3244, 88, 1723, 2037, 3875, 1950, 212, # 3062
- 266, 152, 149, 468, 1898, 4066, 4302, 77, 187, 7330, 3018, 37, 5, 2972, 7331, 3876, # 3078
- 7332, 7333, 39, 2517, 4303, 2894, 3177, 2078, 55, 148, 74, 4304, 545, 483, 1474, 1029, # 3094
- 1665, 217, 1869, 1531, 3113, 1104, 2645, 4067, 24, 172, 3507, 900, 3877, 3508, 3509, 4305, # 3110
- 32, 1408, 2811, 1312, 329, 487, 2355, 2247, 2708, 784, 2674, 4, 3019, 3314, 1427, 1788, # 3126
- 188, 109, 499, 7334, 3620, 1717, 1789, 888, 1217, 3020, 4306, 7335, 3510, 7336, 3315, 1520, # 3142
- 3621, 3878, 196, 1034, 775, 7337, 7338, 929, 1815, 249, 439, 38, 7339, 1063, 7340, 794, # 3158
- 3879, 1435, 2296, 46, 178, 3245, 2065, 7341, 2376, 7342, 214, 1709, 4307, 804, 35, 707, # 3174
- 324, 3622, 1601, 2546, 140, 459, 4068, 7343, 7344, 1365, 839, 272, 978, 2257, 2572, 3409, # 3190
- 2128, 1363, 3623, 1423, 697, 100, 3071, 48, 70, 1231, 495, 3114, 2193, 7345, 1294, 7346, # 3206
- 2079, 462, 586, 1042, 3246, 853, 256, 988, 185, 2377, 3410, 1698, 434, 1084, 7347, 3411, # 3222
- 314, 2615, 2775, 4308, 2330, 2331, 569, 2280, 637, 1816, 2518, 757, 1162, 1878, 1616, 3412, # 3238
- 287, 1577, 2115, 768, 4309, 1671, 2854, 3511, 2519, 1321, 3737, 909, 2413, 7348, 4069, 933, # 3254
- 3738, 7349, 2052, 2356, 1222, 4310, 765, 2414, 1322, 786, 4311, 7350, 1919, 1462, 1677, 2895, # 3270
- 1699, 7351, 4312, 1424, 2437, 3115, 3624, 2590, 3316, 1774, 1940, 3413, 3880, 4070, 309, 1369, # 3286
- 1130, 2812, 364, 2230, 1653, 1299, 3881, 3512, 3882, 3883, 2646, 525, 1085, 3021, 902, 2000, # 3302
- 1475, 964, 4313, 421, 1844, 1415, 1057, 2281, 940, 1364, 3116, 376, 4314, 4315, 1381, 7, # 3318
- 2520, 983, 2378, 336, 1710, 2675, 1845, 321, 3414, 559, 1131, 3022, 2742, 1808, 1132, 1313, # 3334
- 265, 1481, 1857, 7352, 352, 1203, 2813, 3247, 167, 1089, 420, 2814, 776, 792, 1724, 3513, # 3350
- 4071, 2438, 3248, 7353, 4072, 7354, 446, 229, 333, 2743, 901, 3739, 1200, 1557, 4316, 2647, # 3366
- 1920, 395, 2744, 2676, 3740, 4073, 1835, 125, 916, 3178, 2616, 4317, 7355, 7356, 3741, 7357, # 3382
- 7358, 7359, 4318, 3117, 3625, 1133, 2547, 1757, 3415, 1510, 2313, 1409, 3514, 7360, 2145, 438, # 3398
- 2591, 2896, 2379, 3317, 1068, 958, 3023, 461, 311, 2855, 2677, 4074, 1915, 3179, 4075, 1978, # 3414
- 383, 750, 2745, 2617, 4076, 274, 539, 385, 1278, 1442, 7361, 1154, 1964, 384, 561, 210, # 3430
- 98, 1295, 2548, 3515, 7362, 1711, 2415, 1482, 3416, 3884, 2897, 1257, 129, 7363, 3742, 642, # 3446
- 523, 2776, 2777, 2648, 7364, 141, 2231, 1333, 68, 176, 441, 876, 907, 4077, 603, 2592, # 3462
- 710, 171, 3417, 404, 549, 18, 3118, 2393, 1410, 3626, 1666, 7365, 3516, 4319, 2898, 4320, # 3478
- 7366, 2973, 368, 7367, 146, 366, 99, 871, 3627, 1543, 748, 807, 1586, 1185, 22, 2258, # 3494
- 379, 3743, 3180, 7368, 3181, 505, 1941, 2618, 1991, 1382, 2314, 7369, 380, 2357, 218, 702, # 3510
- 1817, 1248, 3418, 3024, 3517, 3318, 3249, 7370, 2974, 3628, 930, 3250, 3744, 7371, 59, 7372, # 3526
- 585, 601, 4078, 497, 3419, 1112, 1314, 4321, 1801, 7373, 1223, 1472, 2174, 7374, 749, 1836, # 3542
- 690, 1899, 3745, 1772, 3885, 1476, 429, 1043, 1790, 2232, 2116, 917, 4079, 447, 1086, 1629, # 3558
- 7375, 556, 7376, 7377, 2020, 1654, 844, 1090, 105, 550, 966, 1758, 2815, 1008, 1782, 686, # 3574
- 1095, 7378, 2282, 793, 1602, 7379, 3518, 2593, 4322, 4080, 2933, 2297, 4323, 3746, 980, 2496, # 3590
- 544, 353, 527, 4324, 908, 2678, 2899, 7380, 381, 2619, 1942, 1348, 7381, 1341, 1252, 560, # 3606
- 3072, 7382, 3420, 2856, 7383, 2053, 973, 886, 2080, 143, 4325, 7384, 7385, 157, 3886, 496, # 3622
- 4081, 57, 840, 540, 2038, 4326, 4327, 3421, 2117, 1445, 970, 2259, 1748, 1965, 2081, 4082, # 3638
- 3119, 1234, 1775, 3251, 2816, 3629, 773, 1206, 2129, 1066, 2039, 1326, 3887, 1738, 1725, 4083, # 3654
- 279, 3120, 51, 1544, 2594, 423, 1578, 2130, 2066, 173, 4328, 1879, 7386, 7387, 1583, 264, # 3670
- 610, 3630, 4329, 2439, 280, 154, 7388, 7389, 7390, 1739, 338, 1282, 3073, 693, 2857, 1411, # 3686
- 1074, 3747, 2440, 7391, 4330, 7392, 7393, 1240, 952, 2394, 7394, 2900, 1538, 2679, 685, 1483, # 3702
- 4084, 2468, 1436, 953, 4085, 2054, 4331, 671, 2395, 79, 4086, 2441, 3252, 608, 567, 2680, # 3718
- 3422, 4087, 4088, 1691, 393, 1261, 1791, 2396, 7395, 4332, 7396, 7397, 7398, 7399, 1383, 1672, # 3734
- 3748, 3182, 1464, 522, 1119, 661, 1150, 216, 675, 4333, 3888, 1432, 3519, 609, 4334, 2681, # 3750
- 2397, 7400, 7401, 7402, 4089, 3025, 0, 7403, 2469, 315, 231, 2442, 301, 3319, 4335, 2380, # 3766
- 7404, 233, 4090, 3631, 1818, 4336, 4337, 7405, 96, 1776, 1315, 2082, 7406, 257, 7407, 1809, # 3782
- 3632, 2709, 1139, 1819, 4091, 2021, 1124, 2163, 2778, 1777, 2649, 7408, 3074, 363, 1655, 3183, # 3798
- 7409, 2975, 7410, 7411, 7412, 3889, 1567, 3890, 718, 103, 3184, 849, 1443, 341, 3320, 2934, # 3814
- 1484, 7413, 1712, 127, 67, 339, 4092, 2398, 679, 1412, 821, 7414, 7415, 834, 738, 351, # 3830
- 2976, 2146, 846, 235, 1497, 1880, 418, 1992, 3749, 2710, 186, 1100, 2147, 2746, 3520, 1545, # 3846
- 1355, 2935, 2858, 1377, 583, 3891, 4093, 2573, 2977, 7416, 1298, 3633, 1078, 2549, 3634, 2358, # 3862
- 78, 3750, 3751, 267, 1289, 2099, 2001, 1594, 4094, 348, 369, 1274, 2194, 2175, 1837, 4338, # 3878
- 1820, 2817, 3635, 2747, 2283, 2002, 4339, 2936, 2748, 144, 3321, 882, 4340, 3892, 2749, 3423, # 3894
- 4341, 2901, 7417, 4095, 1726, 320, 7418, 3893, 3026, 788, 2978, 7419, 2818, 1773, 1327, 2859, # 3910
- 3894, 2819, 7420, 1306, 4342, 2003, 1700, 3752, 3521, 2359, 2650, 787, 2022, 506, 824, 3636, # 3926
- 534, 323, 4343, 1044, 3322, 2023, 1900, 946, 3424, 7421, 1778, 1500, 1678, 7422, 1881, 4344, # 3942
- 165, 243, 4345, 3637, 2521, 123, 683, 4096, 764, 4346, 36, 3895, 1792, 589, 2902, 816, # 3958
- 626, 1667, 3027, 2233, 1639, 1555, 1622, 3753, 3896, 7423, 3897, 2860, 1370, 1228, 1932, 891, # 3974
- 2083, 2903, 304, 4097, 7424, 292, 2979, 2711, 3522, 691, 2100, 4098, 1115, 4347, 118, 662, # 3990
- 7425, 611, 1156, 854, 2381, 1316, 2861, 2, 386, 515, 2904, 7426, 7427, 3253, 868, 2234, # 4006
- 1486, 855, 2651, 785, 2212, 3028, 7428, 1040, 3185, 3523, 7429, 3121, 448, 7430, 1525, 7431, # 4022
- 2164, 4348, 7432, 3754, 7433, 4099, 2820, 3524, 3122, 503, 818, 3898, 3123, 1568, 814, 676, # 4038
- 1444, 306, 1749, 7434, 3755, 1416, 1030, 197, 1428, 805, 2821, 1501, 4349, 7435, 7436, 7437, # 4054
- 1993, 7438, 4350, 7439, 7440, 2195, 13, 2779, 3638, 2980, 3124, 1229, 1916, 7441, 3756, 2131, # 4070
- 7442, 4100, 4351, 2399, 3525, 7443, 2213, 1511, 1727, 1120, 7444, 7445, 646, 3757, 2443, 307, # 4086
- 7446, 7447, 1595, 3186, 7448, 7449, 7450, 3639, 1113, 1356, 3899, 1465, 2522, 2523, 7451, 519, # 4102
- 7452, 128, 2132, 92, 2284, 1979, 7453, 3900, 1512, 342, 3125, 2196, 7454, 2780, 2214, 1980, # 4118
- 3323, 7455, 290, 1656, 1317, 789, 827, 2360, 7456, 3758, 4352, 562, 581, 3901, 7457, 401, # 4134
- 4353, 2248, 94, 4354, 1399, 2781, 7458, 1463, 2024, 4355, 3187, 1943, 7459, 828, 1105, 4101, # 4150
- 1262, 1394, 7460, 4102, 605, 4356, 7461, 1783, 2862, 7462, 2822, 819, 2101, 578, 2197, 2937, # 4166
- 7463, 1502, 436, 3254, 4103, 3255, 2823, 3902, 2905, 3425, 3426, 7464, 2712, 2315, 7465, 7466, # 4182
- 2332, 2067, 23, 4357, 193, 826, 3759, 2102, 699, 1630, 4104, 3075, 390, 1793, 1064, 3526, # 4198
- 7467, 1579, 3076, 3077, 1400, 7468, 4105, 1838, 1640, 2863, 7469, 4358, 4359, 137, 4106, 598, # 4214
- 3078, 1966, 780, 104, 974, 2938, 7470, 278, 899, 253, 402, 572, 504, 493, 1339, 7471, # 4230
- 3903, 1275, 4360, 2574, 2550, 7472, 3640, 3029, 3079, 2249, 565, 1334, 2713, 863, 41, 7473, # 4246
- 7474, 4361, 7475, 1657, 2333, 19, 463, 2750, 4107, 606, 7476, 2981, 3256, 1087, 2084, 1323, # 4262
- 2652, 2982, 7477, 1631, 1623, 1750, 4108, 2682, 7478, 2864, 791, 2714, 2653, 2334, 232, 2416, # 4278
- 7479, 2983, 1498, 7480, 2654, 2620, 755, 1366, 3641, 3257, 3126, 2025, 1609, 119, 1917, 3427, # 4294
- 862, 1026, 4109, 7481, 3904, 3760, 4362, 3905, 4363, 2260, 1951, 2470, 7482, 1125, 817, 4110, # 4310
- 4111, 3906, 1513, 1766, 2040, 1487, 4112, 3030, 3258, 2824, 3761, 3127, 7483, 7484, 1507, 7485, # 4326
- 2683, 733, 40, 1632, 1106, 2865, 345, 4113, 841, 2524, 230, 4364, 2984, 1846, 3259, 3428, # 4342
- 7486, 1263, 986, 3429, 7487, 735, 879, 254, 1137, 857, 622, 1300, 1180, 1388, 1562, 3907, # 4358
- 3908, 2939, 967, 2751, 2655, 1349, 592, 2133, 1692, 3324, 2985, 1994, 4114, 1679, 3909, 1901, # 4374
- 2185, 7488, 739, 3642, 2715, 1296, 1290, 7489, 4115, 2198, 2199, 1921, 1563, 2595, 2551, 1870, # 4390
- 2752, 2986, 7490, 435, 7491, 343, 1108, 596, 17, 1751, 4365, 2235, 3430, 3643, 7492, 4366, # 4406
- 294, 3527, 2940, 1693, 477, 979, 281, 2041, 3528, 643, 2042, 3644, 2621, 2782, 2261, 1031, # 4422
- 2335, 2134, 2298, 3529, 4367, 367, 1249, 2552, 7493, 3530, 7494, 4368, 1283, 3325, 2004, 240, # 4438
- 1762, 3326, 4369, 4370, 836, 1069, 3128, 474, 7495, 2148, 2525, 268, 3531, 7496, 3188, 1521, # 4454
- 1284, 7497, 1658, 1546, 4116, 7498, 3532, 3533, 7499, 4117, 3327, 2684, 1685, 4118, 961, 1673, # 4470
- 2622, 190, 2005, 2200, 3762, 4371, 4372, 7500, 570, 2497, 3645, 1490, 7501, 4373, 2623, 3260, # 4486
- 1956, 4374, 584, 1514, 396, 1045, 1944, 7502, 4375, 1967, 2444, 7503, 7504, 4376, 3910, 619, # 4502
- 7505, 3129, 3261, 215, 2006, 2783, 2553, 3189, 4377, 3190, 4378, 763, 4119, 3763, 4379, 7506, # 4518
- 7507, 1957, 1767, 2941, 3328, 3646, 1174, 452, 1477, 4380, 3329, 3130, 7508, 2825, 1253, 2382, # 4534
- 2186, 1091, 2285, 4120, 492, 7509, 638, 1169, 1824, 2135, 1752, 3911, 648, 926, 1021, 1324, # 4550
- 4381, 520, 4382, 997, 847, 1007, 892, 4383, 3764, 2262, 1871, 3647, 7510, 2400, 1784, 4384, # 4566
- 1952, 2942, 3080, 3191, 1728, 4121, 2043, 3648, 4385, 2007, 1701, 3131, 1551, 30, 2263, 4122, # 4582
- 7511, 2026, 4386, 3534, 7512, 501, 7513, 4123, 594, 3431, 2165, 1821, 3535, 3432, 3536, 3192, # 4598
- 829, 2826, 4124, 7514, 1680, 3132, 1225, 4125, 7515, 3262, 4387, 4126, 3133, 2336, 7516, 4388, # 4614
- 4127, 7517, 3912, 3913, 7518, 1847, 2383, 2596, 3330, 7519, 4389, 374, 3914, 652, 4128, 4129, # 4630
- 375, 1140, 798, 7520, 7521, 7522, 2361, 4390, 2264, 546, 1659, 138, 3031, 2445, 4391, 7523, # 4646
- 2250, 612, 1848, 910, 796, 3765, 1740, 1371, 825, 3766, 3767, 7524, 2906, 2554, 7525, 692, # 4662
- 444, 3032, 2624, 801, 4392, 4130, 7526, 1491, 244, 1053, 3033, 4131, 4132, 340, 7527, 3915, # 4678
- 1041, 2987, 293, 1168, 87, 1357, 7528, 1539, 959, 7529, 2236, 721, 694, 4133, 3768, 219, # 4694
- 1478, 644, 1417, 3331, 2656, 1413, 1401, 1335, 1389, 3916, 7530, 7531, 2988, 2362, 3134, 1825, # 4710
- 730, 1515, 184, 2827, 66, 4393, 7532, 1660, 2943, 246, 3332, 378, 1457, 226, 3433, 975, # 4726
- 3917, 2944, 1264, 3537, 674, 696, 7533, 163, 7534, 1141, 2417, 2166, 713, 3538, 3333, 4394, # 4742
- 3918, 7535, 7536, 1186, 15, 7537, 1079, 1070, 7538, 1522, 3193, 3539, 276, 1050, 2716, 758, # 4758
- 1126, 653, 2945, 3263, 7539, 2337, 889, 3540, 3919, 3081, 2989, 903, 1250, 4395, 3920, 3434, # 4774
- 3541, 1342, 1681, 1718, 766, 3264, 286, 89, 2946, 3649, 7540, 1713, 7541, 2597, 3334, 2990, # 4790
- 7542, 2947, 2215, 3194, 2866, 7543, 4396, 2498, 2526, 181, 387, 1075, 3921, 731, 2187, 3335, # 4806
- 7544, 3265, 310, 313, 3435, 2299, 770, 4134, 54, 3034, 189, 4397, 3082, 3769, 3922, 7545, # 4822
- 1230, 1617, 1849, 355, 3542, 4135, 4398, 3336, 111, 4136, 3650, 1350, 3135, 3436, 3035, 4137, # 4838
- 2149, 3266, 3543, 7546, 2784, 3923, 3924, 2991, 722, 2008, 7547, 1071, 247, 1207, 2338, 2471, # 4854
- 1378, 4399, 2009, 864, 1437, 1214, 4400, 373, 3770, 1142, 2216, 667, 4401, 442, 2753, 2555, # 4870
- 3771, 3925, 1968, 4138, 3267, 1839, 837, 170, 1107, 934, 1336, 1882, 7548, 7549, 2118, 4139, # 4886
- 2828, 743, 1569, 7550, 4402, 4140, 582, 2384, 1418, 3437, 7551, 1802, 7552, 357, 1395, 1729, # 4902
- 3651, 3268, 2418, 1564, 2237, 7553, 3083, 3772, 1633, 4403, 1114, 2085, 4141, 1532, 7554, 482, # 4918
- 2446, 4404, 7555, 7556, 1492, 833, 1466, 7557, 2717, 3544, 1641, 2829, 7558, 1526, 1272, 3652, # 4934
- 4142, 1686, 1794, 416, 2556, 1902, 1953, 1803, 7559, 3773, 2785, 3774, 1159, 2316, 7560, 2867, # 4950
- 4405, 1610, 1584, 3036, 2419, 2754, 443, 3269, 1163, 3136, 7561, 7562, 3926, 7563, 4143, 2499, # 4966
- 3037, 4406, 3927, 3137, 2103, 1647, 3545, 2010, 1872, 4144, 7564, 4145, 431, 3438, 7565, 250, # 4982
- 97, 81, 4146, 7566, 1648, 1850, 1558, 160, 848, 7567, 866, 740, 1694, 7568, 2201, 2830, # 4998
- 3195, 4147, 4407, 3653, 1687, 950, 2472, 426, 469, 3196, 3654, 3655, 3928, 7569, 7570, 1188, # 5014
- 424, 1995, 861, 3546, 4148, 3775, 2202, 2685, 168, 1235, 3547, 4149, 7571, 2086, 1674, 4408, # 5030
- 3337, 3270, 220, 2557, 1009, 7572, 3776, 670, 2992, 332, 1208, 717, 7573, 7574, 3548, 2447, # 5046
- 3929, 3338, 7575, 513, 7576, 1209, 2868, 3339, 3138, 4409, 1080, 7577, 7578, 7579, 7580, 2527, # 5062
- 3656, 3549, 815, 1587, 3930, 3931, 7581, 3550, 3439, 3777, 1254, 4410, 1328, 3038, 1390, 3932, # 5078
- 1741, 3933, 3778, 3934, 7582, 236, 3779, 2448, 3271, 7583, 7584, 3657, 3780, 1273, 3781, 4411, # 5094
- 7585, 308, 7586, 4412, 245, 4413, 1851, 2473, 1307, 2575, 430, 715, 2136, 2449, 7587, 270, # 5110
- 199, 2869, 3935, 7588, 3551, 2718, 1753, 761, 1754, 725, 1661, 1840, 4414, 3440, 3658, 7589, # 5126
- 7590, 587, 14, 3272, 227, 2598, 326, 480, 2265, 943, 2755, 3552, 291, 650, 1883, 7591, # 5142
- 1702, 1226, 102, 1547, 62, 3441, 904, 4415, 3442, 1164, 4150, 7592, 7593, 1224, 1548, 2756, # 5158
- 391, 498, 1493, 7594, 1386, 1419, 7595, 2055, 1177, 4416, 813, 880, 1081, 2363, 566, 1145, # 5174
- 4417, 2286, 1001, 1035, 2558, 2599, 2238, 394, 1286, 7596, 7597, 2068, 7598, 86, 1494, 1730, # 5190
- 3936, 491, 1588, 745, 897, 2948, 843, 3340, 3937, 2757, 2870, 3273, 1768, 998, 2217, 2069, # 5206
- 397, 1826, 1195, 1969, 3659, 2993, 3341, 284, 7599, 3782, 2500, 2137, 2119, 1903, 7600, 3938, # 5222
- 2150, 3939, 4151, 1036, 3443, 1904, 114, 2559, 4152, 209, 1527, 7601, 7602, 2949, 2831, 2625, # 5238
- 2385, 2719, 3139, 812, 2560, 7603, 3274, 7604, 1559, 737, 1884, 3660, 1210, 885, 28, 2686, # 5254
- 3553, 3783, 7605, 4153, 1004, 1779, 4418, 7606, 346, 1981, 2218, 2687, 4419, 3784, 1742, 797, # 5270
- 1642, 3940, 1933, 1072, 1384, 2151, 896, 3941, 3275, 3661, 3197, 2871, 3554, 7607, 2561, 1958, # 5286
- 4420, 2450, 1785, 7608, 7609, 7610, 3942, 4154, 1005, 1308, 3662, 4155, 2720, 4421, 4422, 1528, # 5302
- 2600, 161, 1178, 4156, 1982, 987, 4423, 1101, 4157, 631, 3943, 1157, 3198, 2420, 1343, 1241, # 5318
- 1016, 2239, 2562, 372, 877, 2339, 2501, 1160, 555, 1934, 911, 3944, 7611, 466, 1170, 169, # 5334
- 1051, 2907, 2688, 3663, 2474, 2994, 1182, 2011, 2563, 1251, 2626, 7612, 992, 2340, 3444, 1540, # 5350
- 2721, 1201, 2070, 2401, 1996, 2475, 7613, 4424, 528, 1922, 2188, 1503, 1873, 1570, 2364, 3342, # 5366
- 3276, 7614, 557, 1073, 7615, 1827, 3445, 2087, 2266, 3140, 3039, 3084, 767, 3085, 2786, 4425, # 5382
- 1006, 4158, 4426, 2341, 1267, 2176, 3664, 3199, 778, 3945, 3200, 2722, 1597, 2657, 7616, 4427, # 5398
- 7617, 3446, 7618, 7619, 7620, 3277, 2689, 1433, 3278, 131, 95, 1504, 3946, 723, 4159, 3141, # 5414
- 1841, 3555, 2758, 2189, 3947, 2027, 2104, 3665, 7621, 2995, 3948, 1218, 7622, 3343, 3201, 3949, # 5430
- 4160, 2576, 248, 1634, 3785, 912, 7623, 2832, 3666, 3040, 3786, 654, 53, 7624, 2996, 7625, # 5446
- 1688, 4428, 777, 3447, 1032, 3950, 1425, 7626, 191, 820, 2120, 2833, 971, 4429, 931, 3202, # 5462
- 135, 664, 783, 3787, 1997, 772, 2908, 1935, 3951, 3788, 4430, 2909, 3203, 282, 2723, 640, # 5478
- 1372, 3448, 1127, 922, 325, 3344, 7627, 7628, 711, 2044, 7629, 7630, 3952, 2219, 2787, 1936, # 5494
- 3953, 3345, 2220, 2251, 3789, 2300, 7631, 4431, 3790, 1258, 3279, 3954, 3204, 2138, 2950, 3955, # 5510
- 3956, 7632, 2221, 258, 3205, 4432, 101, 1227, 7633, 3280, 1755, 7634, 1391, 3281, 7635, 2910, # 5526
- 2056, 893, 7636, 7637, 7638, 1402, 4161, 2342, 7639, 7640, 3206, 3556, 7641, 7642, 878, 1325, # 5542
- 1780, 2788, 4433, 259, 1385, 2577, 744, 1183, 2267, 4434, 7643, 3957, 2502, 7644, 684, 1024, # 5558
- 4162, 7645, 472, 3557, 3449, 1165, 3282, 3958, 3959, 322, 2152, 881, 455, 1695, 1152, 1340, # 5574
- 660, 554, 2153, 4435, 1058, 4436, 4163, 830, 1065, 3346, 3960, 4437, 1923, 7646, 1703, 1918, # 5590
- 7647, 932, 2268, 122, 7648, 4438, 947, 677, 7649, 3791, 2627, 297, 1905, 1924, 2269, 4439, # 5606
- 2317, 3283, 7650, 7651, 4164, 7652, 4165, 84, 4166, 112, 989, 7653, 547, 1059, 3961, 701, # 5622
- 3558, 1019, 7654, 4167, 7655, 3450, 942, 639, 457, 2301, 2451, 993, 2951, 407, 851, 494, # 5638
- 4440, 3347, 927, 7656, 1237, 7657, 2421, 3348, 573, 4168, 680, 921, 2911, 1279, 1874, 285, # 5654
- 790, 1448, 1983, 719, 2167, 7658, 7659, 4441, 3962, 3963, 1649, 7660, 1541, 563, 7661, 1077, # 5670
- 7662, 3349, 3041, 3451, 511, 2997, 3964, 3965, 3667, 3966, 1268, 2564, 3350, 3207, 4442, 4443, # 5686
- 7663, 535, 1048, 1276, 1189, 2912, 2028, 3142, 1438, 1373, 2834, 2952, 1134, 2012, 7664, 4169, # 5702
- 1238, 2578, 3086, 1259, 7665, 700, 7666, 2953, 3143, 3668, 4170, 7667, 4171, 1146, 1875, 1906, # 5718
- 4444, 2601, 3967, 781, 2422, 132, 1589, 203, 147, 273, 2789, 2402, 898, 1786, 2154, 3968, # 5734
- 3969, 7668, 3792, 2790, 7669, 7670, 4445, 4446, 7671, 3208, 7672, 1635, 3793, 965, 7673, 1804, # 5750
- 2690, 1516, 3559, 1121, 1082, 1329, 3284, 3970, 1449, 3794, 65, 1128, 2835, 2913, 2759, 1590, # 5766
- 3795, 7674, 7675, 12, 2658, 45, 976, 2579, 3144, 4447, 517, 2528, 1013, 1037, 3209, 7676, # 5782
- 3796, 2836, 7677, 3797, 7678, 3452, 7679, 2602, 614, 1998, 2318, 3798, 3087, 2724, 2628, 7680, # 5798
- 2580, 4172, 599, 1269, 7681, 1810, 3669, 7682, 2691, 3088, 759, 1060, 489, 1805, 3351, 3285, # 5814
- 1358, 7683, 7684, 2386, 1387, 1215, 2629, 2252, 490, 7685, 7686, 4173, 1759, 2387, 2343, 7687, # 5830
- 4448, 3799, 1907, 3971, 2630, 1806, 3210, 4449, 3453, 3286, 2760, 2344, 874, 7688, 7689, 3454, # 5846
- 3670, 1858, 91, 2914, 3671, 3042, 3800, 4450, 7690, 3145, 3972, 2659, 7691, 3455, 1202, 1403, # 5862
- 3801, 2954, 2529, 1517, 2503, 4451, 3456, 2504, 7692, 4452, 7693, 2692, 1885, 1495, 1731, 3973, # 5878
- 2365, 4453, 7694, 2029, 7695, 7696, 3974, 2693, 1216, 237, 2581, 4174, 2319, 3975, 3802, 4454, # 5894
- 4455, 2694, 3560, 3457, 445, 4456, 7697, 7698, 7699, 7700, 2761, 61, 3976, 3672, 1822, 3977, # 5910
- 7701, 687, 2045, 935, 925, 405, 2660, 703, 1096, 1859, 2725, 4457, 3978, 1876, 1367, 2695, # 5926
- 3352, 918, 2105, 1781, 2476, 334, 3287, 1611, 1093, 4458, 564, 3146, 3458, 3673, 3353, 945, # 5942
- 2631, 2057, 4459, 7702, 1925, 872, 4175, 7703, 3459, 2696, 3089, 349, 4176, 3674, 3979, 4460, # 5958
- 3803, 4177, 3675, 2155, 3980, 4461, 4462, 4178, 4463, 2403, 2046, 782, 3981, 400, 251, 4179, # 5974
- 1624, 7704, 7705, 277, 3676, 299, 1265, 476, 1191, 3804, 2121, 4180, 4181, 1109, 205, 7706, # 5990
- 2582, 1000, 2156, 3561, 1860, 7707, 7708, 7709, 4464, 7710, 4465, 2565, 107, 2477, 2157, 3982, # 6006
- 3460, 3147, 7711, 1533, 541, 1301, 158, 753, 4182, 2872, 3562, 7712, 1696, 370, 1088, 4183, # 6022
- 4466, 3563, 579, 327, 440, 162, 2240, 269, 1937, 1374, 3461, 968, 3043, 56, 1396, 3090, # 6038
- 2106, 3288, 3354, 7713, 1926, 2158, 4467, 2998, 7714, 3564, 7715, 7716, 3677, 4468, 2478, 7717, # 6054
- 2791, 7718, 1650, 4469, 7719, 2603, 7720, 7721, 3983, 2661, 3355, 1149, 3356, 3984, 3805, 3985, # 6070
- 7722, 1076, 49, 7723, 951, 3211, 3289, 3290, 450, 2837, 920, 7724, 1811, 2792, 2366, 4184, # 6086
- 1908, 1138, 2367, 3806, 3462, 7725, 3212, 4470, 1909, 1147, 1518, 2423, 4471, 3807, 7726, 4472, # 6102
- 2388, 2604, 260, 1795, 3213, 7727, 7728, 3808, 3291, 708, 7729, 3565, 1704, 7730, 3566, 1351, # 6118
- 1618, 3357, 2999, 1886, 944, 4185, 3358, 4186, 3044, 3359, 4187, 7731, 3678, 422, 413, 1714, # 6134
- 3292, 500, 2058, 2345, 4188, 2479, 7732, 1344, 1910, 954, 7733, 1668, 7734, 7735, 3986, 2404, # 6150
- 4189, 3567, 3809, 4190, 7736, 2302, 1318, 2505, 3091, 133, 3092, 2873, 4473, 629, 31, 2838, # 6166
- 2697, 3810, 4474, 850, 949, 4475, 3987, 2955, 1732, 2088, 4191, 1496, 1852, 7737, 3988, 620, # 6182
- 3214, 981, 1242, 3679, 3360, 1619, 3680, 1643, 3293, 2139, 2452, 1970, 1719, 3463, 2168, 7738, # 6198
- 3215, 7739, 7740, 3361, 1828, 7741, 1277, 4476, 1565, 2047, 7742, 1636, 3568, 3093, 7743, 869, # 6214
- 2839, 655, 3811, 3812, 3094, 3989, 3000, 3813, 1310, 3569, 4477, 7744, 7745, 7746, 1733, 558, # 6230
- 4478, 3681, 335, 1549, 3045, 1756, 4192, 3682, 1945, 3464, 1829, 1291, 1192, 470, 2726, 2107, # 6246
- 2793, 913, 1054, 3990, 7747, 1027, 7748, 3046, 3991, 4479, 982, 2662, 3362, 3148, 3465, 3216, # 6262
- 3217, 1946, 2794, 7749, 571, 4480, 7750, 1830, 7751, 3570, 2583, 1523, 2424, 7752, 2089, 984, # 6278
- 4481, 3683, 1959, 7753, 3684, 852, 923, 2795, 3466, 3685, 969, 1519, 999, 2048, 2320, 1705, # 6294
- 7754, 3095, 615, 1662, 151, 597, 3992, 2405, 2321, 1049, 275, 4482, 3686, 4193, 568, 3687, # 6310
- 3571, 2480, 4194, 3688, 7755, 2425, 2270, 409, 3218, 7756, 1566, 2874, 3467, 1002, 769, 2840, # 6326
- 194, 2090, 3149, 3689, 2222, 3294, 4195, 628, 1505, 7757, 7758, 1763, 2177, 3001, 3993, 521, # 6342
- 1161, 2584, 1787, 2203, 2406, 4483, 3994, 1625, 4196, 4197, 412, 42, 3096, 464, 7759, 2632, # 6358
- 4484, 3363, 1760, 1571, 2875, 3468, 2530, 1219, 2204, 3814, 2633, 2140, 2368, 4485, 4486, 3295, # 6374
- 1651, 3364, 3572, 7760, 7761, 3573, 2481, 3469, 7762, 3690, 7763, 7764, 2271, 2091, 460, 7765, # 6390
- 4487, 7766, 3002, 962, 588, 3574, 289, 3219, 2634, 1116, 52, 7767, 3047, 1796, 7768, 7769, # 6406
- 7770, 1467, 7771, 1598, 1143, 3691, 4198, 1984, 1734, 1067, 4488, 1280, 3365, 465, 4489, 1572, # 6422
- 510, 7772, 1927, 2241, 1812, 1644, 3575, 7773, 4490, 3692, 7774, 7775, 2663, 1573, 1534, 7776, # 6438
- 7777, 4199, 536, 1807, 1761, 3470, 3815, 3150, 2635, 7778, 7779, 7780, 4491, 3471, 2915, 1911, # 6454
- 2796, 7781, 3296, 1122, 377, 3220, 7782, 360, 7783, 7784, 4200, 1529, 551, 7785, 2059, 3693, # 6470
- 1769, 2426, 7786, 2916, 4201, 3297, 3097, 2322, 2108, 2030, 4492, 1404, 136, 1468, 1479, 672, # 6486
- 1171, 3221, 2303, 271, 3151, 7787, 2762, 7788, 2049, 678, 2727, 865, 1947, 4493, 7789, 2013, # 6502
- 3995, 2956, 7790, 2728, 2223, 1397, 3048, 3694, 4494, 4495, 1735, 2917, 3366, 3576, 7791, 3816, # 6518
- 509, 2841, 2453, 2876, 3817, 7792, 7793, 3152, 3153, 4496, 4202, 2531, 4497, 2304, 1166, 1010, # 6534
- 552, 681, 1887, 7794, 7795, 2957, 2958, 3996, 1287, 1596, 1861, 3154, 358, 453, 736, 175, # 6550
- 478, 1117, 905, 1167, 1097, 7796, 1853, 1530, 7797, 1706, 7798, 2178, 3472, 2287, 3695, 3473, # 6566
- 3577, 4203, 2092, 4204, 7799, 3367, 1193, 2482, 4205, 1458, 2190, 2205, 1862, 1888, 1421, 3298, # 6582
- 2918, 3049, 2179, 3474, 595, 2122, 7800, 3997, 7801, 7802, 4206, 1707, 2636, 223, 3696, 1359, # 6598
- 751, 3098, 183, 3475, 7803, 2797, 3003, 419, 2369, 633, 704, 3818, 2389, 241, 7804, 7805, # 6614
- 7806, 838, 3004, 3697, 2272, 2763, 2454, 3819, 1938, 2050, 3998, 1309, 3099, 2242, 1181, 7807, # 6630
- 1136, 2206, 3820, 2370, 1446, 4207, 2305, 4498, 7808, 7809, 4208, 1055, 2605, 484, 3698, 7810, # 6646
- 3999, 625, 4209, 2273, 3368, 1499, 4210, 4000, 7811, 4001, 4211, 3222, 2274, 2275, 3476, 7812, # 6662
- 7813, 2764, 808, 2606, 3699, 3369, 4002, 4212, 3100, 2532, 526, 3370, 3821, 4213, 955, 7814, # 6678
- 1620, 4214, 2637, 2427, 7815, 1429, 3700, 1669, 1831, 994, 928, 7816, 3578, 1260, 7817, 7818, # 6694
- 7819, 1948, 2288, 741, 2919, 1626, 4215, 2729, 2455, 867, 1184, 362, 3371, 1392, 7820, 7821, # 6710
- 4003, 4216, 1770, 1736, 3223, 2920, 4499, 4500, 1928, 2698, 1459, 1158, 7822, 3050, 3372, 2877, # 6726
- 1292, 1929, 2506, 2842, 3701, 1985, 1187, 2071, 2014, 2607, 4217, 7823, 2566, 2507, 2169, 3702, # 6742
- 2483, 3299, 7824, 3703, 4501, 7825, 7826, 666, 1003, 3005, 1022, 3579, 4218, 7827, 4502, 1813, # 6758
- 2253, 574, 3822, 1603, 295, 1535, 705, 3823, 4219, 283, 858, 417, 7828, 7829, 3224, 4503, # 6774
- 4504, 3051, 1220, 1889, 1046, 2276, 2456, 4004, 1393, 1599, 689, 2567, 388, 4220, 7830, 2484, # 6790
- 802, 7831, 2798, 3824, 2060, 1405, 2254, 7832, 4505, 3825, 2109, 1052, 1345, 3225, 1585, 7833, # 6806
- 809, 7834, 7835, 7836, 575, 2730, 3477, 956, 1552, 1469, 1144, 2323, 7837, 2324, 1560, 2457, # 6822
- 3580, 3226, 4005, 616, 2207, 3155, 2180, 2289, 7838, 1832, 7839, 3478, 4506, 7840, 1319, 3704, # 6838
- 3705, 1211, 3581, 1023, 3227, 1293, 2799, 7841, 7842, 7843, 3826, 607, 2306, 3827, 762, 2878, # 6854
- 1439, 4221, 1360, 7844, 1485, 3052, 7845, 4507, 1038, 4222, 1450, 2061, 2638, 4223, 1379, 4508, # 6870
- 2585, 7846, 7847, 4224, 1352, 1414, 2325, 2921, 1172, 7848, 7849, 3828, 3829, 7850, 1797, 1451, # 6886
- 7851, 7852, 7853, 7854, 2922, 4006, 4007, 2485, 2346, 411, 4008, 4009, 3582, 3300, 3101, 4509, # 6902
- 1561, 2664, 1452, 4010, 1375, 7855, 7856, 47, 2959, 316, 7857, 1406, 1591, 2923, 3156, 7858, # 6918
- 1025, 2141, 3102, 3157, 354, 2731, 884, 2224, 4225, 2407, 508, 3706, 726, 3583, 996, 2428, # 6934
- 3584, 729, 7859, 392, 2191, 1453, 4011, 4510, 3707, 7860, 7861, 2458, 3585, 2608, 1675, 2800, # 6950
- 919, 2347, 2960, 2348, 1270, 4511, 4012, 73, 7862, 7863, 647, 7864, 3228, 2843, 2255, 1550, # 6966
- 1346, 3006, 7865, 1332, 883, 3479, 7866, 7867, 7868, 7869, 3301, 2765, 7870, 1212, 831, 1347, # 6982
- 4226, 4512, 2326, 3830, 1863, 3053, 720, 3831, 4513, 4514, 3832, 7871, 4227, 7872, 7873, 4515, # 6998
- 7874, 7875, 1798, 4516, 3708, 2609, 4517, 3586, 1645, 2371, 7876, 7877, 2924, 669, 2208, 2665, # 7014
- 2429, 7878, 2879, 7879, 7880, 1028, 3229, 7881, 4228, 2408, 7882, 2256, 1353, 7883, 7884, 4518, # 7030
- 3158, 518, 7885, 4013, 7886, 4229, 1960, 7887, 2142, 4230, 7888, 7889, 3007, 2349, 2350, 3833, # 7046
- 516, 1833, 1454, 4014, 2699, 4231, 4519, 2225, 2610, 1971, 1129, 3587, 7890, 2766, 7891, 2961, # 7062
- 1422, 577, 1470, 3008, 1524, 3373, 7892, 7893, 432, 4232, 3054, 3480, 7894, 2586, 1455, 2508, # 7078
- 2226, 1972, 1175, 7895, 1020, 2732, 4015, 3481, 4520, 7896, 2733, 7897, 1743, 1361, 3055, 3482, # 7094
- 2639, 4016, 4233, 4521, 2290, 895, 924, 4234, 2170, 331, 2243, 3056, 166, 1627, 3057, 1098, # 7110
- 7898, 1232, 2880, 2227, 3374, 4522, 657, 403, 1196, 2372, 542, 3709, 3375, 1600, 4235, 3483, # 7126
- 7899, 4523, 2767, 3230, 576, 530, 1362, 7900, 4524, 2533, 2666, 3710, 4017, 7901, 842, 3834, # 7142
- 7902, 2801, 2031, 1014, 4018, 213, 2700, 3376, 665, 621, 4236, 7903, 3711, 2925, 2430, 7904, # 7158
- 2431, 3302, 3588, 3377, 7905, 4237, 2534, 4238, 4525, 3589, 1682, 4239, 3484, 1380, 7906, 724, # 7174
- 2277, 600, 1670, 7907, 1337, 1233, 4526, 3103, 2244, 7908, 1621, 4527, 7909, 651, 4240, 7910, # 7190
- 1612, 4241, 2611, 7911, 2844, 7912, 2734, 2307, 3058, 7913, 716, 2459, 3059, 174, 1255, 2701, # 7206
- 4019, 3590, 548, 1320, 1398, 728, 4020, 1574, 7914, 1890, 1197, 3060, 4021, 7915, 3061, 3062, # 7222
- 3712, 3591, 3713, 747, 7916, 635, 4242, 4528, 7917, 7918, 7919, 4243, 7920, 7921, 4529, 7922, # 7238
- 3378, 4530, 2432, 451, 7923, 3714, 2535, 2072, 4244, 2735, 4245, 4022, 7924, 1764, 4531, 7925, # 7254
- 4246, 350, 7926, 2278, 2390, 2486, 7927, 4247, 4023, 2245, 1434, 4024, 488, 4532, 458, 4248, # 7270
- 4025, 3715, 771, 1330, 2391, 3835, 2568, 3159, 2159, 2409, 1553, 2667, 3160, 4249, 7928, 2487, # 7286
- 2881, 2612, 1720, 2702, 4250, 3379, 4533, 7929, 2536, 4251, 7930, 3231, 4252, 2768, 7931, 2015, # 7302
- 2736, 7932, 1155, 1017, 3716, 3836, 7933, 3303, 2308, 201, 1864, 4253, 1430, 7934, 4026, 7935, # 7318
- 7936, 7937, 7938, 7939, 4254, 1604, 7940, 414, 1865, 371, 2587, 4534, 4535, 3485, 2016, 3104, # 7334
- 4536, 1708, 960, 4255, 887, 389, 2171, 1536, 1663, 1721, 7941, 2228, 4027, 2351, 2926, 1580, # 7350
- 7942, 7943, 7944, 1744, 7945, 2537, 4537, 4538, 7946, 4539, 7947, 2073, 7948, 7949, 3592, 3380, # 7366
- 2882, 4256, 7950, 4257, 2640, 3381, 2802, 673, 2703, 2460, 709, 3486, 4028, 3593, 4258, 7951, # 7382
- 1148, 502, 634, 7952, 7953, 1204, 4540, 3594, 1575, 4541, 2613, 3717, 7954, 3718, 3105, 948, # 7398
- 3232, 121, 1745, 3837, 1110, 7955, 4259, 3063, 2509, 3009, 4029, 3719, 1151, 1771, 3838, 1488, # 7414
- 4030, 1986, 7956, 2433, 3487, 7957, 7958, 2093, 7959, 4260, 3839, 1213, 1407, 2803, 531, 2737, # 7430
- 2538, 3233, 1011, 1537, 7960, 2769, 4261, 3106, 1061, 7961, 3720, 3721, 1866, 2883, 7962, 2017, # 7446
- 120, 4262, 4263, 2062, 3595, 3234, 2309, 3840, 2668, 3382, 1954, 4542, 7963, 7964, 3488, 1047, # 7462
- 2704, 1266, 7965, 1368, 4543, 2845, 649, 3383, 3841, 2539, 2738, 1102, 2846, 2669, 7966, 7967, # 7478
- 1999, 7968, 1111, 3596, 2962, 7969, 2488, 3842, 3597, 2804, 1854, 3384, 3722, 7970, 7971, 3385, # 7494
- 2410, 2884, 3304, 3235, 3598, 7972, 2569, 7973, 3599, 2805, 4031, 1460, 856, 7974, 3600, 7975, # 7510
- 2885, 2963, 7976, 2886, 3843, 7977, 4264, 632, 2510, 875, 3844, 1697, 3845, 2291, 7978, 7979, # 7526
- 4544, 3010, 1239, 580, 4545, 4265, 7980, 914, 936, 2074, 1190, 4032, 1039, 2123, 7981, 7982, # 7542
- 7983, 3386, 1473, 7984, 1354, 4266, 3846, 7985, 2172, 3064, 4033, 915, 3305, 4267, 4268, 3306, # 7558
- 1605, 1834, 7986, 2739, 398, 3601, 4269, 3847, 4034, 328, 1912, 2847, 4035, 3848, 1331, 4270, # 7574
- 3011, 937, 4271, 7987, 3602, 4036, 4037, 3387, 2160, 4546, 3388, 524, 742, 538, 3065, 1012, # 7590
- 7988, 7989, 3849, 2461, 7990, 658, 1103, 225, 3850, 7991, 7992, 4547, 7993, 4548, 7994, 3236, # 7606
- 1243, 7995, 4038, 963, 2246, 4549, 7996, 2705, 3603, 3161, 7997, 7998, 2588, 2327, 7999, 4550, # 7622
- 8000, 8001, 8002, 3489, 3307, 957, 3389, 2540, 2032, 1930, 2927, 2462, 870, 2018, 3604, 1746, # 7638
- 2770, 2771, 2434, 2463, 8003, 3851, 8004, 3723, 3107, 3724, 3490, 3390, 3725, 8005, 1179, 3066, # 7654
- 8006, 3162, 2373, 4272, 3726, 2541, 3163, 3108, 2740, 4039, 8007, 3391, 1556, 2542, 2292, 977, # 7670
- 2887, 2033, 4040, 1205, 3392, 8008, 1765, 3393, 3164, 2124, 1271, 1689, 714, 4551, 3491, 8009, # 7686
- 2328, 3852, 533, 4273, 3605, 2181, 617, 8010, 2464, 3308, 3492, 2310, 8011, 8012, 3165, 8013, # 7702
- 8014, 3853, 1987, 618, 427, 2641, 3493, 3394, 8015, 8016, 1244, 1690, 8017, 2806, 4274, 4552, # 7718
- 8018, 3494, 8019, 8020, 2279, 1576, 473, 3606, 4275, 3395, 972, 8021, 3607, 8022, 3067, 8023, # 7734
- 8024, 4553, 4554, 8025, 3727, 4041, 4042, 8026, 153, 4555, 356, 8027, 1891, 2888, 4276, 2143, # 7750
- 408, 803, 2352, 8028, 3854, 8029, 4277, 1646, 2570, 2511, 4556, 4557, 3855, 8030, 3856, 4278, # 7766
- 8031, 2411, 3396, 752, 8032, 8033, 1961, 2964, 8034, 746, 3012, 2465, 8035, 4279, 3728, 698, # 7782
- 4558, 1892, 4280, 3608, 2543, 4559, 3609, 3857, 8036, 3166, 3397, 8037, 1823, 1302, 4043, 2706, # 7798
- 3858, 1973, 4281, 8038, 4282, 3167, 823, 1303, 1288, 1236, 2848, 3495, 4044, 3398, 774, 3859, # 7814
- 8039, 1581, 4560, 1304, 2849, 3860, 4561, 8040, 2435, 2161, 1083, 3237, 4283, 4045, 4284, 344, # 7830
- 1173, 288, 2311, 454, 1683, 8041, 8042, 1461, 4562, 4046, 2589, 8043, 8044, 4563, 985, 894, # 7846
- 8045, 3399, 3168, 8046, 1913, 2928, 3729, 1988, 8047, 2110, 1974, 8048, 4047, 8049, 2571, 1194, # 7862
- 425, 8050, 4564, 3169, 1245, 3730, 4285, 8051, 8052, 2850, 8053, 636, 4565, 1855, 3861, 760, # 7878
- 1799, 8054, 4286, 2209, 1508, 4566, 4048, 1893, 1684, 2293, 8055, 8056, 8057, 4287, 4288, 2210, # 7894
- 479, 8058, 8059, 832, 8060, 4049, 2489, 8061, 2965, 2490, 3731, 990, 3109, 627, 1814, 2642, # 7910
- 4289, 1582, 4290, 2125, 2111, 3496, 4567, 8062, 799, 4291, 3170, 8063, 4568, 2112, 1737, 3013, # 7926
- 1018, 543, 754, 4292, 3309, 1676, 4569, 4570, 4050, 8064, 1489, 8065, 3497, 8066, 2614, 2889, # 7942
- 4051, 8067, 8068, 2966, 8069, 8070, 8071, 8072, 3171, 4571, 4572, 2182, 1722, 8073, 3238, 3239, # 7958
- 1842, 3610, 1715, 481, 365, 1975, 1856, 8074, 8075, 1962, 2491, 4573, 8076, 2126, 3611, 3240, # 7974
- 433, 1894, 2063, 2075, 8077, 602, 2741, 8078, 8079, 8080, 8081, 8082, 3014, 1628, 3400, 8083, # 7990
- 3172, 4574, 4052, 2890, 4575, 2512, 8084, 2544, 2772, 8085, 8086, 8087, 3310, 4576, 2891, 8088, # 8006
- 4577, 8089, 2851, 4578, 4579, 1221, 2967, 4053, 2513, 8090, 8091, 8092, 1867, 1989, 8093, 8094, # 8022
- 8095, 1895, 8096, 8097, 4580, 1896, 4054, 318, 8098, 2094, 4055, 4293, 8099, 8100, 485, 8101, # 8038
- 938, 3862, 553, 2670, 116, 8102, 3863, 3612, 8103, 3498, 2671, 2773, 3401, 3311, 2807, 8104, # 8054
- 3613, 2929, 4056, 1747, 2930, 2968, 8105, 8106, 207, 8107, 8108, 2672, 4581, 2514, 8109, 3015, # 8070
- 890, 3614, 3864, 8110, 1877, 3732, 3402, 8111, 2183, 2353, 3403, 1652, 8112, 8113, 8114, 941, # 8086
- 2294, 208, 3499, 4057, 2019, 330, 4294, 3865, 2892, 2492, 3733, 4295, 8115, 8116, 8117, 8118, # 8102
-)
-# fmt: on
diff --git a/contrib/python/pip/pip/_vendor/chardet/euctwprober.py b/contrib/python/pip/pip/_vendor/chardet/euctwprober.py
deleted file mode 100644
index a37ab18995..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/euctwprober.py
+++ /dev/null
@@ -1,47 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .chardistribution import EUCTWDistributionAnalysis
-from .codingstatemachine import CodingStateMachine
-from .mbcharsetprober import MultiByteCharSetProber
-from .mbcssm import EUCTW_SM_MODEL
-
-
-class EUCTWProber(MultiByteCharSetProber):
- def __init__(self) -> None:
- super().__init__()
- self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL)
- self.distribution_analyzer = EUCTWDistributionAnalysis()
- self.reset()
-
- @property
- def charset_name(self) -> str:
- return "EUC-TW"
-
- @property
- def language(self) -> str:
- return "Taiwan"
diff --git a/contrib/python/pip/pip/_vendor/chardet/gb2312freq.py b/contrib/python/pip/pip/_vendor/chardet/gb2312freq.py
deleted file mode 100644
index b32bfc7421..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/gb2312freq.py
+++ /dev/null
@@ -1,284 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-# GB2312 most frequently used character table
-#
-# Char to FreqOrder table , from hz6763
-
-# 512 --> 0.79 -- 0.79
-# 1024 --> 0.92 -- 0.13
-# 2048 --> 0.98 -- 0.06
-# 6768 --> 1.00 -- 0.02
-#
-# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79
-# Random Distribution Ration = 512 / (3755 - 512) = 0.157
-#
-# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR
-
-GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9
-
-GB2312_TABLE_SIZE = 3760
-
-# fmt: off
-GB2312_CHAR_TO_FREQ_ORDER = (
-1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205,
-2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842,
-2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409,
- 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670,
-1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820,
-1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585,
- 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566,
-1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575,
-2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853,
-3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061,
- 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155,
-1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406,
- 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816,
-2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606,
- 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023,
-2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414,
-1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513,
-3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052,
- 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570,
-1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575,
- 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250,
-2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506,
-1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26,
-3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835,
-1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686,
-2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054,
-1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894,
- 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105,
-3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403,
-3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694,
- 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873,
-3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940,
- 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121,
-1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648,
-3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992,
-2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233,
-1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157,
- 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807,
-1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094,
-4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258,
- 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478,
-3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152,
-3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909,
- 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272,
-1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221,
-2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252,
-1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301,
-1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254,
- 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070,
-3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461,
-3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360,
-4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124,
- 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535,
-3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243,
-1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713,
-1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071,
-4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442,
- 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946,
- 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257,
-3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180,
-1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427,
- 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781,
-1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724,
-2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937,
- 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943,
- 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789,
- 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552,
-3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246,
-4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451,
-3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310,
- 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860,
-2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297,
-2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780,
-2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745,
- 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936,
-2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032,
- 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657,
- 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414,
- 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976,
-3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436,
-2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254,
-2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536,
-1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238,
- 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059,
-2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741,
- 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447,
- 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601,
-1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269,
-1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894,
- 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173,
- 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994,
-1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956,
-2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437,
-3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154,
-2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240,
-2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143,
-2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634,
-3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472,
-1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541,
-1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143,
-2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312,
-1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414,
-3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754,
-1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424,
-1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302,
-3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739,
- 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004,
-2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484,
-1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739,
-4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535,
-1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641,
-1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307,
-3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573,
-1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533,
- 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965,
- 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99,
-1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280,
- 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505,
-1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012,
-1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039,
- 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982,
-3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530,
-4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392,
-3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656,
-2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220,
-2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766,
-1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535,
-3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728,
-2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338,
-1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627,
-1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885,
- 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411,
-2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671,
-2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162,
-3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774,
-4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524,
-3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346,
- 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040,
-3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188,
-2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280,
-1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131,
- 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947,
- 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970,
-3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814,
-4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557,
-2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997,
-1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972,
-1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369,
- 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376,
-1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480,
-3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610,
- 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128,
- 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769,
-1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207,
- 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392,
-1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623,
- 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782,
-2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650,
- 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478,
-2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773,
-2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007,
-1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323,
-1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598,
-2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961,
- 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302,
-1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409,
-1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683,
-2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191,
-2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616,
-3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302,
-1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774,
-4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147,
- 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731,
- 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464,
-3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377,
-1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315,
- 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557,
-3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903,
-1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060,
-4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261,
-1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092,
-2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810,
-1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708,
- 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658,
-1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871,
-3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503,
- 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229,
-2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112,
- 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504,
-1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389,
-1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27,
-1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542,
-3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861,
-2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845,
-3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700,
-3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469,
-3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582,
- 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999,
-2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274,
- 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020,
-2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601,
- 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628,
-1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31,
- 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668,
- 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778,
-1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169,
-3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667,
-3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881,
-1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276,
-1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320,
-3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751,
-2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432,
-2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772,
-1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843,
-3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116,
- 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904,
-4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652,
-1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664,
-2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770,
-3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283,
-3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626,
-1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713,
- 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333,
- 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062,
-2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555,
- 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014,
-1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510,
- 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015,
-1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459,
-1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390,
-1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238,
-1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232,
-1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624,
- 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189,
- 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512
-)
-# fmt: on
diff --git a/contrib/python/pip/pip/_vendor/chardet/gb2312prober.py b/contrib/python/pip/pip/_vendor/chardet/gb2312prober.py
deleted file mode 100644
index d423e7311e..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/gb2312prober.py
+++ /dev/null
@@ -1,47 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .chardistribution import GB2312DistributionAnalysis
-from .codingstatemachine import CodingStateMachine
-from .mbcharsetprober import MultiByteCharSetProber
-from .mbcssm import GB2312_SM_MODEL
-
-
-class GB2312Prober(MultiByteCharSetProber):
- def __init__(self) -> None:
- super().__init__()
- self.coding_sm = CodingStateMachine(GB2312_SM_MODEL)
- self.distribution_analyzer = GB2312DistributionAnalysis()
- self.reset()
-
- @property
- def charset_name(self) -> str:
- return "GB2312"
-
- @property
- def language(self) -> str:
- return "Chinese"
diff --git a/contrib/python/pip/pip/_vendor/chardet/hebrewprober.py b/contrib/python/pip/pip/_vendor/chardet/hebrewprober.py
deleted file mode 100644
index 785d0057bc..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/hebrewprober.py
+++ /dev/null
@@ -1,316 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Shy Shalom
-# Portions created by the Initial Developer are Copyright (C) 2005
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import Optional, Union
-
-from .charsetprober import CharSetProber
-from .enums import ProbingState
-from .sbcharsetprober import SingleByteCharSetProber
-
-# This prober doesn't actually recognize a language or a charset.
-# It is a helper prober for the use of the Hebrew model probers
-
-### General ideas of the Hebrew charset recognition ###
-#
-# Four main charsets exist in Hebrew:
-# "ISO-8859-8" - Visual Hebrew
-# "windows-1255" - Logical Hebrew
-# "ISO-8859-8-I" - Logical Hebrew
-# "x-mac-hebrew" - ?? Logical Hebrew ??
-#
-# Both "ISO" charsets use a completely identical set of code points, whereas
-# "windows-1255" and "x-mac-hebrew" are two different proper supersets of
-# these code points. windows-1255 defines additional characters in the range
-# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific
-# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6.
-# x-mac-hebrew defines similar additional code points but with a different
-# mapping.
-#
-# As far as an average Hebrew text with no diacritics is concerned, all four
-# charsets are identical with respect to code points. Meaning that for the
-# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters
-# (including final letters).
-#
-# The dominant difference between these charsets is their directionality.
-# "Visual" directionality means that the text is ordered as if the renderer is
-# not aware of a BIDI rendering algorithm. The renderer sees the text and
-# draws it from left to right. The text itself when ordered naturally is read
-# backwards. A buffer of Visual Hebrew generally looks like so:
-# "[last word of first line spelled backwards] [whole line ordered backwards
-# and spelled backwards] [first word of first line spelled backwards]
-# [end of line] [last word of second line] ... etc' "
-# adding punctuation marks, numbers and English text to visual text is
-# naturally also "visual" and from left to right.
-#
-# "Logical" directionality means the text is ordered "naturally" according to
-# the order it is read. It is the responsibility of the renderer to display
-# the text from right to left. A BIDI algorithm is used to place general
-# punctuation marks, numbers and English text in the text.
-#
-# Texts in x-mac-hebrew are almost impossible to find on the Internet. From
-# what little evidence I could find, it seems that its general directionality
-# is Logical.
-#
-# To sum up all of the above, the Hebrew probing mechanism knows about two
-# charsets:
-# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are
-# backwards while line order is natural. For charset recognition purposes
-# the line order is unimportant (In fact, for this implementation, even
-# word order is unimportant).
-# Logical Hebrew - "windows-1255" - normal, naturally ordered text.
-#
-# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be
-# specifically identified.
-# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew
-# that contain special punctuation marks or diacritics is displayed with
-# some unconverted characters showing as question marks. This problem might
-# be corrected using another model prober for x-mac-hebrew. Due to the fact
-# that x-mac-hebrew texts are so rare, writing another model prober isn't
-# worth the effort and performance hit.
-#
-#### The Prober ####
-#
-# The prober is divided between two SBCharSetProbers and a HebrewProber,
-# all of which are managed, created, fed data, inquired and deleted by the
-# SBCSGroupProber. The two SBCharSetProbers identify that the text is in
-# fact some kind of Hebrew, Logical or Visual. The final decision about which
-# one is it is made by the HebrewProber by combining final-letter scores
-# with the scores of the two SBCharSetProbers to produce a final answer.
-#
-# The SBCSGroupProber is responsible for stripping the original text of HTML
-# tags, English characters, numbers, low-ASCII punctuation characters, spaces
-# and new lines. It reduces any sequence of such characters to a single space.
-# The buffer fed to each prober in the SBCS group prober is pure text in
-# high-ASCII.
-# The two SBCharSetProbers (model probers) share the same language model:
-# Win1255Model.
-# The first SBCharSetProber uses the model normally as any other
-# SBCharSetProber does, to recognize windows-1255, upon which this model was
-# built. The second SBCharSetProber is told to make the pair-of-letter
-# lookup in the language model backwards. This in practice exactly simulates
-# a visual Hebrew model using the windows-1255 logical Hebrew model.
-#
-# The HebrewProber is not using any language model. All it does is look for
-# final-letter evidence suggesting the text is either logical Hebrew or visual
-# Hebrew. Disjointed from the model probers, the results of the HebrewProber
-# alone are meaningless. HebrewProber always returns 0.00 as confidence
-# since it never identifies a charset by itself. Instead, the pointer to the
-# HebrewProber is passed to the model probers as a helper "Name Prober".
-# When the Group prober receives a positive identification from any prober,
-# it asks for the name of the charset identified. If the prober queried is a
-# Hebrew model prober, the model prober forwards the call to the
-# HebrewProber to make the final decision. In the HebrewProber, the
-# decision is made according to the final-letters scores maintained and Both
-# model probers scores. The answer is returned in the form of the name of the
-# charset identified, either "windows-1255" or "ISO-8859-8".
-
-
-class HebrewProber(CharSetProber):
- SPACE = 0x20
- # windows-1255 / ISO-8859-8 code points of interest
- FINAL_KAF = 0xEA
- NORMAL_KAF = 0xEB
- FINAL_MEM = 0xED
- NORMAL_MEM = 0xEE
- FINAL_NUN = 0xEF
- NORMAL_NUN = 0xF0
- FINAL_PE = 0xF3
- NORMAL_PE = 0xF4
- FINAL_TSADI = 0xF5
- NORMAL_TSADI = 0xF6
-
- # Minimum Visual vs Logical final letter score difference.
- # If the difference is below this, don't rely solely on the final letter score
- # distance.
- MIN_FINAL_CHAR_DISTANCE = 5
-
- # Minimum Visual vs Logical model score difference.
- # If the difference is below this, don't rely at all on the model score
- # distance.
- MIN_MODEL_DISTANCE = 0.01
-
- VISUAL_HEBREW_NAME = "ISO-8859-8"
- LOGICAL_HEBREW_NAME = "windows-1255"
-
- def __init__(self) -> None:
- super().__init__()
- self._final_char_logical_score = 0
- self._final_char_visual_score = 0
- self._prev = self.SPACE
- self._before_prev = self.SPACE
- self._logical_prober: Optional[SingleByteCharSetProber] = None
- self._visual_prober: Optional[SingleByteCharSetProber] = None
- self.reset()
-
- def reset(self) -> None:
- self._final_char_logical_score = 0
- self._final_char_visual_score = 0
- # The two last characters seen in the previous buffer,
- # mPrev and mBeforePrev are initialized to space in order to simulate
- # a word delimiter at the beginning of the data
- self._prev = self.SPACE
- self._before_prev = self.SPACE
- # These probers are owned by the group prober.
-
- def set_model_probers(
- self,
- logical_prober: SingleByteCharSetProber,
- visual_prober: SingleByteCharSetProber,
- ) -> None:
- self._logical_prober = logical_prober
- self._visual_prober = visual_prober
-
- def is_final(self, c: int) -> bool:
- return c in [
- self.FINAL_KAF,
- self.FINAL_MEM,
- self.FINAL_NUN,
- self.FINAL_PE,
- self.FINAL_TSADI,
- ]
-
- def is_non_final(self, c: int) -> bool:
- # The normal Tsadi is not a good Non-Final letter due to words like
- # 'lechotet' (to chat) containing an apostrophe after the tsadi. This
- # apostrophe is converted to a space in FilterWithoutEnglishLetters
- # causing the Non-Final tsadi to appear at an end of a word even
- # though this is not the case in the original text.
- # The letters Pe and Kaf rarely display a related behavior of not being
- # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak'
- # for example legally end with a Non-Final Pe or Kaf. However, the
- # benefit of these letters as Non-Final letters outweighs the damage
- # since these words are quite rare.
- return c in [self.NORMAL_KAF, self.NORMAL_MEM, self.NORMAL_NUN, self.NORMAL_PE]
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- # Final letter analysis for logical-visual decision.
- # Look for evidence that the received buffer is either logical Hebrew
- # or visual Hebrew.
- # The following cases are checked:
- # 1) A word longer than 1 letter, ending with a final letter. This is
- # an indication that the text is laid out "naturally" since the
- # final letter really appears at the end. +1 for logical score.
- # 2) A word longer than 1 letter, ending with a Non-Final letter. In
- # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi,
- # should not end with the Non-Final form of that letter. Exceptions
- # to this rule are mentioned above in isNonFinal(). This is an
- # indication that the text is laid out backwards. +1 for visual
- # score
- # 3) A word longer than 1 letter, starting with a final letter. Final
- # letters should not appear at the beginning of a word. This is an
- # indication that the text is laid out backwards. +1 for visual
- # score.
- #
- # The visual score and logical score are accumulated throughout the
- # text and are finally checked against each other in GetCharSetName().
- # No checking for final letters in the middle of words is done since
- # that case is not an indication for either Logical or Visual text.
- #
- # We automatically filter out all 7-bit characters (replace them with
- # spaces) so the word boundary detection works properly. [MAP]
-
- if self.state == ProbingState.NOT_ME:
- # Both model probers say it's not them. No reason to continue.
- return ProbingState.NOT_ME
-
- byte_str = self.filter_high_byte_only(byte_str)
-
- for cur in byte_str:
- if cur == self.SPACE:
- # We stand on a space - a word just ended
- if self._before_prev != self.SPACE:
- # next-to-last char was not a space so self._prev is not a
- # 1 letter word
- if self.is_final(self._prev):
- # case (1) [-2:not space][-1:final letter][cur:space]
- self._final_char_logical_score += 1
- elif self.is_non_final(self._prev):
- # case (2) [-2:not space][-1:Non-Final letter][
- # cur:space]
- self._final_char_visual_score += 1
- else:
- # Not standing on a space
- if (
- (self._before_prev == self.SPACE)
- and (self.is_final(self._prev))
- and (cur != self.SPACE)
- ):
- # case (3) [-2:space][-1:final letter][cur:not space]
- self._final_char_visual_score += 1
- self._before_prev = self._prev
- self._prev = cur
-
- # Forever detecting, till the end or until both model probers return
- # ProbingState.NOT_ME (handled above)
- return ProbingState.DETECTING
-
- @property
- def charset_name(self) -> str:
- assert self._logical_prober is not None
- assert self._visual_prober is not None
-
- # Make the decision: is it Logical or Visual?
- # If the final letter score distance is dominant enough, rely on it.
- finalsub = self._final_char_logical_score - self._final_char_visual_score
- if finalsub >= self.MIN_FINAL_CHAR_DISTANCE:
- return self.LOGICAL_HEBREW_NAME
- if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE:
- return self.VISUAL_HEBREW_NAME
-
- # It's not dominant enough, try to rely on the model scores instead.
- modelsub = (
- self._logical_prober.get_confidence() - self._visual_prober.get_confidence()
- )
- if modelsub > self.MIN_MODEL_DISTANCE:
- return self.LOGICAL_HEBREW_NAME
- if modelsub < -self.MIN_MODEL_DISTANCE:
- return self.VISUAL_HEBREW_NAME
-
- # Still no good, back to final letter distance, maybe it'll save the
- # day.
- if finalsub < 0.0:
- return self.VISUAL_HEBREW_NAME
-
- # (finalsub > 0 - Logical) or (don't know what to do) default to
- # Logical.
- return self.LOGICAL_HEBREW_NAME
-
- @property
- def language(self) -> str:
- return "Hebrew"
-
- @property
- def state(self) -> ProbingState:
- assert self._logical_prober is not None
- assert self._visual_prober is not None
-
- # Remain active as long as any of the model probers are active.
- if (self._logical_prober.state == ProbingState.NOT_ME) and (
- self._visual_prober.state == ProbingState.NOT_ME
- ):
- return ProbingState.NOT_ME
- return ProbingState.DETECTING
diff --git a/contrib/python/pip/pip/_vendor/chardet/jisfreq.py b/contrib/python/pip/pip/_vendor/chardet/jisfreq.py
deleted file mode 100644
index 3293576e01..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/jisfreq.py
+++ /dev/null
@@ -1,325 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-# Sampling from about 20M text materials include literature and computer technology
-#
-# Japanese frequency table, applied to both S-JIS and EUC-JP
-# They are sorted in order.
-
-# 128 --> 0.77094
-# 256 --> 0.85710
-# 512 --> 0.92635
-# 1024 --> 0.97130
-# 2048 --> 0.99431
-#
-# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58
-# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191
-#
-# Typical Distribution Ratio, 25% of IDR
-
-JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0
-
-# Char to FreqOrder table ,
-JIS_TABLE_SIZE = 4368
-
-# fmt: off
-JIS_CHAR_TO_FREQ_ORDER = (
- 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16
-3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32
-1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48
-2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64
-2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80
-5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96
-1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112
-5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128
-5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144
-5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160
-5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176
-5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192
-5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208
-1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224
-1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240
-1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256
-2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272
-3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288
-3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304
- 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320
- 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336
-1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352
- 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368
-5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384
- 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400
- 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416
- 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432
- 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448
- 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464
-5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480
-5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496
-5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512
-4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528
-5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544
-5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560
-5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576
-5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592
-5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608
-5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624
-5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640
-5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656
-5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672
-3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688
-5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704
-5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720
-5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736
-5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752
-5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768
-5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784
-5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800
-5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816
-5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832
-5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848
-5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864
-5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880
-5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896
-5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912
-5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928
-5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944
-5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960
-5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976
-5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992
-5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008
-5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024
-5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040
-5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056
-5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072
-5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088
-5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104
-5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120
-5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136
-5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152
-5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168
-5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184
-5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200
-5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216
-5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232
-5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248
-5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264
-5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280
-5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296
-6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312
-6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328
-6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344
-6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360
-6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376
-6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392
-6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408
-6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424
-4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440
- 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456
- 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472
-1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488
-1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504
- 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520
-3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536
-3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552
- 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568
-3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584
-3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600
- 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616
-2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632
- 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648
-3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664
-1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680
- 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696
-1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712
- 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728
-2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744
-2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760
-2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776
-2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792
-1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808
-1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824
-1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840
-1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856
-2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872
-1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888
-2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904
-1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920
-1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936
-1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952
-1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968
-1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984
-1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000
- 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016
- 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032
-1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048
-2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064
-2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080
-2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096
-3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112
-3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128
- 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144
-3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160
-1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176
- 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192
-2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208
-1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224
- 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240
-3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256
-4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272
-2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288
-1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304
-2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320
-1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336
- 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352
- 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368
-1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384
-2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400
-2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416
-2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432
-3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448
-1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464
-2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480
- 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496
- 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512
- 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528
-1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544
-2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560
- 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576
-1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592
-1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608
- 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624
-1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640
-1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656
-1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672
- 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688
-2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704
- 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720
-2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736
-3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752
-2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768
-1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784
-6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800
-1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816
-2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832
-1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848
- 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864
- 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880
-3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896
-3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912
-1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928
-1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944
-1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960
-1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976
- 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992
- 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008
-2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024
- 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040
-3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056
-2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072
- 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088
-1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104
-2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120
- 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136
-1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152
- 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168
-4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184
-2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200
-1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216
- 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232
-1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248
-2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264
- 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280
-6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296
-1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312
-1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328
-2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344
-3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360
- 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376
-3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392
-1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408
- 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424
-1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440
- 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456
-3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472
- 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488
-2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504
- 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520
-4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536
-2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552
-1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568
-1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584
-1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600
- 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616
-1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632
-3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648
-1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664
-3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680
- 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696
- 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712
- 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728
-2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744
-1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760
- 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776
-1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792
- 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808
-1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824
- 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840
- 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856
- 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872
-1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888
-1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904
-2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920
-4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936
- 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952
-1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968
- 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984
-1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000
-3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016
-1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032
-2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048
-2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064
-1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080
-1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096
-2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112
- 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128
-2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144
-1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160
-1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176
-1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192
-1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208
-3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224
-2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240
-2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256
- 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272
-3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288
-3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304
-1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320
-2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336
-1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352
-2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512
-)
-# fmt: on
diff --git a/contrib/python/pip/pip/_vendor/chardet/johabfreq.py b/contrib/python/pip/pip/_vendor/chardet/johabfreq.py
deleted file mode 100644
index c12969990d..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/johabfreq.py
+++ /dev/null
@@ -1,2382 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-# The frequency data itself is the same as euc-kr.
-# This is just a mapping table to euc-kr.
-
-JOHAB_TO_EUCKR_ORDER_TABLE = {
- 0x8861: 0,
- 0x8862: 1,
- 0x8865: 2,
- 0x8868: 3,
- 0x8869: 4,
- 0x886A: 5,
- 0x886B: 6,
- 0x8871: 7,
- 0x8873: 8,
- 0x8874: 9,
- 0x8875: 10,
- 0x8876: 11,
- 0x8877: 12,
- 0x8878: 13,
- 0x8879: 14,
- 0x887B: 15,
- 0x887C: 16,
- 0x887D: 17,
- 0x8881: 18,
- 0x8882: 19,
- 0x8885: 20,
- 0x8889: 21,
- 0x8891: 22,
- 0x8893: 23,
- 0x8895: 24,
- 0x8896: 25,
- 0x8897: 26,
- 0x88A1: 27,
- 0x88A2: 28,
- 0x88A5: 29,
- 0x88A9: 30,
- 0x88B5: 31,
- 0x88B7: 32,
- 0x88C1: 33,
- 0x88C5: 34,
- 0x88C9: 35,
- 0x88E1: 36,
- 0x88E2: 37,
- 0x88E5: 38,
- 0x88E8: 39,
- 0x88E9: 40,
- 0x88EB: 41,
- 0x88F1: 42,
- 0x88F3: 43,
- 0x88F5: 44,
- 0x88F6: 45,
- 0x88F7: 46,
- 0x88F8: 47,
- 0x88FB: 48,
- 0x88FC: 49,
- 0x88FD: 50,
- 0x8941: 51,
- 0x8945: 52,
- 0x8949: 53,
- 0x8951: 54,
- 0x8953: 55,
- 0x8955: 56,
- 0x8956: 57,
- 0x8957: 58,
- 0x8961: 59,
- 0x8962: 60,
- 0x8963: 61,
- 0x8965: 62,
- 0x8968: 63,
- 0x8969: 64,
- 0x8971: 65,
- 0x8973: 66,
- 0x8975: 67,
- 0x8976: 68,
- 0x8977: 69,
- 0x897B: 70,
- 0x8981: 71,
- 0x8985: 72,
- 0x8989: 73,
- 0x8993: 74,
- 0x8995: 75,
- 0x89A1: 76,
- 0x89A2: 77,
- 0x89A5: 78,
- 0x89A8: 79,
- 0x89A9: 80,
- 0x89AB: 81,
- 0x89AD: 82,
- 0x89B0: 83,
- 0x89B1: 84,
- 0x89B3: 85,
- 0x89B5: 86,
- 0x89B7: 87,
- 0x89B8: 88,
- 0x89C1: 89,
- 0x89C2: 90,
- 0x89C5: 91,
- 0x89C9: 92,
- 0x89CB: 93,
- 0x89D1: 94,
- 0x89D3: 95,
- 0x89D5: 96,
- 0x89D7: 97,
- 0x89E1: 98,
- 0x89E5: 99,
- 0x89E9: 100,
- 0x89F3: 101,
- 0x89F6: 102,
- 0x89F7: 103,
- 0x8A41: 104,
- 0x8A42: 105,
- 0x8A45: 106,
- 0x8A49: 107,
- 0x8A51: 108,
- 0x8A53: 109,
- 0x8A55: 110,
- 0x8A57: 111,
- 0x8A61: 112,
- 0x8A65: 113,
- 0x8A69: 114,
- 0x8A73: 115,
- 0x8A75: 116,
- 0x8A81: 117,
- 0x8A82: 118,
- 0x8A85: 119,
- 0x8A88: 120,
- 0x8A89: 121,
- 0x8A8A: 122,
- 0x8A8B: 123,
- 0x8A90: 124,
- 0x8A91: 125,
- 0x8A93: 126,
- 0x8A95: 127,
- 0x8A97: 128,
- 0x8A98: 129,
- 0x8AA1: 130,
- 0x8AA2: 131,
- 0x8AA5: 132,
- 0x8AA9: 133,
- 0x8AB6: 134,
- 0x8AB7: 135,
- 0x8AC1: 136,
- 0x8AD5: 137,
- 0x8AE1: 138,
- 0x8AE2: 139,
- 0x8AE5: 140,
- 0x8AE9: 141,
- 0x8AF1: 142,
- 0x8AF3: 143,
- 0x8AF5: 144,
- 0x8B41: 145,
- 0x8B45: 146,
- 0x8B49: 147,
- 0x8B61: 148,
- 0x8B62: 149,
- 0x8B65: 150,
- 0x8B68: 151,
- 0x8B69: 152,
- 0x8B6A: 153,
- 0x8B71: 154,
- 0x8B73: 155,
- 0x8B75: 156,
- 0x8B77: 157,
- 0x8B81: 158,
- 0x8BA1: 159,
- 0x8BA2: 160,
- 0x8BA5: 161,
- 0x8BA8: 162,
- 0x8BA9: 163,
- 0x8BAB: 164,
- 0x8BB1: 165,
- 0x8BB3: 166,
- 0x8BB5: 167,
- 0x8BB7: 168,
- 0x8BB8: 169,
- 0x8BBC: 170,
- 0x8C61: 171,
- 0x8C62: 172,
- 0x8C63: 173,
- 0x8C65: 174,
- 0x8C69: 175,
- 0x8C6B: 176,
- 0x8C71: 177,
- 0x8C73: 178,
- 0x8C75: 179,
- 0x8C76: 180,
- 0x8C77: 181,
- 0x8C7B: 182,
- 0x8C81: 183,
- 0x8C82: 184,
- 0x8C85: 185,
- 0x8C89: 186,
- 0x8C91: 187,
- 0x8C93: 188,
- 0x8C95: 189,
- 0x8C96: 190,
- 0x8C97: 191,
- 0x8CA1: 192,
- 0x8CA2: 193,
- 0x8CA9: 194,
- 0x8CE1: 195,
- 0x8CE2: 196,
- 0x8CE3: 197,
- 0x8CE5: 198,
- 0x8CE9: 199,
- 0x8CF1: 200,
- 0x8CF3: 201,
- 0x8CF5: 202,
- 0x8CF6: 203,
- 0x8CF7: 204,
- 0x8D41: 205,
- 0x8D42: 206,
- 0x8D45: 207,
- 0x8D51: 208,
- 0x8D55: 209,
- 0x8D57: 210,
- 0x8D61: 211,
- 0x8D65: 212,
- 0x8D69: 213,
- 0x8D75: 214,
- 0x8D76: 215,
- 0x8D7B: 216,
- 0x8D81: 217,
- 0x8DA1: 218,
- 0x8DA2: 219,
- 0x8DA5: 220,
- 0x8DA7: 221,
- 0x8DA9: 222,
- 0x8DB1: 223,
- 0x8DB3: 224,
- 0x8DB5: 225,
- 0x8DB7: 226,
- 0x8DB8: 227,
- 0x8DB9: 228,
- 0x8DC1: 229,
- 0x8DC2: 230,
- 0x8DC9: 231,
- 0x8DD6: 232,
- 0x8DD7: 233,
- 0x8DE1: 234,
- 0x8DE2: 235,
- 0x8DF7: 236,
- 0x8E41: 237,
- 0x8E45: 238,
- 0x8E49: 239,
- 0x8E51: 240,
- 0x8E53: 241,
- 0x8E57: 242,
- 0x8E61: 243,
- 0x8E81: 244,
- 0x8E82: 245,
- 0x8E85: 246,
- 0x8E89: 247,
- 0x8E90: 248,
- 0x8E91: 249,
- 0x8E93: 250,
- 0x8E95: 251,
- 0x8E97: 252,
- 0x8E98: 253,
- 0x8EA1: 254,
- 0x8EA9: 255,
- 0x8EB6: 256,
- 0x8EB7: 257,
- 0x8EC1: 258,
- 0x8EC2: 259,
- 0x8EC5: 260,
- 0x8EC9: 261,
- 0x8ED1: 262,
- 0x8ED3: 263,
- 0x8ED6: 264,
- 0x8EE1: 265,
- 0x8EE5: 266,
- 0x8EE9: 267,
- 0x8EF1: 268,
- 0x8EF3: 269,
- 0x8F41: 270,
- 0x8F61: 271,
- 0x8F62: 272,
- 0x8F65: 273,
- 0x8F67: 274,
- 0x8F69: 275,
- 0x8F6B: 276,
- 0x8F70: 277,
- 0x8F71: 278,
- 0x8F73: 279,
- 0x8F75: 280,
- 0x8F77: 281,
- 0x8F7B: 282,
- 0x8FA1: 283,
- 0x8FA2: 284,
- 0x8FA5: 285,
- 0x8FA9: 286,
- 0x8FB1: 287,
- 0x8FB3: 288,
- 0x8FB5: 289,
- 0x8FB7: 290,
- 0x9061: 291,
- 0x9062: 292,
- 0x9063: 293,
- 0x9065: 294,
- 0x9068: 295,
- 0x9069: 296,
- 0x906A: 297,
- 0x906B: 298,
- 0x9071: 299,
- 0x9073: 300,
- 0x9075: 301,
- 0x9076: 302,
- 0x9077: 303,
- 0x9078: 304,
- 0x9079: 305,
- 0x907B: 306,
- 0x907D: 307,
- 0x9081: 308,
- 0x9082: 309,
- 0x9085: 310,
- 0x9089: 311,
- 0x9091: 312,
- 0x9093: 313,
- 0x9095: 314,
- 0x9096: 315,
- 0x9097: 316,
- 0x90A1: 317,
- 0x90A2: 318,
- 0x90A5: 319,
- 0x90A9: 320,
- 0x90B1: 321,
- 0x90B7: 322,
- 0x90E1: 323,
- 0x90E2: 324,
- 0x90E4: 325,
- 0x90E5: 326,
- 0x90E9: 327,
- 0x90EB: 328,
- 0x90EC: 329,
- 0x90F1: 330,
- 0x90F3: 331,
- 0x90F5: 332,
- 0x90F6: 333,
- 0x90F7: 334,
- 0x90FD: 335,
- 0x9141: 336,
- 0x9142: 337,
- 0x9145: 338,
- 0x9149: 339,
- 0x9151: 340,
- 0x9153: 341,
- 0x9155: 342,
- 0x9156: 343,
- 0x9157: 344,
- 0x9161: 345,
- 0x9162: 346,
- 0x9165: 347,
- 0x9169: 348,
- 0x9171: 349,
- 0x9173: 350,
- 0x9176: 351,
- 0x9177: 352,
- 0x917A: 353,
- 0x9181: 354,
- 0x9185: 355,
- 0x91A1: 356,
- 0x91A2: 357,
- 0x91A5: 358,
- 0x91A9: 359,
- 0x91AB: 360,
- 0x91B1: 361,
- 0x91B3: 362,
- 0x91B5: 363,
- 0x91B7: 364,
- 0x91BC: 365,
- 0x91BD: 366,
- 0x91C1: 367,
- 0x91C5: 368,
- 0x91C9: 369,
- 0x91D6: 370,
- 0x9241: 371,
- 0x9245: 372,
- 0x9249: 373,
- 0x9251: 374,
- 0x9253: 375,
- 0x9255: 376,
- 0x9261: 377,
- 0x9262: 378,
- 0x9265: 379,
- 0x9269: 380,
- 0x9273: 381,
- 0x9275: 382,
- 0x9277: 383,
- 0x9281: 384,
- 0x9282: 385,
- 0x9285: 386,
- 0x9288: 387,
- 0x9289: 388,
- 0x9291: 389,
- 0x9293: 390,
- 0x9295: 391,
- 0x9297: 392,
- 0x92A1: 393,
- 0x92B6: 394,
- 0x92C1: 395,
- 0x92E1: 396,
- 0x92E5: 397,
- 0x92E9: 398,
- 0x92F1: 399,
- 0x92F3: 400,
- 0x9341: 401,
- 0x9342: 402,
- 0x9349: 403,
- 0x9351: 404,
- 0x9353: 405,
- 0x9357: 406,
- 0x9361: 407,
- 0x9362: 408,
- 0x9365: 409,
- 0x9369: 410,
- 0x936A: 411,
- 0x936B: 412,
- 0x9371: 413,
- 0x9373: 414,
- 0x9375: 415,
- 0x9377: 416,
- 0x9378: 417,
- 0x937C: 418,
- 0x9381: 419,
- 0x9385: 420,
- 0x9389: 421,
- 0x93A1: 422,
- 0x93A2: 423,
- 0x93A5: 424,
- 0x93A9: 425,
- 0x93AB: 426,
- 0x93B1: 427,
- 0x93B3: 428,
- 0x93B5: 429,
- 0x93B7: 430,
- 0x93BC: 431,
- 0x9461: 432,
- 0x9462: 433,
- 0x9463: 434,
- 0x9465: 435,
- 0x9468: 436,
- 0x9469: 437,
- 0x946A: 438,
- 0x946B: 439,
- 0x946C: 440,
- 0x9470: 441,
- 0x9471: 442,
- 0x9473: 443,
- 0x9475: 444,
- 0x9476: 445,
- 0x9477: 446,
- 0x9478: 447,
- 0x9479: 448,
- 0x947D: 449,
- 0x9481: 450,
- 0x9482: 451,
- 0x9485: 452,
- 0x9489: 453,
- 0x9491: 454,
- 0x9493: 455,
- 0x9495: 456,
- 0x9496: 457,
- 0x9497: 458,
- 0x94A1: 459,
- 0x94E1: 460,
- 0x94E2: 461,
- 0x94E3: 462,
- 0x94E5: 463,
- 0x94E8: 464,
- 0x94E9: 465,
- 0x94EB: 466,
- 0x94EC: 467,
- 0x94F1: 468,
- 0x94F3: 469,
- 0x94F5: 470,
- 0x94F7: 471,
- 0x94F9: 472,
- 0x94FC: 473,
- 0x9541: 474,
- 0x9542: 475,
- 0x9545: 476,
- 0x9549: 477,
- 0x9551: 478,
- 0x9553: 479,
- 0x9555: 480,
- 0x9556: 481,
- 0x9557: 482,
- 0x9561: 483,
- 0x9565: 484,
- 0x9569: 485,
- 0x9576: 486,
- 0x9577: 487,
- 0x9581: 488,
- 0x9585: 489,
- 0x95A1: 490,
- 0x95A2: 491,
- 0x95A5: 492,
- 0x95A8: 493,
- 0x95A9: 494,
- 0x95AB: 495,
- 0x95AD: 496,
- 0x95B1: 497,
- 0x95B3: 498,
- 0x95B5: 499,
- 0x95B7: 500,
- 0x95B9: 501,
- 0x95BB: 502,
- 0x95C1: 503,
- 0x95C5: 504,
- 0x95C9: 505,
- 0x95E1: 506,
- 0x95F6: 507,
- 0x9641: 508,
- 0x9645: 509,
- 0x9649: 510,
- 0x9651: 511,
- 0x9653: 512,
- 0x9655: 513,
- 0x9661: 514,
- 0x9681: 515,
- 0x9682: 516,
- 0x9685: 517,
- 0x9689: 518,
- 0x9691: 519,
- 0x9693: 520,
- 0x9695: 521,
- 0x9697: 522,
- 0x96A1: 523,
- 0x96B6: 524,
- 0x96C1: 525,
- 0x96D7: 526,
- 0x96E1: 527,
- 0x96E5: 528,
- 0x96E9: 529,
- 0x96F3: 530,
- 0x96F5: 531,
- 0x96F7: 532,
- 0x9741: 533,
- 0x9745: 534,
- 0x9749: 535,
- 0x9751: 536,
- 0x9757: 537,
- 0x9761: 538,
- 0x9762: 539,
- 0x9765: 540,
- 0x9768: 541,
- 0x9769: 542,
- 0x976B: 543,
- 0x9771: 544,
- 0x9773: 545,
- 0x9775: 546,
- 0x9777: 547,
- 0x9781: 548,
- 0x97A1: 549,
- 0x97A2: 550,
- 0x97A5: 551,
- 0x97A8: 552,
- 0x97A9: 553,
- 0x97B1: 554,
- 0x97B3: 555,
- 0x97B5: 556,
- 0x97B6: 557,
- 0x97B7: 558,
- 0x97B8: 559,
- 0x9861: 560,
- 0x9862: 561,
- 0x9865: 562,
- 0x9869: 563,
- 0x9871: 564,
- 0x9873: 565,
- 0x9875: 566,
- 0x9876: 567,
- 0x9877: 568,
- 0x987D: 569,
- 0x9881: 570,
- 0x9882: 571,
- 0x9885: 572,
- 0x9889: 573,
- 0x9891: 574,
- 0x9893: 575,
- 0x9895: 576,
- 0x9896: 577,
- 0x9897: 578,
- 0x98E1: 579,
- 0x98E2: 580,
- 0x98E5: 581,
- 0x98E9: 582,
- 0x98EB: 583,
- 0x98EC: 584,
- 0x98F1: 585,
- 0x98F3: 586,
- 0x98F5: 587,
- 0x98F6: 588,
- 0x98F7: 589,
- 0x98FD: 590,
- 0x9941: 591,
- 0x9942: 592,
- 0x9945: 593,
- 0x9949: 594,
- 0x9951: 595,
- 0x9953: 596,
- 0x9955: 597,
- 0x9956: 598,
- 0x9957: 599,
- 0x9961: 600,
- 0x9976: 601,
- 0x99A1: 602,
- 0x99A2: 603,
- 0x99A5: 604,
- 0x99A9: 605,
- 0x99B7: 606,
- 0x99C1: 607,
- 0x99C9: 608,
- 0x99E1: 609,
- 0x9A41: 610,
- 0x9A45: 611,
- 0x9A81: 612,
- 0x9A82: 613,
- 0x9A85: 614,
- 0x9A89: 615,
- 0x9A90: 616,
- 0x9A91: 617,
- 0x9A97: 618,
- 0x9AC1: 619,
- 0x9AE1: 620,
- 0x9AE5: 621,
- 0x9AE9: 622,
- 0x9AF1: 623,
- 0x9AF3: 624,
- 0x9AF7: 625,
- 0x9B61: 626,
- 0x9B62: 627,
- 0x9B65: 628,
- 0x9B68: 629,
- 0x9B69: 630,
- 0x9B71: 631,
- 0x9B73: 632,
- 0x9B75: 633,
- 0x9B81: 634,
- 0x9B85: 635,
- 0x9B89: 636,
- 0x9B91: 637,
- 0x9B93: 638,
- 0x9BA1: 639,
- 0x9BA5: 640,
- 0x9BA9: 641,
- 0x9BB1: 642,
- 0x9BB3: 643,
- 0x9BB5: 644,
- 0x9BB7: 645,
- 0x9C61: 646,
- 0x9C62: 647,
- 0x9C65: 648,
- 0x9C69: 649,
- 0x9C71: 650,
- 0x9C73: 651,
- 0x9C75: 652,
- 0x9C76: 653,
- 0x9C77: 654,
- 0x9C78: 655,
- 0x9C7C: 656,
- 0x9C7D: 657,
- 0x9C81: 658,
- 0x9C82: 659,
- 0x9C85: 660,
- 0x9C89: 661,
- 0x9C91: 662,
- 0x9C93: 663,
- 0x9C95: 664,
- 0x9C96: 665,
- 0x9C97: 666,
- 0x9CA1: 667,
- 0x9CA2: 668,
- 0x9CA5: 669,
- 0x9CB5: 670,
- 0x9CB7: 671,
- 0x9CE1: 672,
- 0x9CE2: 673,
- 0x9CE5: 674,
- 0x9CE9: 675,
- 0x9CF1: 676,
- 0x9CF3: 677,
- 0x9CF5: 678,
- 0x9CF6: 679,
- 0x9CF7: 680,
- 0x9CFD: 681,
- 0x9D41: 682,
- 0x9D42: 683,
- 0x9D45: 684,
- 0x9D49: 685,
- 0x9D51: 686,
- 0x9D53: 687,
- 0x9D55: 688,
- 0x9D57: 689,
- 0x9D61: 690,
- 0x9D62: 691,
- 0x9D65: 692,
- 0x9D69: 693,
- 0x9D71: 694,
- 0x9D73: 695,
- 0x9D75: 696,
- 0x9D76: 697,
- 0x9D77: 698,
- 0x9D81: 699,
- 0x9D85: 700,
- 0x9D93: 701,
- 0x9D95: 702,
- 0x9DA1: 703,
- 0x9DA2: 704,
- 0x9DA5: 705,
- 0x9DA9: 706,
- 0x9DB1: 707,
- 0x9DB3: 708,
- 0x9DB5: 709,
- 0x9DB7: 710,
- 0x9DC1: 711,
- 0x9DC5: 712,
- 0x9DD7: 713,
- 0x9DF6: 714,
- 0x9E41: 715,
- 0x9E45: 716,
- 0x9E49: 717,
- 0x9E51: 718,
- 0x9E53: 719,
- 0x9E55: 720,
- 0x9E57: 721,
- 0x9E61: 722,
- 0x9E65: 723,
- 0x9E69: 724,
- 0x9E73: 725,
- 0x9E75: 726,
- 0x9E77: 727,
- 0x9E81: 728,
- 0x9E82: 729,
- 0x9E85: 730,
- 0x9E89: 731,
- 0x9E91: 732,
- 0x9E93: 733,
- 0x9E95: 734,
- 0x9E97: 735,
- 0x9EA1: 736,
- 0x9EB6: 737,
- 0x9EC1: 738,
- 0x9EE1: 739,
- 0x9EE2: 740,
- 0x9EE5: 741,
- 0x9EE9: 742,
- 0x9EF1: 743,
- 0x9EF5: 744,
- 0x9EF7: 745,
- 0x9F41: 746,
- 0x9F42: 747,
- 0x9F45: 748,
- 0x9F49: 749,
- 0x9F51: 750,
- 0x9F53: 751,
- 0x9F55: 752,
- 0x9F57: 753,
- 0x9F61: 754,
- 0x9F62: 755,
- 0x9F65: 756,
- 0x9F69: 757,
- 0x9F71: 758,
- 0x9F73: 759,
- 0x9F75: 760,
- 0x9F77: 761,
- 0x9F78: 762,
- 0x9F7B: 763,
- 0x9F7C: 764,
- 0x9FA1: 765,
- 0x9FA2: 766,
- 0x9FA5: 767,
- 0x9FA9: 768,
- 0x9FB1: 769,
- 0x9FB3: 770,
- 0x9FB5: 771,
- 0x9FB7: 772,
- 0xA061: 773,
- 0xA062: 774,
- 0xA065: 775,
- 0xA067: 776,
- 0xA068: 777,
- 0xA069: 778,
- 0xA06A: 779,
- 0xA06B: 780,
- 0xA071: 781,
- 0xA073: 782,
- 0xA075: 783,
- 0xA077: 784,
- 0xA078: 785,
- 0xA07B: 786,
- 0xA07D: 787,
- 0xA081: 788,
- 0xA082: 789,
- 0xA085: 790,
- 0xA089: 791,
- 0xA091: 792,
- 0xA093: 793,
- 0xA095: 794,
- 0xA096: 795,
- 0xA097: 796,
- 0xA098: 797,
- 0xA0A1: 798,
- 0xA0A2: 799,
- 0xA0A9: 800,
- 0xA0B7: 801,
- 0xA0E1: 802,
- 0xA0E2: 803,
- 0xA0E5: 804,
- 0xA0E9: 805,
- 0xA0EB: 806,
- 0xA0F1: 807,
- 0xA0F3: 808,
- 0xA0F5: 809,
- 0xA0F7: 810,
- 0xA0F8: 811,
- 0xA0FD: 812,
- 0xA141: 813,
- 0xA142: 814,
- 0xA145: 815,
- 0xA149: 816,
- 0xA151: 817,
- 0xA153: 818,
- 0xA155: 819,
- 0xA156: 820,
- 0xA157: 821,
- 0xA161: 822,
- 0xA162: 823,
- 0xA165: 824,
- 0xA169: 825,
- 0xA175: 826,
- 0xA176: 827,
- 0xA177: 828,
- 0xA179: 829,
- 0xA181: 830,
- 0xA1A1: 831,
- 0xA1A2: 832,
- 0xA1A4: 833,
- 0xA1A5: 834,
- 0xA1A9: 835,
- 0xA1AB: 836,
- 0xA1B1: 837,
- 0xA1B3: 838,
- 0xA1B5: 839,
- 0xA1B7: 840,
- 0xA1C1: 841,
- 0xA1C5: 842,
- 0xA1D6: 843,
- 0xA1D7: 844,
- 0xA241: 845,
- 0xA245: 846,
- 0xA249: 847,
- 0xA253: 848,
- 0xA255: 849,
- 0xA257: 850,
- 0xA261: 851,
- 0xA265: 852,
- 0xA269: 853,
- 0xA273: 854,
- 0xA275: 855,
- 0xA281: 856,
- 0xA282: 857,
- 0xA283: 858,
- 0xA285: 859,
- 0xA288: 860,
- 0xA289: 861,
- 0xA28A: 862,
- 0xA28B: 863,
- 0xA291: 864,
- 0xA293: 865,
- 0xA295: 866,
- 0xA297: 867,
- 0xA29B: 868,
- 0xA29D: 869,
- 0xA2A1: 870,
- 0xA2A5: 871,
- 0xA2A9: 872,
- 0xA2B3: 873,
- 0xA2B5: 874,
- 0xA2C1: 875,
- 0xA2E1: 876,
- 0xA2E5: 877,
- 0xA2E9: 878,
- 0xA341: 879,
- 0xA345: 880,
- 0xA349: 881,
- 0xA351: 882,
- 0xA355: 883,
- 0xA361: 884,
- 0xA365: 885,
- 0xA369: 886,
- 0xA371: 887,
- 0xA375: 888,
- 0xA3A1: 889,
- 0xA3A2: 890,
- 0xA3A5: 891,
- 0xA3A8: 892,
- 0xA3A9: 893,
- 0xA3AB: 894,
- 0xA3B1: 895,
- 0xA3B3: 896,
- 0xA3B5: 897,
- 0xA3B6: 898,
- 0xA3B7: 899,
- 0xA3B9: 900,
- 0xA3BB: 901,
- 0xA461: 902,
- 0xA462: 903,
- 0xA463: 904,
- 0xA464: 905,
- 0xA465: 906,
- 0xA468: 907,
- 0xA469: 908,
- 0xA46A: 909,
- 0xA46B: 910,
- 0xA46C: 911,
- 0xA471: 912,
- 0xA473: 913,
- 0xA475: 914,
- 0xA477: 915,
- 0xA47B: 916,
- 0xA481: 917,
- 0xA482: 918,
- 0xA485: 919,
- 0xA489: 920,
- 0xA491: 921,
- 0xA493: 922,
- 0xA495: 923,
- 0xA496: 924,
- 0xA497: 925,
- 0xA49B: 926,
- 0xA4A1: 927,
- 0xA4A2: 928,
- 0xA4A5: 929,
- 0xA4B3: 930,
- 0xA4E1: 931,
- 0xA4E2: 932,
- 0xA4E5: 933,
- 0xA4E8: 934,
- 0xA4E9: 935,
- 0xA4EB: 936,
- 0xA4F1: 937,
- 0xA4F3: 938,
- 0xA4F5: 939,
- 0xA4F7: 940,
- 0xA4F8: 941,
- 0xA541: 942,
- 0xA542: 943,
- 0xA545: 944,
- 0xA548: 945,
- 0xA549: 946,
- 0xA551: 947,
- 0xA553: 948,
- 0xA555: 949,
- 0xA556: 950,
- 0xA557: 951,
- 0xA561: 952,
- 0xA562: 953,
- 0xA565: 954,
- 0xA569: 955,
- 0xA573: 956,
- 0xA575: 957,
- 0xA576: 958,
- 0xA577: 959,
- 0xA57B: 960,
- 0xA581: 961,
- 0xA585: 962,
- 0xA5A1: 963,
- 0xA5A2: 964,
- 0xA5A3: 965,
- 0xA5A5: 966,
- 0xA5A9: 967,
- 0xA5B1: 968,
- 0xA5B3: 969,
- 0xA5B5: 970,
- 0xA5B7: 971,
- 0xA5C1: 972,
- 0xA5C5: 973,
- 0xA5D6: 974,
- 0xA5E1: 975,
- 0xA5F6: 976,
- 0xA641: 977,
- 0xA642: 978,
- 0xA645: 979,
- 0xA649: 980,
- 0xA651: 981,
- 0xA653: 982,
- 0xA661: 983,
- 0xA665: 984,
- 0xA681: 985,
- 0xA682: 986,
- 0xA685: 987,
- 0xA688: 988,
- 0xA689: 989,
- 0xA68A: 990,
- 0xA68B: 991,
- 0xA691: 992,
- 0xA693: 993,
- 0xA695: 994,
- 0xA697: 995,
- 0xA69B: 996,
- 0xA69C: 997,
- 0xA6A1: 998,
- 0xA6A9: 999,
- 0xA6B6: 1000,
- 0xA6C1: 1001,
- 0xA6E1: 1002,
- 0xA6E2: 1003,
- 0xA6E5: 1004,
- 0xA6E9: 1005,
- 0xA6F7: 1006,
- 0xA741: 1007,
- 0xA745: 1008,
- 0xA749: 1009,
- 0xA751: 1010,
- 0xA755: 1011,
- 0xA757: 1012,
- 0xA761: 1013,
- 0xA762: 1014,
- 0xA765: 1015,
- 0xA769: 1016,
- 0xA771: 1017,
- 0xA773: 1018,
- 0xA775: 1019,
- 0xA7A1: 1020,
- 0xA7A2: 1021,
- 0xA7A5: 1022,
- 0xA7A9: 1023,
- 0xA7AB: 1024,
- 0xA7B1: 1025,
- 0xA7B3: 1026,
- 0xA7B5: 1027,
- 0xA7B7: 1028,
- 0xA7B8: 1029,
- 0xA7B9: 1030,
- 0xA861: 1031,
- 0xA862: 1032,
- 0xA865: 1033,
- 0xA869: 1034,
- 0xA86B: 1035,
- 0xA871: 1036,
- 0xA873: 1037,
- 0xA875: 1038,
- 0xA876: 1039,
- 0xA877: 1040,
- 0xA87D: 1041,
- 0xA881: 1042,
- 0xA882: 1043,
- 0xA885: 1044,
- 0xA889: 1045,
- 0xA891: 1046,
- 0xA893: 1047,
- 0xA895: 1048,
- 0xA896: 1049,
- 0xA897: 1050,
- 0xA8A1: 1051,
- 0xA8A2: 1052,
- 0xA8B1: 1053,
- 0xA8E1: 1054,
- 0xA8E2: 1055,
- 0xA8E5: 1056,
- 0xA8E8: 1057,
- 0xA8E9: 1058,
- 0xA8F1: 1059,
- 0xA8F5: 1060,
- 0xA8F6: 1061,
- 0xA8F7: 1062,
- 0xA941: 1063,
- 0xA957: 1064,
- 0xA961: 1065,
- 0xA962: 1066,
- 0xA971: 1067,
- 0xA973: 1068,
- 0xA975: 1069,
- 0xA976: 1070,
- 0xA977: 1071,
- 0xA9A1: 1072,
- 0xA9A2: 1073,
- 0xA9A5: 1074,
- 0xA9A9: 1075,
- 0xA9B1: 1076,
- 0xA9B3: 1077,
- 0xA9B7: 1078,
- 0xAA41: 1079,
- 0xAA61: 1080,
- 0xAA77: 1081,
- 0xAA81: 1082,
- 0xAA82: 1083,
- 0xAA85: 1084,
- 0xAA89: 1085,
- 0xAA91: 1086,
- 0xAA95: 1087,
- 0xAA97: 1088,
- 0xAB41: 1089,
- 0xAB57: 1090,
- 0xAB61: 1091,
- 0xAB65: 1092,
- 0xAB69: 1093,
- 0xAB71: 1094,
- 0xAB73: 1095,
- 0xABA1: 1096,
- 0xABA2: 1097,
- 0xABA5: 1098,
- 0xABA9: 1099,
- 0xABB1: 1100,
- 0xABB3: 1101,
- 0xABB5: 1102,
- 0xABB7: 1103,
- 0xAC61: 1104,
- 0xAC62: 1105,
- 0xAC64: 1106,
- 0xAC65: 1107,
- 0xAC68: 1108,
- 0xAC69: 1109,
- 0xAC6A: 1110,
- 0xAC6B: 1111,
- 0xAC71: 1112,
- 0xAC73: 1113,
- 0xAC75: 1114,
- 0xAC76: 1115,
- 0xAC77: 1116,
- 0xAC7B: 1117,
- 0xAC81: 1118,
- 0xAC82: 1119,
- 0xAC85: 1120,
- 0xAC89: 1121,
- 0xAC91: 1122,
- 0xAC93: 1123,
- 0xAC95: 1124,
- 0xAC96: 1125,
- 0xAC97: 1126,
- 0xACA1: 1127,
- 0xACA2: 1128,
- 0xACA5: 1129,
- 0xACA9: 1130,
- 0xACB1: 1131,
- 0xACB3: 1132,
- 0xACB5: 1133,
- 0xACB7: 1134,
- 0xACC1: 1135,
- 0xACC5: 1136,
- 0xACC9: 1137,
- 0xACD1: 1138,
- 0xACD7: 1139,
- 0xACE1: 1140,
- 0xACE2: 1141,
- 0xACE3: 1142,
- 0xACE4: 1143,
- 0xACE5: 1144,
- 0xACE8: 1145,
- 0xACE9: 1146,
- 0xACEB: 1147,
- 0xACEC: 1148,
- 0xACF1: 1149,
- 0xACF3: 1150,
- 0xACF5: 1151,
- 0xACF6: 1152,
- 0xACF7: 1153,
- 0xACFC: 1154,
- 0xAD41: 1155,
- 0xAD42: 1156,
- 0xAD45: 1157,
- 0xAD49: 1158,
- 0xAD51: 1159,
- 0xAD53: 1160,
- 0xAD55: 1161,
- 0xAD56: 1162,
- 0xAD57: 1163,
- 0xAD61: 1164,
- 0xAD62: 1165,
- 0xAD65: 1166,
- 0xAD69: 1167,
- 0xAD71: 1168,
- 0xAD73: 1169,
- 0xAD75: 1170,
- 0xAD76: 1171,
- 0xAD77: 1172,
- 0xAD81: 1173,
- 0xAD85: 1174,
- 0xAD89: 1175,
- 0xAD97: 1176,
- 0xADA1: 1177,
- 0xADA2: 1178,
- 0xADA3: 1179,
- 0xADA5: 1180,
- 0xADA9: 1181,
- 0xADAB: 1182,
- 0xADB1: 1183,
- 0xADB3: 1184,
- 0xADB5: 1185,
- 0xADB7: 1186,
- 0xADBB: 1187,
- 0xADC1: 1188,
- 0xADC2: 1189,
- 0xADC5: 1190,
- 0xADC9: 1191,
- 0xADD7: 1192,
- 0xADE1: 1193,
- 0xADE5: 1194,
- 0xADE9: 1195,
- 0xADF1: 1196,
- 0xADF5: 1197,
- 0xADF6: 1198,
- 0xAE41: 1199,
- 0xAE45: 1200,
- 0xAE49: 1201,
- 0xAE51: 1202,
- 0xAE53: 1203,
- 0xAE55: 1204,
- 0xAE61: 1205,
- 0xAE62: 1206,
- 0xAE65: 1207,
- 0xAE69: 1208,
- 0xAE71: 1209,
- 0xAE73: 1210,
- 0xAE75: 1211,
- 0xAE77: 1212,
- 0xAE81: 1213,
- 0xAE82: 1214,
- 0xAE85: 1215,
- 0xAE88: 1216,
- 0xAE89: 1217,
- 0xAE91: 1218,
- 0xAE93: 1219,
- 0xAE95: 1220,
- 0xAE97: 1221,
- 0xAE99: 1222,
- 0xAE9B: 1223,
- 0xAE9C: 1224,
- 0xAEA1: 1225,
- 0xAEB6: 1226,
- 0xAEC1: 1227,
- 0xAEC2: 1228,
- 0xAEC5: 1229,
- 0xAEC9: 1230,
- 0xAED1: 1231,
- 0xAED7: 1232,
- 0xAEE1: 1233,
- 0xAEE2: 1234,
- 0xAEE5: 1235,
- 0xAEE9: 1236,
- 0xAEF1: 1237,
- 0xAEF3: 1238,
- 0xAEF5: 1239,
- 0xAEF7: 1240,
- 0xAF41: 1241,
- 0xAF42: 1242,
- 0xAF49: 1243,
- 0xAF51: 1244,
- 0xAF55: 1245,
- 0xAF57: 1246,
- 0xAF61: 1247,
- 0xAF62: 1248,
- 0xAF65: 1249,
- 0xAF69: 1250,
- 0xAF6A: 1251,
- 0xAF71: 1252,
- 0xAF73: 1253,
- 0xAF75: 1254,
- 0xAF77: 1255,
- 0xAFA1: 1256,
- 0xAFA2: 1257,
- 0xAFA5: 1258,
- 0xAFA8: 1259,
- 0xAFA9: 1260,
- 0xAFB0: 1261,
- 0xAFB1: 1262,
- 0xAFB3: 1263,
- 0xAFB5: 1264,
- 0xAFB7: 1265,
- 0xAFBC: 1266,
- 0xB061: 1267,
- 0xB062: 1268,
- 0xB064: 1269,
- 0xB065: 1270,
- 0xB069: 1271,
- 0xB071: 1272,
- 0xB073: 1273,
- 0xB076: 1274,
- 0xB077: 1275,
- 0xB07D: 1276,
- 0xB081: 1277,
- 0xB082: 1278,
- 0xB085: 1279,
- 0xB089: 1280,
- 0xB091: 1281,
- 0xB093: 1282,
- 0xB096: 1283,
- 0xB097: 1284,
- 0xB0B7: 1285,
- 0xB0E1: 1286,
- 0xB0E2: 1287,
- 0xB0E5: 1288,
- 0xB0E9: 1289,
- 0xB0EB: 1290,
- 0xB0F1: 1291,
- 0xB0F3: 1292,
- 0xB0F6: 1293,
- 0xB0F7: 1294,
- 0xB141: 1295,
- 0xB145: 1296,
- 0xB149: 1297,
- 0xB185: 1298,
- 0xB1A1: 1299,
- 0xB1A2: 1300,
- 0xB1A5: 1301,
- 0xB1A8: 1302,
- 0xB1A9: 1303,
- 0xB1AB: 1304,
- 0xB1B1: 1305,
- 0xB1B3: 1306,
- 0xB1B7: 1307,
- 0xB1C1: 1308,
- 0xB1C2: 1309,
- 0xB1C5: 1310,
- 0xB1D6: 1311,
- 0xB1E1: 1312,
- 0xB1F6: 1313,
- 0xB241: 1314,
- 0xB245: 1315,
- 0xB249: 1316,
- 0xB251: 1317,
- 0xB253: 1318,
- 0xB261: 1319,
- 0xB281: 1320,
- 0xB282: 1321,
- 0xB285: 1322,
- 0xB289: 1323,
- 0xB291: 1324,
- 0xB293: 1325,
- 0xB297: 1326,
- 0xB2A1: 1327,
- 0xB2B6: 1328,
- 0xB2C1: 1329,
- 0xB2E1: 1330,
- 0xB2E5: 1331,
- 0xB357: 1332,
- 0xB361: 1333,
- 0xB362: 1334,
- 0xB365: 1335,
- 0xB369: 1336,
- 0xB36B: 1337,
- 0xB370: 1338,
- 0xB371: 1339,
- 0xB373: 1340,
- 0xB381: 1341,
- 0xB385: 1342,
- 0xB389: 1343,
- 0xB391: 1344,
- 0xB3A1: 1345,
- 0xB3A2: 1346,
- 0xB3A5: 1347,
- 0xB3A9: 1348,
- 0xB3B1: 1349,
- 0xB3B3: 1350,
- 0xB3B5: 1351,
- 0xB3B7: 1352,
- 0xB461: 1353,
- 0xB462: 1354,
- 0xB465: 1355,
- 0xB466: 1356,
- 0xB467: 1357,
- 0xB469: 1358,
- 0xB46A: 1359,
- 0xB46B: 1360,
- 0xB470: 1361,
- 0xB471: 1362,
- 0xB473: 1363,
- 0xB475: 1364,
- 0xB476: 1365,
- 0xB477: 1366,
- 0xB47B: 1367,
- 0xB47C: 1368,
- 0xB481: 1369,
- 0xB482: 1370,
- 0xB485: 1371,
- 0xB489: 1372,
- 0xB491: 1373,
- 0xB493: 1374,
- 0xB495: 1375,
- 0xB496: 1376,
- 0xB497: 1377,
- 0xB4A1: 1378,
- 0xB4A2: 1379,
- 0xB4A5: 1380,
- 0xB4A9: 1381,
- 0xB4AC: 1382,
- 0xB4B1: 1383,
- 0xB4B3: 1384,
- 0xB4B5: 1385,
- 0xB4B7: 1386,
- 0xB4BB: 1387,
- 0xB4BD: 1388,
- 0xB4C1: 1389,
- 0xB4C5: 1390,
- 0xB4C9: 1391,
- 0xB4D3: 1392,
- 0xB4E1: 1393,
- 0xB4E2: 1394,
- 0xB4E5: 1395,
- 0xB4E6: 1396,
- 0xB4E8: 1397,
- 0xB4E9: 1398,
- 0xB4EA: 1399,
- 0xB4EB: 1400,
- 0xB4F1: 1401,
- 0xB4F3: 1402,
- 0xB4F4: 1403,
- 0xB4F5: 1404,
- 0xB4F6: 1405,
- 0xB4F7: 1406,
- 0xB4F8: 1407,
- 0xB4FA: 1408,
- 0xB4FC: 1409,
- 0xB541: 1410,
- 0xB542: 1411,
- 0xB545: 1412,
- 0xB549: 1413,
- 0xB551: 1414,
- 0xB553: 1415,
- 0xB555: 1416,
- 0xB557: 1417,
- 0xB561: 1418,
- 0xB562: 1419,
- 0xB563: 1420,
- 0xB565: 1421,
- 0xB569: 1422,
- 0xB56B: 1423,
- 0xB56C: 1424,
- 0xB571: 1425,
- 0xB573: 1426,
- 0xB574: 1427,
- 0xB575: 1428,
- 0xB576: 1429,
- 0xB577: 1430,
- 0xB57B: 1431,
- 0xB57C: 1432,
- 0xB57D: 1433,
- 0xB581: 1434,
- 0xB585: 1435,
- 0xB589: 1436,
- 0xB591: 1437,
- 0xB593: 1438,
- 0xB595: 1439,
- 0xB596: 1440,
- 0xB5A1: 1441,
- 0xB5A2: 1442,
- 0xB5A5: 1443,
- 0xB5A9: 1444,
- 0xB5AA: 1445,
- 0xB5AB: 1446,
- 0xB5AD: 1447,
- 0xB5B0: 1448,
- 0xB5B1: 1449,
- 0xB5B3: 1450,
- 0xB5B5: 1451,
- 0xB5B7: 1452,
- 0xB5B9: 1453,
- 0xB5C1: 1454,
- 0xB5C2: 1455,
- 0xB5C5: 1456,
- 0xB5C9: 1457,
- 0xB5D1: 1458,
- 0xB5D3: 1459,
- 0xB5D5: 1460,
- 0xB5D6: 1461,
- 0xB5D7: 1462,
- 0xB5E1: 1463,
- 0xB5E2: 1464,
- 0xB5E5: 1465,
- 0xB5F1: 1466,
- 0xB5F5: 1467,
- 0xB5F7: 1468,
- 0xB641: 1469,
- 0xB642: 1470,
- 0xB645: 1471,
- 0xB649: 1472,
- 0xB651: 1473,
- 0xB653: 1474,
- 0xB655: 1475,
- 0xB657: 1476,
- 0xB661: 1477,
- 0xB662: 1478,
- 0xB665: 1479,
- 0xB669: 1480,
- 0xB671: 1481,
- 0xB673: 1482,
- 0xB675: 1483,
- 0xB677: 1484,
- 0xB681: 1485,
- 0xB682: 1486,
- 0xB685: 1487,
- 0xB689: 1488,
- 0xB68A: 1489,
- 0xB68B: 1490,
- 0xB691: 1491,
- 0xB693: 1492,
- 0xB695: 1493,
- 0xB697: 1494,
- 0xB6A1: 1495,
- 0xB6A2: 1496,
- 0xB6A5: 1497,
- 0xB6A9: 1498,
- 0xB6B1: 1499,
- 0xB6B3: 1500,
- 0xB6B6: 1501,
- 0xB6B7: 1502,
- 0xB6C1: 1503,
- 0xB6C2: 1504,
- 0xB6C5: 1505,
- 0xB6C9: 1506,
- 0xB6D1: 1507,
- 0xB6D3: 1508,
- 0xB6D7: 1509,
- 0xB6E1: 1510,
- 0xB6E2: 1511,
- 0xB6E5: 1512,
- 0xB6E9: 1513,
- 0xB6F1: 1514,
- 0xB6F3: 1515,
- 0xB6F5: 1516,
- 0xB6F7: 1517,
- 0xB741: 1518,
- 0xB742: 1519,
- 0xB745: 1520,
- 0xB749: 1521,
- 0xB751: 1522,
- 0xB753: 1523,
- 0xB755: 1524,
- 0xB757: 1525,
- 0xB759: 1526,
- 0xB761: 1527,
- 0xB762: 1528,
- 0xB765: 1529,
- 0xB769: 1530,
- 0xB76F: 1531,
- 0xB771: 1532,
- 0xB773: 1533,
- 0xB775: 1534,
- 0xB777: 1535,
- 0xB778: 1536,
- 0xB779: 1537,
- 0xB77A: 1538,
- 0xB77B: 1539,
- 0xB77C: 1540,
- 0xB77D: 1541,
- 0xB781: 1542,
- 0xB785: 1543,
- 0xB789: 1544,
- 0xB791: 1545,
- 0xB795: 1546,
- 0xB7A1: 1547,
- 0xB7A2: 1548,
- 0xB7A5: 1549,
- 0xB7A9: 1550,
- 0xB7AA: 1551,
- 0xB7AB: 1552,
- 0xB7B0: 1553,
- 0xB7B1: 1554,
- 0xB7B3: 1555,
- 0xB7B5: 1556,
- 0xB7B6: 1557,
- 0xB7B7: 1558,
- 0xB7B8: 1559,
- 0xB7BC: 1560,
- 0xB861: 1561,
- 0xB862: 1562,
- 0xB865: 1563,
- 0xB867: 1564,
- 0xB868: 1565,
- 0xB869: 1566,
- 0xB86B: 1567,
- 0xB871: 1568,
- 0xB873: 1569,
- 0xB875: 1570,
- 0xB876: 1571,
- 0xB877: 1572,
- 0xB878: 1573,
- 0xB881: 1574,
- 0xB882: 1575,
- 0xB885: 1576,
- 0xB889: 1577,
- 0xB891: 1578,
- 0xB893: 1579,
- 0xB895: 1580,
- 0xB896: 1581,
- 0xB897: 1582,
- 0xB8A1: 1583,
- 0xB8A2: 1584,
- 0xB8A5: 1585,
- 0xB8A7: 1586,
- 0xB8A9: 1587,
- 0xB8B1: 1588,
- 0xB8B7: 1589,
- 0xB8C1: 1590,
- 0xB8C5: 1591,
- 0xB8C9: 1592,
- 0xB8E1: 1593,
- 0xB8E2: 1594,
- 0xB8E5: 1595,
- 0xB8E9: 1596,
- 0xB8EB: 1597,
- 0xB8F1: 1598,
- 0xB8F3: 1599,
- 0xB8F5: 1600,
- 0xB8F7: 1601,
- 0xB8F8: 1602,
- 0xB941: 1603,
- 0xB942: 1604,
- 0xB945: 1605,
- 0xB949: 1606,
- 0xB951: 1607,
- 0xB953: 1608,
- 0xB955: 1609,
- 0xB957: 1610,
- 0xB961: 1611,
- 0xB965: 1612,
- 0xB969: 1613,
- 0xB971: 1614,
- 0xB973: 1615,
- 0xB976: 1616,
- 0xB977: 1617,
- 0xB981: 1618,
- 0xB9A1: 1619,
- 0xB9A2: 1620,
- 0xB9A5: 1621,
- 0xB9A9: 1622,
- 0xB9AB: 1623,
- 0xB9B1: 1624,
- 0xB9B3: 1625,
- 0xB9B5: 1626,
- 0xB9B7: 1627,
- 0xB9B8: 1628,
- 0xB9B9: 1629,
- 0xB9BD: 1630,
- 0xB9C1: 1631,
- 0xB9C2: 1632,
- 0xB9C9: 1633,
- 0xB9D3: 1634,
- 0xB9D5: 1635,
- 0xB9D7: 1636,
- 0xB9E1: 1637,
- 0xB9F6: 1638,
- 0xB9F7: 1639,
- 0xBA41: 1640,
- 0xBA45: 1641,
- 0xBA49: 1642,
- 0xBA51: 1643,
- 0xBA53: 1644,
- 0xBA55: 1645,
- 0xBA57: 1646,
- 0xBA61: 1647,
- 0xBA62: 1648,
- 0xBA65: 1649,
- 0xBA77: 1650,
- 0xBA81: 1651,
- 0xBA82: 1652,
- 0xBA85: 1653,
- 0xBA89: 1654,
- 0xBA8A: 1655,
- 0xBA8B: 1656,
- 0xBA91: 1657,
- 0xBA93: 1658,
- 0xBA95: 1659,
- 0xBA97: 1660,
- 0xBAA1: 1661,
- 0xBAB6: 1662,
- 0xBAC1: 1663,
- 0xBAE1: 1664,
- 0xBAE2: 1665,
- 0xBAE5: 1666,
- 0xBAE9: 1667,
- 0xBAF1: 1668,
- 0xBAF3: 1669,
- 0xBAF5: 1670,
- 0xBB41: 1671,
- 0xBB45: 1672,
- 0xBB49: 1673,
- 0xBB51: 1674,
- 0xBB61: 1675,
- 0xBB62: 1676,
- 0xBB65: 1677,
- 0xBB69: 1678,
- 0xBB71: 1679,
- 0xBB73: 1680,
- 0xBB75: 1681,
- 0xBB77: 1682,
- 0xBBA1: 1683,
- 0xBBA2: 1684,
- 0xBBA5: 1685,
- 0xBBA8: 1686,
- 0xBBA9: 1687,
- 0xBBAB: 1688,
- 0xBBB1: 1689,
- 0xBBB3: 1690,
- 0xBBB5: 1691,
- 0xBBB7: 1692,
- 0xBBB8: 1693,
- 0xBBBB: 1694,
- 0xBBBC: 1695,
- 0xBC61: 1696,
- 0xBC62: 1697,
- 0xBC65: 1698,
- 0xBC67: 1699,
- 0xBC69: 1700,
- 0xBC6C: 1701,
- 0xBC71: 1702,
- 0xBC73: 1703,
- 0xBC75: 1704,
- 0xBC76: 1705,
- 0xBC77: 1706,
- 0xBC81: 1707,
- 0xBC82: 1708,
- 0xBC85: 1709,
- 0xBC89: 1710,
- 0xBC91: 1711,
- 0xBC93: 1712,
- 0xBC95: 1713,
- 0xBC96: 1714,
- 0xBC97: 1715,
- 0xBCA1: 1716,
- 0xBCA5: 1717,
- 0xBCB7: 1718,
- 0xBCE1: 1719,
- 0xBCE2: 1720,
- 0xBCE5: 1721,
- 0xBCE9: 1722,
- 0xBCF1: 1723,
- 0xBCF3: 1724,
- 0xBCF5: 1725,
- 0xBCF6: 1726,
- 0xBCF7: 1727,
- 0xBD41: 1728,
- 0xBD57: 1729,
- 0xBD61: 1730,
- 0xBD76: 1731,
- 0xBDA1: 1732,
- 0xBDA2: 1733,
- 0xBDA5: 1734,
- 0xBDA9: 1735,
- 0xBDB1: 1736,
- 0xBDB3: 1737,
- 0xBDB5: 1738,
- 0xBDB7: 1739,
- 0xBDB9: 1740,
- 0xBDC1: 1741,
- 0xBDC2: 1742,
- 0xBDC9: 1743,
- 0xBDD6: 1744,
- 0xBDE1: 1745,
- 0xBDF6: 1746,
- 0xBE41: 1747,
- 0xBE45: 1748,
- 0xBE49: 1749,
- 0xBE51: 1750,
- 0xBE53: 1751,
- 0xBE77: 1752,
- 0xBE81: 1753,
- 0xBE82: 1754,
- 0xBE85: 1755,
- 0xBE89: 1756,
- 0xBE91: 1757,
- 0xBE93: 1758,
- 0xBE97: 1759,
- 0xBEA1: 1760,
- 0xBEB6: 1761,
- 0xBEB7: 1762,
- 0xBEE1: 1763,
- 0xBF41: 1764,
- 0xBF61: 1765,
- 0xBF71: 1766,
- 0xBF75: 1767,
- 0xBF77: 1768,
- 0xBFA1: 1769,
- 0xBFA2: 1770,
- 0xBFA5: 1771,
- 0xBFA9: 1772,
- 0xBFB1: 1773,
- 0xBFB3: 1774,
- 0xBFB7: 1775,
- 0xBFB8: 1776,
- 0xBFBD: 1777,
- 0xC061: 1778,
- 0xC062: 1779,
- 0xC065: 1780,
- 0xC067: 1781,
- 0xC069: 1782,
- 0xC071: 1783,
- 0xC073: 1784,
- 0xC075: 1785,
- 0xC076: 1786,
- 0xC077: 1787,
- 0xC078: 1788,
- 0xC081: 1789,
- 0xC082: 1790,
- 0xC085: 1791,
- 0xC089: 1792,
- 0xC091: 1793,
- 0xC093: 1794,
- 0xC095: 1795,
- 0xC096: 1796,
- 0xC097: 1797,
- 0xC0A1: 1798,
- 0xC0A5: 1799,
- 0xC0A7: 1800,
- 0xC0A9: 1801,
- 0xC0B1: 1802,
- 0xC0B7: 1803,
- 0xC0E1: 1804,
- 0xC0E2: 1805,
- 0xC0E5: 1806,
- 0xC0E9: 1807,
- 0xC0F1: 1808,
- 0xC0F3: 1809,
- 0xC0F5: 1810,
- 0xC0F6: 1811,
- 0xC0F7: 1812,
- 0xC141: 1813,
- 0xC142: 1814,
- 0xC145: 1815,
- 0xC149: 1816,
- 0xC151: 1817,
- 0xC153: 1818,
- 0xC155: 1819,
- 0xC157: 1820,
- 0xC161: 1821,
- 0xC165: 1822,
- 0xC176: 1823,
- 0xC181: 1824,
- 0xC185: 1825,
- 0xC197: 1826,
- 0xC1A1: 1827,
- 0xC1A2: 1828,
- 0xC1A5: 1829,
- 0xC1A9: 1830,
- 0xC1B1: 1831,
- 0xC1B3: 1832,
- 0xC1B5: 1833,
- 0xC1B7: 1834,
- 0xC1C1: 1835,
- 0xC1C5: 1836,
- 0xC1C9: 1837,
- 0xC1D7: 1838,
- 0xC241: 1839,
- 0xC245: 1840,
- 0xC249: 1841,
- 0xC251: 1842,
- 0xC253: 1843,
- 0xC255: 1844,
- 0xC257: 1845,
- 0xC261: 1846,
- 0xC271: 1847,
- 0xC281: 1848,
- 0xC282: 1849,
- 0xC285: 1850,
- 0xC289: 1851,
- 0xC291: 1852,
- 0xC293: 1853,
- 0xC295: 1854,
- 0xC297: 1855,
- 0xC2A1: 1856,
- 0xC2B6: 1857,
- 0xC2C1: 1858,
- 0xC2C5: 1859,
- 0xC2E1: 1860,
- 0xC2E5: 1861,
- 0xC2E9: 1862,
- 0xC2F1: 1863,
- 0xC2F3: 1864,
- 0xC2F5: 1865,
- 0xC2F7: 1866,
- 0xC341: 1867,
- 0xC345: 1868,
- 0xC349: 1869,
- 0xC351: 1870,
- 0xC357: 1871,
- 0xC361: 1872,
- 0xC362: 1873,
- 0xC365: 1874,
- 0xC369: 1875,
- 0xC371: 1876,
- 0xC373: 1877,
- 0xC375: 1878,
- 0xC377: 1879,
- 0xC3A1: 1880,
- 0xC3A2: 1881,
- 0xC3A5: 1882,
- 0xC3A8: 1883,
- 0xC3A9: 1884,
- 0xC3AA: 1885,
- 0xC3B1: 1886,
- 0xC3B3: 1887,
- 0xC3B5: 1888,
- 0xC3B7: 1889,
- 0xC461: 1890,
- 0xC462: 1891,
- 0xC465: 1892,
- 0xC469: 1893,
- 0xC471: 1894,
- 0xC473: 1895,
- 0xC475: 1896,
- 0xC477: 1897,
- 0xC481: 1898,
- 0xC482: 1899,
- 0xC485: 1900,
- 0xC489: 1901,
- 0xC491: 1902,
- 0xC493: 1903,
- 0xC495: 1904,
- 0xC496: 1905,
- 0xC497: 1906,
- 0xC4A1: 1907,
- 0xC4A2: 1908,
- 0xC4B7: 1909,
- 0xC4E1: 1910,
- 0xC4E2: 1911,
- 0xC4E5: 1912,
- 0xC4E8: 1913,
- 0xC4E9: 1914,
- 0xC4F1: 1915,
- 0xC4F3: 1916,
- 0xC4F5: 1917,
- 0xC4F6: 1918,
- 0xC4F7: 1919,
- 0xC541: 1920,
- 0xC542: 1921,
- 0xC545: 1922,
- 0xC549: 1923,
- 0xC551: 1924,
- 0xC553: 1925,
- 0xC555: 1926,
- 0xC557: 1927,
- 0xC561: 1928,
- 0xC565: 1929,
- 0xC569: 1930,
- 0xC571: 1931,
- 0xC573: 1932,
- 0xC575: 1933,
- 0xC576: 1934,
- 0xC577: 1935,
- 0xC581: 1936,
- 0xC5A1: 1937,
- 0xC5A2: 1938,
- 0xC5A5: 1939,
- 0xC5A9: 1940,
- 0xC5B1: 1941,
- 0xC5B3: 1942,
- 0xC5B5: 1943,
- 0xC5B7: 1944,
- 0xC5C1: 1945,
- 0xC5C2: 1946,
- 0xC5C5: 1947,
- 0xC5C9: 1948,
- 0xC5D1: 1949,
- 0xC5D7: 1950,
- 0xC5E1: 1951,
- 0xC5F7: 1952,
- 0xC641: 1953,
- 0xC649: 1954,
- 0xC661: 1955,
- 0xC681: 1956,
- 0xC682: 1957,
- 0xC685: 1958,
- 0xC689: 1959,
- 0xC691: 1960,
- 0xC693: 1961,
- 0xC695: 1962,
- 0xC697: 1963,
- 0xC6A1: 1964,
- 0xC6A5: 1965,
- 0xC6A9: 1966,
- 0xC6B7: 1967,
- 0xC6C1: 1968,
- 0xC6D7: 1969,
- 0xC6E1: 1970,
- 0xC6E2: 1971,
- 0xC6E5: 1972,
- 0xC6E9: 1973,
- 0xC6F1: 1974,
- 0xC6F3: 1975,
- 0xC6F5: 1976,
- 0xC6F7: 1977,
- 0xC741: 1978,
- 0xC745: 1979,
- 0xC749: 1980,
- 0xC751: 1981,
- 0xC761: 1982,
- 0xC762: 1983,
- 0xC765: 1984,
- 0xC769: 1985,
- 0xC771: 1986,
- 0xC773: 1987,
- 0xC777: 1988,
- 0xC7A1: 1989,
- 0xC7A2: 1990,
- 0xC7A5: 1991,
- 0xC7A9: 1992,
- 0xC7B1: 1993,
- 0xC7B3: 1994,
- 0xC7B5: 1995,
- 0xC7B7: 1996,
- 0xC861: 1997,
- 0xC862: 1998,
- 0xC865: 1999,
- 0xC869: 2000,
- 0xC86A: 2001,
- 0xC871: 2002,
- 0xC873: 2003,
- 0xC875: 2004,
- 0xC876: 2005,
- 0xC877: 2006,
- 0xC881: 2007,
- 0xC882: 2008,
- 0xC885: 2009,
- 0xC889: 2010,
- 0xC891: 2011,
- 0xC893: 2012,
- 0xC895: 2013,
- 0xC896: 2014,
- 0xC897: 2015,
- 0xC8A1: 2016,
- 0xC8B7: 2017,
- 0xC8E1: 2018,
- 0xC8E2: 2019,
- 0xC8E5: 2020,
- 0xC8E9: 2021,
- 0xC8EB: 2022,
- 0xC8F1: 2023,
- 0xC8F3: 2024,
- 0xC8F5: 2025,
- 0xC8F6: 2026,
- 0xC8F7: 2027,
- 0xC941: 2028,
- 0xC942: 2029,
- 0xC945: 2030,
- 0xC949: 2031,
- 0xC951: 2032,
- 0xC953: 2033,
- 0xC955: 2034,
- 0xC957: 2035,
- 0xC961: 2036,
- 0xC965: 2037,
- 0xC976: 2038,
- 0xC981: 2039,
- 0xC985: 2040,
- 0xC9A1: 2041,
- 0xC9A2: 2042,
- 0xC9A5: 2043,
- 0xC9A9: 2044,
- 0xC9B1: 2045,
- 0xC9B3: 2046,
- 0xC9B5: 2047,
- 0xC9B7: 2048,
- 0xC9BC: 2049,
- 0xC9C1: 2050,
- 0xC9C5: 2051,
- 0xC9E1: 2052,
- 0xCA41: 2053,
- 0xCA45: 2054,
- 0xCA55: 2055,
- 0xCA57: 2056,
- 0xCA61: 2057,
- 0xCA81: 2058,
- 0xCA82: 2059,
- 0xCA85: 2060,
- 0xCA89: 2061,
- 0xCA91: 2062,
- 0xCA93: 2063,
- 0xCA95: 2064,
- 0xCA97: 2065,
- 0xCAA1: 2066,
- 0xCAB6: 2067,
- 0xCAC1: 2068,
- 0xCAE1: 2069,
- 0xCAE2: 2070,
- 0xCAE5: 2071,
- 0xCAE9: 2072,
- 0xCAF1: 2073,
- 0xCAF3: 2074,
- 0xCAF7: 2075,
- 0xCB41: 2076,
- 0xCB45: 2077,
- 0xCB49: 2078,
- 0xCB51: 2079,
- 0xCB57: 2080,
- 0xCB61: 2081,
- 0xCB62: 2082,
- 0xCB65: 2083,
- 0xCB68: 2084,
- 0xCB69: 2085,
- 0xCB6B: 2086,
- 0xCB71: 2087,
- 0xCB73: 2088,
- 0xCB75: 2089,
- 0xCB81: 2090,
- 0xCB85: 2091,
- 0xCB89: 2092,
- 0xCB91: 2093,
- 0xCB93: 2094,
- 0xCBA1: 2095,
- 0xCBA2: 2096,
- 0xCBA5: 2097,
- 0xCBA9: 2098,
- 0xCBB1: 2099,
- 0xCBB3: 2100,
- 0xCBB5: 2101,
- 0xCBB7: 2102,
- 0xCC61: 2103,
- 0xCC62: 2104,
- 0xCC63: 2105,
- 0xCC65: 2106,
- 0xCC69: 2107,
- 0xCC6B: 2108,
- 0xCC71: 2109,
- 0xCC73: 2110,
- 0xCC75: 2111,
- 0xCC76: 2112,
- 0xCC77: 2113,
- 0xCC7B: 2114,
- 0xCC81: 2115,
- 0xCC82: 2116,
- 0xCC85: 2117,
- 0xCC89: 2118,
- 0xCC91: 2119,
- 0xCC93: 2120,
- 0xCC95: 2121,
- 0xCC96: 2122,
- 0xCC97: 2123,
- 0xCCA1: 2124,
- 0xCCA2: 2125,
- 0xCCE1: 2126,
- 0xCCE2: 2127,
- 0xCCE5: 2128,
- 0xCCE9: 2129,
- 0xCCF1: 2130,
- 0xCCF3: 2131,
- 0xCCF5: 2132,
- 0xCCF6: 2133,
- 0xCCF7: 2134,
- 0xCD41: 2135,
- 0xCD42: 2136,
- 0xCD45: 2137,
- 0xCD49: 2138,
- 0xCD51: 2139,
- 0xCD53: 2140,
- 0xCD55: 2141,
- 0xCD57: 2142,
- 0xCD61: 2143,
- 0xCD65: 2144,
- 0xCD69: 2145,
- 0xCD71: 2146,
- 0xCD73: 2147,
- 0xCD76: 2148,
- 0xCD77: 2149,
- 0xCD81: 2150,
- 0xCD89: 2151,
- 0xCD93: 2152,
- 0xCD95: 2153,
- 0xCDA1: 2154,
- 0xCDA2: 2155,
- 0xCDA5: 2156,
- 0xCDA9: 2157,
- 0xCDB1: 2158,
- 0xCDB3: 2159,
- 0xCDB5: 2160,
- 0xCDB7: 2161,
- 0xCDC1: 2162,
- 0xCDD7: 2163,
- 0xCE41: 2164,
- 0xCE45: 2165,
- 0xCE61: 2166,
- 0xCE65: 2167,
- 0xCE69: 2168,
- 0xCE73: 2169,
- 0xCE75: 2170,
- 0xCE81: 2171,
- 0xCE82: 2172,
- 0xCE85: 2173,
- 0xCE88: 2174,
- 0xCE89: 2175,
- 0xCE8B: 2176,
- 0xCE91: 2177,
- 0xCE93: 2178,
- 0xCE95: 2179,
- 0xCE97: 2180,
- 0xCEA1: 2181,
- 0xCEB7: 2182,
- 0xCEE1: 2183,
- 0xCEE5: 2184,
- 0xCEE9: 2185,
- 0xCEF1: 2186,
- 0xCEF5: 2187,
- 0xCF41: 2188,
- 0xCF45: 2189,
- 0xCF49: 2190,
- 0xCF51: 2191,
- 0xCF55: 2192,
- 0xCF57: 2193,
- 0xCF61: 2194,
- 0xCF65: 2195,
- 0xCF69: 2196,
- 0xCF71: 2197,
- 0xCF73: 2198,
- 0xCF75: 2199,
- 0xCFA1: 2200,
- 0xCFA2: 2201,
- 0xCFA5: 2202,
- 0xCFA9: 2203,
- 0xCFB1: 2204,
- 0xCFB3: 2205,
- 0xCFB5: 2206,
- 0xCFB7: 2207,
- 0xD061: 2208,
- 0xD062: 2209,
- 0xD065: 2210,
- 0xD069: 2211,
- 0xD06E: 2212,
- 0xD071: 2213,
- 0xD073: 2214,
- 0xD075: 2215,
- 0xD077: 2216,
- 0xD081: 2217,
- 0xD082: 2218,
- 0xD085: 2219,
- 0xD089: 2220,
- 0xD091: 2221,
- 0xD093: 2222,
- 0xD095: 2223,
- 0xD096: 2224,
- 0xD097: 2225,
- 0xD0A1: 2226,
- 0xD0B7: 2227,
- 0xD0E1: 2228,
- 0xD0E2: 2229,
- 0xD0E5: 2230,
- 0xD0E9: 2231,
- 0xD0EB: 2232,
- 0xD0F1: 2233,
- 0xD0F3: 2234,
- 0xD0F5: 2235,
- 0xD0F7: 2236,
- 0xD141: 2237,
- 0xD142: 2238,
- 0xD145: 2239,
- 0xD149: 2240,
- 0xD151: 2241,
- 0xD153: 2242,
- 0xD155: 2243,
- 0xD157: 2244,
- 0xD161: 2245,
- 0xD162: 2246,
- 0xD165: 2247,
- 0xD169: 2248,
- 0xD171: 2249,
- 0xD173: 2250,
- 0xD175: 2251,
- 0xD176: 2252,
- 0xD177: 2253,
- 0xD181: 2254,
- 0xD185: 2255,
- 0xD189: 2256,
- 0xD193: 2257,
- 0xD1A1: 2258,
- 0xD1A2: 2259,
- 0xD1A5: 2260,
- 0xD1A9: 2261,
- 0xD1AE: 2262,
- 0xD1B1: 2263,
- 0xD1B3: 2264,
- 0xD1B5: 2265,
- 0xD1B7: 2266,
- 0xD1BB: 2267,
- 0xD1C1: 2268,
- 0xD1C2: 2269,
- 0xD1C5: 2270,
- 0xD1C9: 2271,
- 0xD1D5: 2272,
- 0xD1D7: 2273,
- 0xD1E1: 2274,
- 0xD1E2: 2275,
- 0xD1E5: 2276,
- 0xD1F5: 2277,
- 0xD1F7: 2278,
- 0xD241: 2279,
- 0xD242: 2280,
- 0xD245: 2281,
- 0xD249: 2282,
- 0xD253: 2283,
- 0xD255: 2284,
- 0xD257: 2285,
- 0xD261: 2286,
- 0xD265: 2287,
- 0xD269: 2288,
- 0xD273: 2289,
- 0xD275: 2290,
- 0xD281: 2291,
- 0xD282: 2292,
- 0xD285: 2293,
- 0xD289: 2294,
- 0xD28E: 2295,
- 0xD291: 2296,
- 0xD295: 2297,
- 0xD297: 2298,
- 0xD2A1: 2299,
- 0xD2A5: 2300,
- 0xD2A9: 2301,
- 0xD2B1: 2302,
- 0xD2B7: 2303,
- 0xD2C1: 2304,
- 0xD2C2: 2305,
- 0xD2C5: 2306,
- 0xD2C9: 2307,
- 0xD2D7: 2308,
- 0xD2E1: 2309,
- 0xD2E2: 2310,
- 0xD2E5: 2311,
- 0xD2E9: 2312,
- 0xD2F1: 2313,
- 0xD2F3: 2314,
- 0xD2F5: 2315,
- 0xD2F7: 2316,
- 0xD341: 2317,
- 0xD342: 2318,
- 0xD345: 2319,
- 0xD349: 2320,
- 0xD351: 2321,
- 0xD355: 2322,
- 0xD357: 2323,
- 0xD361: 2324,
- 0xD362: 2325,
- 0xD365: 2326,
- 0xD367: 2327,
- 0xD368: 2328,
- 0xD369: 2329,
- 0xD36A: 2330,
- 0xD371: 2331,
- 0xD373: 2332,
- 0xD375: 2333,
- 0xD377: 2334,
- 0xD37B: 2335,
- 0xD381: 2336,
- 0xD385: 2337,
- 0xD389: 2338,
- 0xD391: 2339,
- 0xD393: 2340,
- 0xD397: 2341,
- 0xD3A1: 2342,
- 0xD3A2: 2343,
- 0xD3A5: 2344,
- 0xD3A9: 2345,
- 0xD3B1: 2346,
- 0xD3B3: 2347,
- 0xD3B5: 2348,
- 0xD3B7: 2349,
-}
diff --git a/contrib/python/pip/pip/_vendor/chardet/johabprober.py b/contrib/python/pip/pip/_vendor/chardet/johabprober.py
deleted file mode 100644
index d7364ba61e..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/johabprober.py
+++ /dev/null
@@ -1,47 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .chardistribution import JOHABDistributionAnalysis
-from .codingstatemachine import CodingStateMachine
-from .mbcharsetprober import MultiByteCharSetProber
-from .mbcssm import JOHAB_SM_MODEL
-
-
-class JOHABProber(MultiByteCharSetProber):
- def __init__(self) -> None:
- super().__init__()
- self.coding_sm = CodingStateMachine(JOHAB_SM_MODEL)
- self.distribution_analyzer = JOHABDistributionAnalysis()
- self.reset()
-
- @property
- def charset_name(self) -> str:
- return "Johab"
-
- @property
- def language(self) -> str:
- return "Korean"
diff --git a/contrib/python/pip/pip/_vendor/chardet/jpcntx.py b/contrib/python/pip/pip/_vendor/chardet/jpcntx.py
deleted file mode 100644
index 2f53bdda09..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/jpcntx.py
+++ /dev/null
@@ -1,238 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import List, Tuple, Union
-
-# This is hiragana 2-char sequence table, the number in each cell represents its frequency category
-# fmt: off
-jp2_char_context = (
- (0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),
- (2, 4, 0, 4, 0, 3, 0, 4, 0, 3, 4, 4, 4, 2, 4, 3, 3, 4, 3, 2, 3, 3, 4, 2, 3, 3, 3, 2, 4, 1, 4, 3, 3, 1, 5, 4, 3, 4, 3, 4, 3, 5, 3, 0, 3, 5, 4, 2, 0, 3, 1, 0, 3, 3, 0, 3, 3, 0, 1, 1, 0, 4, 3, 0, 3, 3, 0, 4, 0, 2, 0, 3, 5, 5, 5, 5, 4, 0, 4, 1, 0, 3, 4),
- (0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2),
- (0, 4, 0, 5, 0, 5, 0, 4, 0, 4, 5, 4, 4, 3, 5, 3, 5, 1, 5, 3, 4, 3, 4, 4, 3, 4, 3, 3, 4, 3, 5, 4, 4, 3, 5, 5, 3, 5, 5, 5, 3, 5, 5, 3, 4, 5, 5, 3, 1, 3, 2, 0, 3, 4, 0, 4, 2, 0, 4, 2, 1, 5, 3, 2, 3, 5, 0, 4, 0, 2, 0, 5, 4, 4, 5, 4, 5, 0, 4, 0, 0, 4, 4),
- (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
- (0, 3, 0, 4, 0, 3, 0, 3, 0, 4, 5, 4, 3, 3, 3, 3, 4, 3, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 4, 4, 4, 4, 5, 3, 4, 4, 3, 4, 5, 5, 4, 5, 5, 1, 4, 5, 4, 3, 0, 3, 3, 1, 3, 3, 0, 4, 4, 0, 3, 3, 1, 5, 3, 3, 3, 5, 0, 4, 0, 3, 0, 4, 4, 3, 4, 3, 3, 0, 4, 1, 1, 3, 4),
- (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
- (0, 4, 0, 3, 0, 3, 0, 4, 0, 3, 4, 4, 3, 2, 2, 1, 2, 1, 3, 1, 3, 3, 3, 3, 3, 4, 3, 1, 3, 3, 5, 3, 3, 0, 4, 3, 0, 5, 4, 3, 3, 5, 4, 4, 3, 4, 4, 5, 0, 1, 2, 0, 1, 2, 0, 2, 2, 0, 1, 0, 0, 5, 2, 2, 1, 4, 0, 3, 0, 1, 0, 4, 4, 3, 5, 4, 3, 0, 2, 1, 0, 4, 3),
- (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
- (0, 3, 0, 5, 0, 4, 0, 2, 1, 4, 4, 2, 4, 1, 4, 2, 4, 2, 4, 3, 3, 3, 4, 3, 3, 3, 3, 1, 4, 2, 3, 3, 3, 1, 4, 4, 1, 1, 1, 4, 3, 3, 2, 0, 2, 4, 3, 2, 0, 3, 3, 0, 3, 1, 1, 0, 0, 0, 3, 3, 0, 4, 2, 2, 3, 4, 0, 4, 0, 3, 0, 4, 4, 5, 3, 4, 4, 0, 3, 0, 0, 1, 4),
- (1, 4, 0, 4, 0, 4, 0, 4, 0, 3, 5, 4, 4, 3, 4, 3, 5, 4, 3, 3, 4, 3, 5, 4, 4, 4, 4, 3, 4, 2, 4, 3, 3, 1, 5, 4, 3, 2, 4, 5, 4, 5, 5, 4, 4, 5, 4, 4, 0, 3, 2, 2, 3, 3, 0, 4, 3, 1, 3, 2, 1, 4, 3, 3, 4, 5, 0, 3, 0, 2, 0, 4, 5, 5, 4, 5, 4, 0, 4, 0, 0, 5, 4),
- (0, 5, 0, 5, 0, 4, 0, 3, 0, 4, 4, 3, 4, 3, 3, 3, 4, 0, 4, 4, 4, 3, 4, 3, 4, 3, 3, 1, 4, 2, 4, 3, 4, 0, 5, 4, 1, 4, 5, 4, 4, 5, 3, 2, 4, 3, 4, 3, 2, 4, 1, 3, 3, 3, 2, 3, 2, 0, 4, 3, 3, 4, 3, 3, 3, 4, 0, 4, 0, 3, 0, 4, 5, 4, 4, 4, 3, 0, 4, 1, 0, 1, 3),
- (0, 3, 1, 4, 0, 3, 0, 2, 0, 3, 4, 4, 3, 1, 4, 2, 3, 3, 4, 3, 4, 3, 4, 3, 4, 4, 3, 2, 3, 1, 5, 4, 4, 1, 4, 4, 3, 5, 4, 4, 3, 5, 5, 4, 3, 4, 4, 3, 1, 2, 3, 1, 2, 2, 0, 3, 2, 0, 3, 1, 0, 5, 3, 3, 3, 4, 3, 3, 3, 3, 4, 4, 4, 4, 5, 4, 2, 0, 3, 3, 2, 4, 3),
- (0, 2, 0, 3, 0, 1, 0, 1, 0, 0, 3, 2, 0, 0, 2, 0, 1, 0, 2, 1, 3, 3, 3, 1, 2, 3, 1, 0, 1, 0, 4, 2, 1, 1, 3, 3, 0, 4, 3, 3, 1, 4, 3, 3, 0, 3, 3, 2, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 4, 1, 0, 2, 3, 2, 2, 2, 1, 3, 3, 3, 4, 4, 3, 2, 0, 3, 1, 0, 3, 3),
- (0, 4, 0, 4, 0, 3, 0, 3, 0, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 3, 4, 2, 4, 3, 4, 3, 3, 2, 4, 3, 4, 5, 4, 1, 4, 5, 3, 5, 4, 5, 3, 5, 4, 0, 3, 5, 5, 3, 1, 3, 3, 2, 2, 3, 0, 3, 4, 1, 3, 3, 2, 4, 3, 3, 3, 4, 0, 4, 0, 3, 0, 4, 5, 4, 4, 5, 3, 0, 4, 1, 0, 3, 4),
- (0, 2, 0, 3, 0, 3, 0, 0, 0, 2, 2, 2, 1, 0, 1, 0, 0, 0, 3, 0, 3, 0, 3, 0, 1, 3, 1, 0, 3, 1, 3, 3, 3, 1, 3, 3, 3, 0, 1, 3, 1, 3, 4, 0, 0, 3, 1, 1, 0, 3, 2, 0, 0, 0, 0, 1, 3, 0, 1, 0, 0, 3, 3, 2, 0, 3, 0, 0, 0, 0, 0, 3, 4, 3, 4, 3, 3, 0, 3, 0, 0, 2, 3),
- (2, 3, 0, 3, 0, 2, 0, 1, 0, 3, 3, 4, 3, 1, 3, 1, 1, 1, 3, 1, 4, 3, 4, 3, 3, 3, 0, 0, 3, 1, 5, 4, 3, 1, 4, 3, 2, 5, 5, 4, 4, 4, 4, 3, 3, 4, 4, 4, 0, 2, 1, 1, 3, 2, 0, 1, 2, 0, 0, 1, 0, 4, 1, 3, 3, 3, 0, 3, 0, 1, 0, 4, 4, 4, 5, 5, 3, 0, 2, 0, 0, 4, 4),
- (0, 2, 0, 1, 0, 3, 1, 3, 0, 2, 3, 3, 3, 0, 3, 1, 0, 0, 3, 0, 3, 2, 3, 1, 3, 2, 1, 1, 0, 0, 4, 2, 1, 0, 2, 3, 1, 4, 3, 2, 0, 4, 4, 3, 1, 3, 1, 3, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4, 1, 1, 1, 2, 0, 3, 0, 0, 0, 3, 4, 2, 4, 3, 2, 0, 1, 0, 0, 3, 3),
- (0, 1, 0, 4, 0, 5, 0, 4, 0, 2, 4, 4, 2, 3, 3, 2, 3, 3, 5, 3, 3, 3, 4, 3, 4, 2, 3, 0, 4, 3, 3, 3, 4, 1, 4, 3, 2, 1, 5, 5, 3, 4, 5, 1, 3, 5, 4, 2, 0, 3, 3, 0, 1, 3, 0, 4, 2, 0, 1, 3, 1, 4, 3, 3, 3, 3, 0, 3, 0, 1, 0, 3, 4, 4, 4, 5, 5, 0, 3, 0, 1, 4, 5),
- (0, 2, 0, 3, 0, 3, 0, 0, 0, 2, 3, 1, 3, 0, 4, 0, 1, 1, 3, 0, 3, 4, 3, 2, 3, 1, 0, 3, 3, 2, 3, 1, 3, 0, 2, 3, 0, 2, 1, 4, 1, 2, 2, 0, 0, 3, 3, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 2, 2, 0, 3, 2, 1, 3, 3, 0, 2, 0, 2, 0, 0, 3, 3, 1, 2, 4, 0, 3, 0, 2, 2, 3),
- (2, 4, 0, 5, 0, 4, 0, 4, 0, 2, 4, 4, 4, 3, 4, 3, 3, 3, 1, 2, 4, 3, 4, 3, 4, 4, 5, 0, 3, 3, 3, 3, 2, 0, 4, 3, 1, 4, 3, 4, 1, 4, 4, 3, 3, 4, 4, 3, 1, 2, 3, 0, 4, 2, 0, 4, 1, 0, 3, 3, 0, 4, 3, 3, 3, 4, 0, 4, 0, 2, 0, 3, 5, 3, 4, 5, 2, 0, 3, 0, 0, 4, 5),
- (0, 3, 0, 4, 0, 1, 0, 1, 0, 1, 3, 2, 2, 1, 3, 0, 3, 0, 2, 0, 2, 0, 3, 0, 2, 0, 0, 0, 1, 0, 1, 1, 0, 0, 3, 1, 0, 0, 0, 4, 0, 3, 1, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 3, 1, 0, 3, 0, 0, 0, 1, 4, 4, 4, 3, 0, 0, 4, 0, 0, 1, 4),
- (1, 4, 1, 5, 0, 3, 0, 3, 0, 4, 5, 4, 4, 3, 5, 3, 3, 4, 4, 3, 4, 1, 3, 3, 3, 3, 2, 1, 4, 1, 5, 4, 3, 1, 4, 4, 3, 5, 4, 4, 3, 5, 4, 3, 3, 4, 4, 4, 0, 3, 3, 1, 2, 3, 0, 3, 1, 0, 3, 3, 0, 5, 4, 4, 4, 4, 4, 4, 3, 3, 5, 4, 4, 3, 3, 5, 4, 0, 3, 2, 0, 4, 4),
- (0, 2, 0, 3, 0, 1, 0, 0, 0, 1, 3, 3, 3, 2, 4, 1, 3, 0, 3, 1, 3, 0, 2, 2, 1, 1, 0, 0, 2, 0, 4, 3, 1, 0, 4, 3, 0, 4, 4, 4, 1, 4, 3, 1, 1, 3, 3, 1, 0, 2, 0, 0, 1, 3, 0, 0, 0, 0, 2, 0, 0, 4, 3, 2, 4, 3, 5, 4, 3, 3, 3, 4, 3, 3, 4, 3, 3, 0, 2, 1, 0, 3, 3),
- (0, 2, 0, 4, 0, 3, 0, 2, 0, 2, 5, 5, 3, 4, 4, 4, 4, 1, 4, 3, 3, 0, 4, 3, 4, 3, 1, 3, 3, 2, 4, 3, 0, 3, 4, 3, 0, 3, 4, 4, 2, 4, 4, 0, 4, 5, 3, 3, 2, 2, 1, 1, 1, 2, 0, 1, 5, 0, 3, 3, 2, 4, 3, 3, 3, 4, 0, 3, 0, 2, 0, 4, 4, 3, 5, 5, 0, 0, 3, 0, 2, 3, 3),
- (0, 3, 0, 4, 0, 3, 0, 1, 0, 3, 4, 3, 3, 1, 3, 3, 3, 0, 3, 1, 3, 0, 4, 3, 3, 1, 1, 0, 3, 0, 3, 3, 0, 0, 4, 4, 0, 1, 5, 4, 3, 3, 5, 0, 3, 3, 4, 3, 0, 2, 0, 1, 1, 1, 0, 1, 3, 0, 1, 2, 1, 3, 3, 2, 3, 3, 0, 3, 0, 1, 0, 1, 3, 3, 4, 4, 1, 0, 1, 2, 2, 1, 3),
- (0, 1, 0, 4, 0, 4, 0, 3, 0, 1, 3, 3, 3, 2, 3, 1, 1, 0, 3, 0, 3, 3, 4, 3, 2, 4, 2, 0, 1, 0, 4, 3, 2, 0, 4, 3, 0, 5, 3, 3, 2, 4, 4, 4, 3, 3, 3, 4, 0, 1, 3, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 4, 2, 3, 3, 3, 0, 3, 0, 0, 0, 4, 4, 4, 5, 3, 2, 0, 3, 3, 0, 3, 5),
- (0, 2, 0, 3, 0, 0, 0, 3, 0, 1, 3, 0, 2, 0, 0, 0, 1, 0, 3, 1, 1, 3, 3, 0, 0, 3, 0, 0, 3, 0, 2, 3, 1, 0, 3, 1, 0, 3, 3, 2, 0, 4, 2, 2, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 1, 0, 1, 0, 0, 0, 1, 3, 1, 2, 0, 0, 0, 1, 0, 0, 1, 4),
- (0, 3, 0, 3, 0, 5, 0, 1, 0, 2, 4, 3, 1, 3, 3, 2, 1, 1, 5, 2, 1, 0, 5, 1, 2, 0, 0, 0, 3, 3, 2, 2, 3, 2, 4, 3, 0, 0, 3, 3, 1, 3, 3, 0, 2, 5, 3, 4, 0, 3, 3, 0, 1, 2, 0, 2, 2, 0, 3, 2, 0, 2, 2, 3, 3, 3, 0, 2, 0, 1, 0, 3, 4, 4, 2, 5, 4, 0, 3, 0, 0, 3, 5),
- (0, 3, 0, 3, 0, 3, 0, 1, 0, 3, 3, 3, 3, 0, 3, 0, 2, 0, 2, 1, 1, 0, 2, 0, 1, 0, 0, 0, 2, 1, 0, 0, 1, 0, 3, 2, 0, 0, 3, 3, 1, 2, 3, 1, 0, 3, 3, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 3, 1, 2, 3, 0, 3, 0, 1, 0, 3, 2, 1, 0, 4, 3, 0, 1, 1, 0, 3, 3),
- (0, 4, 0, 5, 0, 3, 0, 3, 0, 4, 5, 5, 4, 3, 5, 3, 4, 3, 5, 3, 3, 2, 5, 3, 4, 4, 4, 3, 4, 3, 4, 5, 5, 3, 4, 4, 3, 4, 4, 5, 4, 4, 4, 3, 4, 5, 5, 4, 2, 3, 4, 2, 3, 4, 0, 3, 3, 1, 4, 3, 2, 4, 3, 3, 5, 5, 0, 3, 0, 3, 0, 5, 5, 5, 5, 4, 4, 0, 4, 0, 1, 4, 4),
- (0, 4, 0, 4, 0, 3, 0, 3, 0, 3, 5, 4, 4, 2, 3, 2, 5, 1, 3, 2, 5, 1, 4, 2, 3, 2, 3, 3, 4, 3, 3, 3, 3, 2, 5, 4, 1, 3, 3, 5, 3, 4, 4, 0, 4, 4, 3, 1, 1, 3, 1, 0, 2, 3, 0, 2, 3, 0, 3, 0, 0, 4, 3, 1, 3, 4, 0, 3, 0, 2, 0, 4, 4, 4, 3, 4, 5, 0, 4, 0, 0, 3, 4),
- (0, 3, 0, 3, 0, 3, 1, 2, 0, 3, 4, 4, 3, 3, 3, 0, 2, 2, 4, 3, 3, 1, 3, 3, 3, 1, 1, 0, 3, 1, 4, 3, 2, 3, 4, 4, 2, 4, 4, 4, 3, 4, 4, 3, 2, 4, 4, 3, 1, 3, 3, 1, 3, 3, 0, 4, 1, 0, 2, 2, 1, 4, 3, 2, 3, 3, 5, 4, 3, 3, 5, 4, 4, 3, 3, 0, 4, 0, 3, 2, 2, 4, 4),
- (0, 2, 0, 1, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 2, 0, 1, 2, 1, 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 1, 0, 1, 1, 3, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 0, 3, 4, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1),
- (0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4, 0, 4, 1, 4, 0, 3, 0, 4, 0, 3, 0, 4, 0, 3, 0, 3, 0, 4, 1, 5, 1, 4, 0, 0, 3, 0, 5, 0, 5, 2, 0, 1, 0, 0, 0, 2, 1, 4, 0, 1, 3, 0, 0, 3, 0, 0, 3, 1, 1, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0),
- (1, 4, 0, 5, 0, 3, 0, 2, 0, 3, 5, 4, 4, 3, 4, 3, 5, 3, 4, 3, 3, 0, 4, 3, 3, 3, 3, 3, 3, 2, 4, 4, 3, 1, 3, 4, 4, 5, 4, 4, 3, 4, 4, 1, 3, 5, 4, 3, 3, 3, 1, 2, 2, 3, 3, 1, 3, 1, 3, 3, 3, 5, 3, 3, 4, 5, 0, 3, 0, 3, 0, 3, 4, 3, 4, 4, 3, 0, 3, 0, 2, 4, 3),
- (0, 1, 0, 4, 0, 0, 0, 0, 0, 1, 4, 0, 4, 1, 4, 2, 4, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 3, 1, 1, 1, 0, 3, 0, 0, 0, 1, 2, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 3, 2, 0, 2, 2, 0, 1, 0, 0, 0, 2, 3, 2, 3, 3, 0, 0, 0, 0, 2, 1, 0),
- (0, 5, 1, 5, 0, 3, 0, 3, 0, 5, 4, 4, 5, 1, 5, 3, 3, 0, 4, 3, 4, 3, 5, 3, 4, 3, 3, 2, 4, 3, 4, 3, 3, 0, 3, 3, 1, 4, 4, 3, 4, 4, 4, 3, 4, 5, 5, 3, 2, 3, 1, 1, 3, 3, 1, 3, 1, 1, 3, 3, 2, 4, 5, 3, 3, 5, 0, 4, 0, 3, 0, 4, 4, 3, 5, 3, 3, 0, 3, 4, 0, 4, 3),
- (0, 5, 0, 5, 0, 3, 0, 2, 0, 4, 4, 3, 5, 2, 4, 3, 3, 3, 4, 4, 4, 3, 5, 3, 5, 3, 3, 1, 4, 0, 4, 3, 3, 0, 3, 3, 0, 4, 4, 4, 4, 5, 4, 3, 3, 5, 5, 3, 2, 3, 1, 2, 3, 2, 0, 1, 0, 0, 3, 2, 2, 4, 4, 3, 1, 5, 0, 4, 0, 3, 0, 4, 3, 1, 3, 2, 1, 0, 3, 3, 0, 3, 3),
- (0, 4, 0, 5, 0, 5, 0, 4, 0, 4, 5, 5, 5, 3, 4, 3, 3, 2, 5, 4, 4, 3, 5, 3, 5, 3, 4, 0, 4, 3, 4, 4, 3, 2, 4, 4, 3, 4, 5, 4, 4, 5, 5, 0, 3, 5, 5, 4, 1, 3, 3, 2, 3, 3, 1, 3, 1, 0, 4, 3, 1, 4, 4, 3, 4, 5, 0, 4, 0, 2, 0, 4, 3, 4, 4, 3, 3, 0, 4, 0, 0, 5, 5),
- (0, 4, 0, 4, 0, 5, 0, 1, 1, 3, 3, 4, 4, 3, 4, 1, 3, 0, 5, 1, 3, 0, 3, 1, 3, 1, 1, 0, 3, 0, 3, 3, 4, 0, 4, 3, 0, 4, 4, 4, 3, 4, 4, 0, 3, 5, 4, 1, 0, 3, 0, 0, 2, 3, 0, 3, 1, 0, 3, 1, 0, 3, 2, 1, 3, 5, 0, 3, 0, 1, 0, 3, 2, 3, 3, 4, 4, 0, 2, 2, 0, 4, 4),
- (2, 4, 0, 5, 0, 4, 0, 3, 0, 4, 5, 5, 4, 3, 5, 3, 5, 3, 5, 3, 5, 2, 5, 3, 4, 3, 3, 4, 3, 4, 5, 3, 2, 1, 5, 4, 3, 2, 3, 4, 5, 3, 4, 1, 2, 5, 4, 3, 0, 3, 3, 0, 3, 2, 0, 2, 3, 0, 4, 1, 0, 3, 4, 3, 3, 5, 0, 3, 0, 1, 0, 4, 5, 5, 5, 4, 3, 0, 4, 2, 0, 3, 5),
- (0, 5, 0, 4, 0, 4, 0, 2, 0, 5, 4, 3, 4, 3, 4, 3, 3, 3, 4, 3, 4, 2, 5, 3, 5, 3, 4, 1, 4, 3, 4, 4, 4, 0, 3, 5, 0, 4, 4, 4, 4, 5, 3, 1, 3, 4, 5, 3, 3, 3, 3, 3, 3, 3, 0, 2, 2, 0, 3, 3, 2, 4, 3, 3, 3, 5, 3, 4, 1, 3, 3, 5, 3, 2, 0, 0, 0, 0, 4, 3, 1, 3, 3),
- (0, 1, 0, 3, 0, 3, 0, 1, 0, 1, 3, 3, 3, 2, 3, 3, 3, 0, 3, 0, 0, 0, 3, 1, 3, 0, 0, 0, 2, 2, 2, 3, 0, 0, 3, 2, 0, 1, 2, 4, 1, 3, 3, 0, 0, 3, 3, 3, 0, 1, 0, 0, 2, 1, 0, 0, 3, 0, 3, 1, 0, 3, 0, 0, 1, 3, 0, 2, 0, 1, 0, 3, 3, 1, 3, 3, 0, 0, 1, 1, 0, 3, 3),
- (0, 2, 0, 3, 0, 2, 1, 4, 0, 2, 2, 3, 1, 1, 3, 1, 1, 0, 2, 0, 3, 1, 2, 3, 1, 3, 0, 0, 1, 0, 4, 3, 2, 3, 3, 3, 1, 4, 2, 3, 3, 3, 3, 1, 0, 3, 1, 4, 0, 1, 1, 0, 1, 2, 0, 1, 1, 0, 1, 1, 0, 3, 1, 3, 2, 2, 0, 1, 0, 0, 0, 2, 3, 3, 3, 1, 0, 0, 0, 0, 0, 2, 3),
- (0, 5, 0, 4, 0, 5, 0, 2, 0, 4, 5, 5, 3, 3, 4, 3, 3, 1, 5, 4, 4, 2, 4, 4, 4, 3, 4, 2, 4, 3, 5, 5, 4, 3, 3, 4, 3, 3, 5, 5, 4, 5, 5, 1, 3, 4, 5, 3, 1, 4, 3, 1, 3, 3, 0, 3, 3, 1, 4, 3, 1, 4, 5, 3, 3, 5, 0, 4, 0, 3, 0, 5, 3, 3, 1, 4, 3, 0, 4, 0, 1, 5, 3),
- (0, 5, 0, 5, 0, 4, 0, 2, 0, 4, 4, 3, 4, 3, 3, 3, 3, 3, 5, 4, 4, 4, 4, 4, 4, 5, 3, 3, 5, 2, 4, 4, 4, 3, 4, 4, 3, 3, 4, 4, 5, 5, 3, 3, 4, 3, 4, 3, 3, 4, 3, 3, 3, 3, 1, 2, 2, 1, 4, 3, 3, 5, 4, 4, 3, 4, 0, 4, 0, 3, 0, 4, 4, 4, 4, 4, 1, 0, 4, 2, 0, 2, 4),
- (0, 4, 0, 4, 0, 3, 0, 1, 0, 3, 5, 2, 3, 0, 3, 0, 2, 1, 4, 2, 3, 3, 4, 1, 4, 3, 3, 2, 4, 1, 3, 3, 3, 0, 3, 3, 0, 0, 3, 3, 3, 5, 3, 3, 3, 3, 3, 2, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 1, 0, 0, 3, 1, 2, 2, 3, 0, 3, 0, 2, 0, 4, 4, 3, 3, 4, 1, 0, 3, 0, 0, 2, 4),
- (0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 2, 0, 0, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 3, 1, 3, 0, 3, 2, 0, 0, 0, 1, 0, 3, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 2, 0, 0, 0, 0, 0, 0, 2),
- (0, 2, 1, 3, 0, 2, 0, 2, 0, 3, 3, 3, 3, 1, 3, 1, 3, 3, 3, 3, 3, 3, 4, 2, 2, 1, 2, 1, 4, 0, 4, 3, 1, 3, 3, 3, 2, 4, 3, 5, 4, 3, 3, 3, 3, 3, 3, 3, 0, 1, 3, 0, 2, 0, 0, 1, 0, 0, 1, 0, 0, 4, 2, 0, 2, 3, 0, 3, 3, 0, 3, 3, 4, 2, 3, 1, 4, 0, 1, 2, 0, 2, 3),
- (0, 3, 0, 3, 0, 1, 0, 3, 0, 2, 3, 3, 3, 0, 3, 1, 2, 0, 3, 3, 2, 3, 3, 2, 3, 2, 3, 1, 3, 0, 4, 3, 2, 0, 3, 3, 1, 4, 3, 3, 2, 3, 4, 3, 1, 3, 3, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 4, 1, 1, 0, 3, 0, 3, 1, 0, 2, 3, 3, 3, 3, 3, 1, 0, 0, 2, 0, 3, 3),
- (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 3, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3),
- (0, 2, 0, 3, 1, 3, 0, 3, 0, 2, 3, 3, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 1, 3, 0, 2, 3, 1, 1, 4, 3, 3, 2, 3, 3, 1, 2, 2, 4, 1, 3, 3, 0, 1, 4, 2, 3, 0, 1, 3, 0, 3, 0, 0, 1, 3, 0, 2, 0, 0, 3, 3, 2, 1, 3, 0, 3, 0, 2, 0, 3, 4, 4, 4, 3, 1, 0, 3, 0, 0, 3, 3),
- (0, 2, 0, 1, 0, 2, 0, 0, 0, 1, 3, 2, 2, 1, 3, 0, 1, 1, 3, 0, 3, 2, 3, 1, 2, 0, 2, 0, 1, 1, 3, 3, 3, 0, 3, 3, 1, 1, 2, 3, 2, 3, 3, 1, 2, 3, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 2, 1, 2, 1, 3, 0, 3, 0, 0, 0, 3, 4, 4, 4, 3, 2, 0, 2, 0, 0, 2, 4),
- (0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0, 0, 0, 3),
- (0, 3, 0, 3, 0, 2, 0, 3, 0, 3, 3, 3, 2, 3, 2, 2, 2, 0, 3, 1, 3, 3, 3, 2, 3, 3, 0, 0, 3, 0, 3, 2, 2, 0, 2, 3, 1, 4, 3, 4, 3, 3, 2, 3, 1, 5, 4, 4, 0, 3, 1, 2, 1, 3, 0, 3, 1, 1, 2, 0, 2, 3, 1, 3, 1, 3, 0, 3, 0, 1, 0, 3, 3, 4, 4, 2, 1, 0, 2, 1, 0, 2, 4),
- (0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 4, 2, 5, 1, 4, 0, 2, 0, 2, 1, 3, 1, 4, 0, 2, 1, 0, 0, 2, 1, 4, 1, 1, 0, 3, 3, 0, 5, 1, 3, 2, 3, 3, 1, 0, 3, 2, 3, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 4, 0, 1, 0, 3, 0, 2, 0, 1, 0, 3, 3, 3, 4, 3, 3, 0, 0, 0, 0, 2, 3),
- (0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 1, 0, 0, 0, 0, 0, 3),
- (0, 1, 0, 3, 0, 4, 0, 3, 0, 2, 4, 3, 1, 0, 3, 2, 2, 1, 3, 1, 2, 2, 3, 1, 1, 1, 2, 1, 3, 0, 1, 2, 0, 1, 3, 2, 1, 3, 0, 5, 5, 1, 0, 0, 1, 3, 2, 1, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 3, 4, 0, 1, 1, 1, 3, 2, 0, 2, 0, 1, 0, 2, 3, 3, 1, 2, 3, 0, 1, 0, 1, 0, 4),
- (0, 0, 0, 1, 0, 3, 0, 3, 0, 2, 2, 1, 0, 0, 4, 0, 3, 0, 3, 1, 3, 0, 3, 0, 3, 0, 1, 0, 3, 0, 3, 1, 3, 0, 3, 3, 0, 0, 1, 2, 1, 1, 1, 0, 1, 2, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 2, 0, 0, 2, 0, 0, 0, 0, 2, 3, 3, 3, 3, 0, 0, 0, 0, 1, 4),
- (0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3, 1, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 2, 0, 2, 3, 0, 0, 2, 2, 3, 1, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 2, 3),
- (2, 4, 0, 5, 0, 5, 0, 4, 0, 3, 4, 3, 3, 3, 4, 3, 3, 3, 4, 3, 4, 4, 5, 4, 5, 5, 5, 2, 3, 0, 5, 5, 4, 1, 5, 4, 3, 1, 5, 4, 3, 4, 4, 3, 3, 4, 3, 3, 0, 3, 2, 0, 2, 3, 0, 3, 0, 0, 3, 3, 0, 5, 3, 2, 3, 3, 0, 3, 0, 3, 0, 3, 4, 5, 4, 5, 3, 0, 4, 3, 0, 3, 4),
- (0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 3, 4, 3, 2, 3, 2, 3, 0, 4, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 2, 4, 3, 3, 1, 3, 4, 3, 4, 4, 4, 3, 4, 4, 3, 2, 4, 4, 1, 0, 2, 0, 0, 1, 1, 0, 2, 0, 0, 3, 1, 0, 5, 3, 2, 1, 3, 0, 3, 0, 1, 2, 4, 3, 2, 4, 3, 3, 0, 3, 2, 0, 4, 4),
- (0, 3, 0, 3, 0, 1, 0, 0, 0, 1, 4, 3, 3, 2, 3, 1, 3, 1, 4, 2, 3, 2, 4, 2, 3, 4, 3, 0, 2, 2, 3, 3, 3, 0, 3, 3, 3, 0, 3, 4, 1, 3, 3, 0, 3, 4, 3, 3, 0, 1, 1, 0, 1, 0, 0, 0, 4, 0, 3, 0, 0, 3, 1, 2, 1, 3, 0, 4, 0, 1, 0, 4, 3, 3, 4, 3, 3, 0, 2, 0, 0, 3, 3),
- (0, 3, 0, 4, 0, 1, 0, 3, 0, 3, 4, 3, 3, 0, 3, 3, 3, 1, 3, 1, 3, 3, 4, 3, 3, 3, 0, 0, 3, 1, 5, 3, 3, 1, 3, 3, 2, 5, 4, 3, 3, 4, 5, 3, 2, 5, 3, 4, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 1, 1, 0, 4, 2, 2, 1, 3, 0, 3, 0, 2, 0, 4, 4, 3, 5, 3, 2, 0, 1, 1, 0, 3, 4),
- (0, 5, 0, 4, 0, 5, 0, 2, 0, 4, 4, 3, 3, 2, 3, 3, 3, 1, 4, 3, 4, 1, 5, 3, 4, 3, 4, 0, 4, 2, 4, 3, 4, 1, 5, 4, 0, 4, 4, 4, 4, 5, 4, 1, 3, 5, 4, 2, 1, 4, 1, 1, 3, 2, 0, 3, 1, 0, 3, 2, 1, 4, 3, 3, 3, 4, 0, 4, 0, 3, 0, 4, 4, 4, 3, 3, 3, 0, 4, 2, 0, 3, 4),
- (1, 4, 0, 4, 0, 3, 0, 1, 0, 3, 3, 3, 1, 1, 3, 3, 2, 2, 3, 3, 1, 0, 3, 2, 2, 1, 2, 0, 3, 1, 2, 1, 2, 0, 3, 2, 0, 2, 2, 3, 3, 4, 3, 0, 3, 3, 1, 2, 0, 1, 1, 3, 1, 2, 0, 0, 3, 0, 1, 1, 0, 3, 2, 2, 3, 3, 0, 3, 0, 0, 0, 2, 3, 3, 4, 3, 3, 0, 1, 0, 0, 1, 4),
- (0, 4, 0, 4, 0, 4, 0, 0, 0, 3, 4, 4, 3, 1, 4, 2, 3, 2, 3, 3, 3, 1, 4, 3, 4, 0, 3, 0, 4, 2, 3, 3, 2, 2, 5, 4, 2, 1, 3, 4, 3, 4, 3, 1, 3, 3, 4, 2, 0, 2, 1, 0, 3, 3, 0, 0, 2, 0, 3, 1, 0, 4, 4, 3, 4, 3, 0, 4, 0, 1, 0, 2, 4, 4, 4, 4, 4, 0, 3, 2, 0, 3, 3),
- (0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 2, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2),
- (0, 2, 0, 3, 0, 4, 0, 4, 0, 1, 3, 3, 3, 0, 4, 0, 2, 1, 2, 1, 1, 1, 2, 0, 3, 1, 1, 0, 1, 0, 3, 1, 0, 0, 3, 3, 2, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 2, 2, 0, 3, 1, 0, 0, 1, 0, 1, 1, 0, 1, 2, 0, 3, 0, 0, 0, 0, 1, 0, 0, 3, 3, 4, 3, 1, 0, 1, 0, 3, 0, 2),
- (0, 0, 0, 3, 0, 5, 0, 0, 0, 0, 1, 0, 2, 0, 3, 1, 0, 1, 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 4, 0, 0, 0, 2, 3, 0, 1, 4, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 3),
- (0, 2, 0, 5, 0, 5, 0, 1, 0, 2, 4, 3, 3, 2, 5, 1, 3, 2, 3, 3, 3, 0, 4, 1, 2, 0, 3, 0, 4, 0, 2, 2, 1, 1, 5, 3, 0, 0, 1, 4, 2, 3, 2, 0, 3, 3, 3, 2, 0, 2, 4, 1, 1, 2, 0, 1, 1, 0, 3, 1, 0, 1, 3, 1, 2, 3, 0, 2, 0, 0, 0, 1, 3, 5, 4, 4, 4, 0, 3, 0, 0, 1, 3),
- (0, 4, 0, 5, 0, 4, 0, 4, 0, 4, 5, 4, 3, 3, 4, 3, 3, 3, 4, 3, 4, 4, 5, 3, 4, 5, 4, 2, 4, 2, 3, 4, 3, 1, 4, 4, 1, 3, 5, 4, 4, 5, 5, 4, 4, 5, 5, 5, 2, 3, 3, 1, 4, 3, 1, 3, 3, 0, 3, 3, 1, 4, 3, 4, 4, 4, 0, 3, 0, 4, 0, 3, 3, 4, 4, 5, 0, 0, 4, 3, 0, 4, 5),
- (0, 4, 0, 4, 0, 3, 0, 3, 0, 3, 4, 4, 4, 3, 3, 2, 4, 3, 4, 3, 4, 3, 5, 3, 4, 3, 2, 1, 4, 2, 4, 4, 3, 1, 3, 4, 2, 4, 5, 5, 3, 4, 5, 4, 1, 5, 4, 3, 0, 3, 2, 2, 3, 2, 1, 3, 1, 0, 3, 3, 3, 5, 3, 3, 3, 5, 4, 4, 2, 3, 3, 4, 3, 3, 3, 2, 1, 0, 3, 2, 1, 4, 3),
- (0, 4, 0, 5, 0, 4, 0, 3, 0, 3, 5, 5, 3, 2, 4, 3, 4, 0, 5, 4, 4, 1, 4, 4, 4, 3, 3, 3, 4, 3, 5, 5, 2, 3, 3, 4, 1, 2, 5, 5, 3, 5, 5, 2, 3, 5, 5, 4, 0, 3, 2, 0, 3, 3, 1, 1, 5, 1, 4, 1, 0, 4, 3, 2, 3, 5, 0, 4, 0, 3, 0, 5, 4, 3, 4, 3, 0, 0, 4, 1, 0, 4, 4),
- (1, 3, 0, 4, 0, 2, 0, 2, 0, 2, 5, 5, 3, 3, 3, 3, 3, 0, 4, 2, 3, 4, 4, 4, 3, 4, 0, 0, 3, 4, 5, 4, 3, 3, 3, 3, 2, 5, 5, 4, 5, 5, 5, 4, 3, 5, 5, 5, 1, 3, 1, 0, 1, 0, 0, 3, 2, 0, 4, 2, 0, 5, 2, 3, 2, 4, 1, 3, 0, 3, 0, 4, 5, 4, 5, 4, 3, 0, 4, 2, 0, 5, 4),
- (0, 3, 0, 4, 0, 5, 0, 3, 0, 3, 4, 4, 3, 2, 3, 2, 3, 3, 3, 3, 3, 2, 4, 3, 3, 2, 2, 0, 3, 3, 3, 3, 3, 1, 3, 3, 3, 0, 4, 4, 3, 4, 4, 1, 1, 4, 4, 2, 0, 3, 1, 0, 1, 1, 0, 4, 1, 0, 2, 3, 1, 3, 3, 1, 3, 4, 0, 3, 0, 1, 0, 3, 1, 3, 0, 0, 1, 0, 2, 0, 0, 4, 4),
- (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
- (0, 3, 0, 3, 0, 2, 0, 3, 0, 1, 5, 4, 3, 3, 3, 1, 4, 2, 1, 2, 3, 4, 4, 2, 4, 4, 5, 0, 3, 1, 4, 3, 4, 0, 4, 3, 3, 3, 2, 3, 2, 5, 3, 4, 3, 2, 2, 3, 0, 0, 3, 0, 2, 1, 0, 1, 2, 0, 0, 0, 0, 2, 1, 1, 3, 1, 0, 2, 0, 4, 0, 3, 4, 4, 4, 5, 2, 0, 2, 0, 0, 1, 3),
- (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 4, 2, 1, 1, 0, 1, 0, 3, 2, 0, 0, 3, 1, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 4, 0, 4, 2, 1, 0, 0, 0, 0, 0, 1),
- (0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 2, 0, 2, 1, 0, 0, 1, 2, 1, 0, 1, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0, 1, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2),
- (0, 4, 0, 4, 0, 4, 0, 3, 0, 4, 4, 3, 4, 2, 4, 3, 2, 0, 4, 4, 4, 3, 5, 3, 5, 3, 3, 2, 4, 2, 4, 3, 4, 3, 1, 4, 0, 2, 3, 4, 4, 4, 3, 3, 3, 4, 4, 4, 3, 4, 1, 3, 4, 3, 2, 1, 2, 1, 3, 3, 3, 4, 4, 3, 3, 5, 0, 4, 0, 3, 0, 4, 3, 3, 3, 2, 1, 0, 3, 0, 0, 3, 3),
- (0, 4, 0, 3, 0, 3, 0, 3, 0, 3, 5, 5, 3, 3, 3, 3, 4, 3, 4, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 4, 3, 5, 3, 3, 1, 3, 2, 4, 5, 5, 5, 5, 4, 3, 4, 5, 5, 3, 2, 2, 3, 3, 3, 3, 2, 3, 3, 1, 2, 3, 2, 4, 3, 3, 3, 4, 0, 4, 0, 2, 0, 4, 3, 2, 2, 1, 2, 0, 3, 0, 0, 4, 1),
-)
-# fmt: on
-
-
-class JapaneseContextAnalysis:
- NUM_OF_CATEGORY = 6
- DONT_KNOW = -1
- ENOUGH_REL_THRESHOLD = 100
- MAX_REL_THRESHOLD = 1000
- MINIMUM_DATA_THRESHOLD = 4
-
- def __init__(self) -> None:
- self._total_rel = 0
- self._rel_sample: List[int] = []
- self._need_to_skip_char_num = 0
- self._last_char_order = -1
- self._done = False
- self.reset()
-
- def reset(self) -> None:
- self._total_rel = 0 # total sequence received
- # category counters, each integer counts sequence in its category
- self._rel_sample = [0] * self.NUM_OF_CATEGORY
- # if last byte in current buffer is not the last byte of a character,
- # we need to know how many bytes to skip in next buffer
- self._need_to_skip_char_num = 0
- self._last_char_order = -1 # The order of previous char
- # If this flag is set to True, detection is done and conclusion has
- # been made
- self._done = False
-
- def feed(self, byte_str: Union[bytes, bytearray], num_bytes: int) -> None:
- if self._done:
- return
-
- # The buffer we got is byte oriented, and a character may span in more than one
- # buffers. In case the last one or two byte in last buffer is not
- # complete, we record how many byte needed to complete that character
- # and skip these bytes here. We can choose to record those bytes as
- # well and analyse the character once it is complete, but since a
- # character will not make much difference, by simply skipping
- # this character will simply our logic and improve performance.
- i = self._need_to_skip_char_num
- while i < num_bytes:
- order, char_len = self.get_order(byte_str[i : i + 2])
- i += char_len
- if i > num_bytes:
- self._need_to_skip_char_num = i - num_bytes
- self._last_char_order = -1
- else:
- if (order != -1) and (self._last_char_order != -1):
- self._total_rel += 1
- if self._total_rel > self.MAX_REL_THRESHOLD:
- self._done = True
- break
- self._rel_sample[
- jp2_char_context[self._last_char_order][order]
- ] += 1
- self._last_char_order = order
-
- def got_enough_data(self) -> bool:
- return self._total_rel > self.ENOUGH_REL_THRESHOLD
-
- def get_confidence(self) -> float:
- # This is just one way to calculate confidence. It works well for me.
- if self._total_rel > self.MINIMUM_DATA_THRESHOLD:
- return (self._total_rel - self._rel_sample[0]) / self._total_rel
- return self.DONT_KNOW
-
- def get_order(self, _: Union[bytes, bytearray]) -> Tuple[int, int]:
- return -1, 1
-
-
-class SJISContextAnalysis(JapaneseContextAnalysis):
- def __init__(self) -> None:
- super().__init__()
- self._charset_name = "SHIFT_JIS"
-
- @property
- def charset_name(self) -> str:
- return self._charset_name
-
- def get_order(self, byte_str: Union[bytes, bytearray]) -> Tuple[int, int]:
- if not byte_str:
- return -1, 1
- # find out current char's byte length
- first_char = byte_str[0]
- if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC):
- char_len = 2
- if (first_char == 0x87) or (0xFA <= first_char <= 0xFC):
- self._charset_name = "CP932"
- else:
- char_len = 1
-
- # return its order if it is hiragana
- if len(byte_str) > 1:
- second_char = byte_str[1]
- if (first_char == 202) and (0x9F <= second_char <= 0xF1):
- return second_char - 0x9F, char_len
-
- return -1, char_len
-
-
-class EUCJPContextAnalysis(JapaneseContextAnalysis):
- def get_order(self, byte_str: Union[bytes, bytearray]) -> Tuple[int, int]:
- if not byte_str:
- return -1, 1
- # find out current char's byte length
- first_char = byte_str[0]
- if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE):
- char_len = 2
- elif first_char == 0x8F:
- char_len = 3
- else:
- char_len = 1
-
- # return its order if it is hiragana
- if len(byte_str) > 1:
- second_char = byte_str[1]
- if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3):
- return second_char - 0xA1, char_len
-
- return -1, char_len
diff --git a/contrib/python/pip/pip/_vendor/chardet/langbulgarianmodel.py b/contrib/python/pip/pip/_vendor/chardet/langbulgarianmodel.py
deleted file mode 100644
index 994668219d..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/langbulgarianmodel.py
+++ /dev/null
@@ -1,4649 +0,0 @@
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-BULGARIAN_LANG_MODEL = {
- 63: { # 'e'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 1, # 'б'
- 9: 1, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 1, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 0, # 'и'
- 26: 1, # 'й'
- 12: 1, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 1, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'р'
- 8: 1, # 'с'
- 5: 1, # 'т'
- 19: 0, # 'у'
- 29: 1, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 45: { # '\xad'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 0, # 'Л'
- 38: 1, # 'М'
- 36: 0, # 'Н'
- 41: 1, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Р'
- 28: 1, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 1, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 0, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 0, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 0, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 0, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 31: { # 'А'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 1, # 'А'
- 32: 1, # 'Б'
- 35: 2, # 'В'
- 43: 1, # 'Г'
- 37: 2, # 'Д'
- 44: 2, # 'Е'
- 55: 1, # 'Ж'
- 47: 2, # 'З'
- 40: 1, # 'И'
- 59: 1, # 'Й'
- 33: 1, # 'К'
- 46: 2, # 'Л'
- 38: 1, # 'М'
- 36: 2, # 'Н'
- 41: 1, # 'О'
- 30: 2, # 'П'
- 39: 2, # 'Р'
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 1, # 'У'
- 48: 2, # 'Ф'
- 49: 1, # 'Х'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 2, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 1, # 'а'
- 18: 2, # 'б'
- 9: 2, # 'в'
- 20: 2, # 'г'
- 11: 2, # 'д'
- 3: 1, # 'е'
- 23: 1, # 'ж'
- 15: 2, # 'з'
- 2: 0, # 'и'
- 26: 2, # 'й'
- 12: 2, # 'к'
- 10: 3, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 0, # 'о'
- 13: 2, # 'п'
- 7: 2, # 'р'
- 8: 2, # 'с'
- 5: 2, # 'т'
- 19: 1, # 'у'
- 29: 2, # 'ф'
- 25: 1, # 'х'
- 22: 1, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 32: { # 'Б'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 2, # 'Б'
- 35: 1, # 'В'
- 43: 1, # 'Г'
- 37: 2, # 'Д'
- 44: 1, # 'Е'
- 55: 1, # 'Ж'
- 47: 2, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 2, # 'Н'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Р'
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 1, # 'У'
- 48: 2, # 'Ф'
- 49: 1, # 'Х'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 0, # 'Ш'
- 57: 1, # 'Щ'
- 61: 2, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 2, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'р'
- 8: 1, # 'с'
- 5: 0, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 3, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 2, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 35: { # 'В'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 2, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 1, # 'О'
- 30: 1, # 'П'
- 39: 2, # 'Р'
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 2, # 'Ф'
- 49: 0, # 'Х'
- 53: 1, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 2, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 2, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 2, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 2, # 'р'
- 8: 2, # 'с'
- 5: 2, # 'т'
- 19: 1, # 'у'
- 29: 0, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 2, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 43: { # 'Г'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 2, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Н'
- 41: 1, # 'О'
- 30: 0, # 'П'
- 39: 1, # 'Р'
- 28: 1, # 'С'
- 34: 0, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 1, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 1, # 'б'
- 9: 1, # 'в'
- 20: 0, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 2, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 1, # 'щ'
- 17: 2, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 37: { # 'Д'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 2, # 'В'
- 43: 1, # 'Г'
- 37: 2, # 'Д'
- 44: 2, # 'Е'
- 55: 2, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 2, # 'О'
- 30: 2, # 'П'
- 39: 1, # 'Р'
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Х'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 2, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 2, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 1, # 'ь'
- 42: 2, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 44: { # 'Е'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'А'
- 32: 1, # 'Б'
- 35: 2, # 'В'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 1, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 1, # 'Й'
- 33: 2, # 'К'
- 46: 2, # 'Л'
- 38: 1, # 'М'
- 36: 2, # 'Н'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 2, # 'Р'
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 1, # 'У'
- 48: 2, # 'Ф'
- 49: 1, # 'Х'
- 53: 2, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 1, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 0, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 2, # 'д'
- 3: 0, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 0, # 'и'
- 26: 1, # 'й'
- 12: 2, # 'к'
- 10: 2, # 'л'
- 14: 2, # 'м'
- 6: 2, # 'н'
- 4: 0, # 'о'
- 13: 1, # 'п'
- 7: 2, # 'р'
- 8: 2, # 'с'
- 5: 1, # 'т'
- 19: 1, # 'у'
- 29: 1, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 55: { # 'Ж'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'А'
- 32: 0, # 'Б'
- 35: 1, # 'В'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Н'
- 41: 1, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 1, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 1, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 47: { # 'З'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 2, # 'Н'
- 41: 1, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Р'
- 28: 1, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 1, # 'Х'
- 53: 1, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 2, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 1, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 1, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 1, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 40: { # 'И'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 1, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 2, # 'Е'
- 55: 1, # 'Ж'
- 47: 2, # 'З'
- 40: 1, # 'И'
- 59: 1, # 'Й'
- 33: 2, # 'К'
- 46: 2, # 'Л'
- 38: 2, # 'М'
- 36: 2, # 'Н'
- 41: 1, # 'О'
- 30: 1, # 'П'
- 39: 2, # 'Р'
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 0, # 'У'
- 48: 1, # 'Ф'
- 49: 1, # 'Х'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 1, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 2, # 'Я'
- 1: 1, # 'а'
- 18: 1, # 'б'
- 9: 3, # 'в'
- 20: 2, # 'г'
- 11: 1, # 'д'
- 3: 1, # 'е'
- 23: 0, # 'ж'
- 15: 3, # 'з'
- 2: 0, # 'и'
- 26: 1, # 'й'
- 12: 1, # 'к'
- 10: 2, # 'л'
- 14: 2, # 'м'
- 6: 2, # 'н'
- 4: 0, # 'о'
- 13: 1, # 'п'
- 7: 2, # 'р'
- 8: 2, # 'с'
- 5: 2, # 'т'
- 19: 0, # 'у'
- 29: 1, # 'ф'
- 25: 1, # 'х'
- 22: 1, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 59: { # 'Й'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 1, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 1, # 'С'
- 34: 1, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 1, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 0, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 1, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 0, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 2, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 0, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 33: { # 'К'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 0, # 'М'
- 36: 2, # 'Н'
- 41: 2, # 'О'
- 30: 2, # 'П'
- 39: 1, # 'Р'
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 1, # 'Х'
- 53: 1, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 1, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 1, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 2, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 3, # 'р'
- 8: 1, # 'с'
- 5: 0, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 1, # 'ь'
- 42: 2, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 46: { # 'Л'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 2, # 'Г'
- 37: 1, # 'Д'
- 44: 2, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Н'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 0, # 'Р'
- 28: 1, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 1, # 'Х'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 1, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 1, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 2, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 1, # 'ь'
- 42: 2, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 38: { # 'М'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 2, # 'В'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Р'
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Х'
- 53: 1, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 2, # 'л'
- 14: 0, # 'м'
- 6: 2, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 1, # 'ь'
- 42: 2, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 36: { # 'Н'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 2, # 'Б'
- 35: 1, # 'В'
- 43: 1, # 'Г'
- 37: 2, # 'Д'
- 44: 2, # 'Е'
- 55: 1, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 1, # 'Й'
- 33: 2, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Р'
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 1, # 'Х'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 1, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'р'
- 8: 0, # 'с'
- 5: 1, # 'т'
- 19: 1, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 2, # 'ю'
- 16: 2, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 41: { # 'О'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'А'
- 32: 1, # 'Б'
- 35: 2, # 'В'
- 43: 1, # 'Г'
- 37: 2, # 'Д'
- 44: 1, # 'Е'
- 55: 1, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 1, # 'Й'
- 33: 2, # 'К'
- 46: 2, # 'Л'
- 38: 2, # 'М'
- 36: 2, # 'Н'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 2, # 'Р'
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 1, # 'Х'
- 53: 0, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 1, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 1, # 'а'
- 18: 2, # 'б'
- 9: 2, # 'в'
- 20: 2, # 'г'
- 11: 1, # 'д'
- 3: 1, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 0, # 'и'
- 26: 1, # 'й'
- 12: 2, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 0, # 'о'
- 13: 2, # 'п'
- 7: 2, # 'р'
- 8: 2, # 'с'
- 5: 3, # 'т'
- 19: 1, # 'у'
- 29: 1, # 'ф'
- 25: 1, # 'х'
- 22: 1, # 'ц'
- 21: 2, # 'ч'
- 27: 0, # 'ш'
- 24: 2, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 30: { # 'П'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 2, # 'О'
- 30: 2, # 'П'
- 39: 2, # 'Р'
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 2, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Х'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 3, # 'л'
- 14: 0, # 'м'
- 6: 1, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 3, # 'р'
- 8: 1, # 'с'
- 5: 1, # 'т'
- 19: 2, # 'у'
- 29: 1, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 39: { # 'Р'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 2, # 'Г'
- 37: 2, # 'Д'
- 44: 2, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 0, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 2, # 'О'
- 30: 2, # 'П'
- 39: 1, # 'Р'
- 28: 1, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 1, # 'Х'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 1, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'р'
- 8: 1, # 'с'
- 5: 0, # 'т'
- 19: 3, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 28: { # 'С'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 3, # 'А'
- 32: 2, # 'Б'
- 35: 2, # 'В'
- 43: 1, # 'Г'
- 37: 2, # 'Д'
- 44: 2, # 'Е'
- 55: 1, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 2, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 2, # 'О'
- 30: 2, # 'П'
- 39: 1, # 'Р'
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 2, # 'к'
- 10: 3, # 'л'
- 14: 2, # 'м'
- 6: 1, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 2, # 'р'
- 8: 0, # 'с'
- 5: 3, # 'т'
- 19: 2, # 'у'
- 29: 2, # 'ф'
- 25: 1, # 'х'
- 22: 1, # 'ц'
- 21: 1, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 3, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 34: { # 'Т'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 2, # 'Б'
- 35: 1, # 'В'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 2, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 2, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 2, # 'Р'
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Х'
- 53: 1, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 1, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 1, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 3, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 2, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 51: { # 'У'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 1, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 2, # 'Е'
- 55: 1, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 0, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Р'
- 28: 1, # 'С'
- 34: 2, # 'Т'
- 51: 0, # 'У'
- 48: 1, # 'Ф'
- 49: 1, # 'Х'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 1, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 2, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 2, # 'и'
- 26: 1, # 'й'
- 12: 2, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 2, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'р'
- 8: 2, # 'с'
- 5: 1, # 'т'
- 19: 1, # 'у'
- 29: 0, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 2, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 48: { # 'Ф'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Н'
- 41: 1, # 'О'
- 30: 2, # 'П'
- 39: 1, # 'Р'
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 2, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 2, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 1, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 49: { # 'Х'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'А'
- 32: 0, # 'Б'
- 35: 1, # 'В'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 1, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 1, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 1, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 0, # 'н'
- 4: 2, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 53: { # 'Ц'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'А'
- 32: 0, # 'Б'
- 35: 1, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 2, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 1, # 'Р'
- 28: 2, # 'С'
- 34: 0, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 2, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 1, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 1, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 50: { # 'Ч'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Н'
- 41: 1, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 1, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 2, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 1, # 'ь'
- 42: 0, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 54: { # 'Ш'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Н'
- 41: 1, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 2, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 1, # 'ь'
- 42: 0, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 57: { # 'Щ'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 1, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 1, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 1, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 1, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 61: { # 'Ъ'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 0, # 'Е'
- 55: 1, # 'Ж'
- 47: 1, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 2, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 0, # 'О'
- 30: 1, # 'П'
- 39: 2, # 'Р'
- 28: 1, # 'С'
- 34: 1, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 1, # 'Х'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 1, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 0, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 0, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 1, # 'л'
- 14: 0, # 'м'
- 6: 1, # 'н'
- 4: 0, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 0, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 60: { # 'Ю'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'А'
- 32: 1, # 'Б'
- 35: 0, # 'В'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 0, # 'Е'
- 55: 1, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 1, # 'Р'
- 28: 1, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 1, # 'б'
- 9: 1, # 'в'
- 20: 2, # 'г'
- 11: 1, # 'д'
- 3: 0, # 'е'
- 23: 2, # 'ж'
- 15: 1, # 'з'
- 2: 1, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 0, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'р'
- 8: 1, # 'с'
- 5: 1, # 'т'
- 19: 0, # 'у'
- 29: 0, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 56: { # 'Я'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 1, # 'С'
- 34: 2, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 1, # 'б'
- 9: 1, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 0, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 1, # 'и'
- 26: 1, # 'й'
- 12: 1, # 'к'
- 10: 1, # 'л'
- 14: 2, # 'м'
- 6: 2, # 'н'
- 4: 0, # 'о'
- 13: 2, # 'п'
- 7: 1, # 'р'
- 8: 1, # 'с'
- 5: 1, # 'т'
- 19: 0, # 'у'
- 29: 0, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 1: { # 'а'
- 63: 1, # 'e'
- 45: 1, # '\xad'
- 31: 1, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 1, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 3, # 'з'
- 2: 3, # 'и'
- 26: 3, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 2, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 3, # 'у'
- 29: 3, # 'ф'
- 25: 3, # 'х'
- 22: 3, # 'ц'
- 21: 3, # 'ч'
- 27: 3, # 'ш'
- 24: 3, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 18: { # 'б'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 3, # 'в'
- 20: 1, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 3, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 1, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 0, # 'т'
- 19: 3, # 'у'
- 29: 0, # 'ф'
- 25: 2, # 'х'
- 22: 1, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 3, # 'щ'
- 17: 3, # 'ъ'
- 52: 1, # 'ь'
- 42: 2, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 9: { # 'в'
- 63: 1, # 'e'
- 45: 1, # '\xad'
- 31: 0, # 'А'
- 32: 1, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 0, # 'в'
- 20: 2, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 3, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 2, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 2, # 'х'
- 22: 2, # 'ц'
- 21: 3, # 'ч'
- 27: 2, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ъ'
- 52: 1, # 'ь'
- 42: 2, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 20: { # 'г'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 3, # 'л'
- 14: 1, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 1, # 'п'
- 7: 3, # 'р'
- 8: 2, # 'с'
- 5: 2, # 'т'
- 19: 3, # 'у'
- 29: 1, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 3, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 11: { # 'д'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 2, # 'б'
- 9: 3, # 'в'
- 20: 2, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 2, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 1, # 'т'
- 19: 3, # 'у'
- 29: 1, # 'ф'
- 25: 2, # 'х'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 3: { # 'е'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 2, # 'е'
- 23: 3, # 'ж'
- 15: 3, # 'з'
- 2: 2, # 'и'
- 26: 3, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 2, # 'у'
- 29: 3, # 'ф'
- 25: 3, # 'х'
- 22: 3, # 'ц'
- 21: 3, # 'ч'
- 27: 3, # 'ш'
- 24: 3, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 23: { # 'ж'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 2, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 3, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'р'
- 8: 1, # 'с'
- 5: 1, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 1, # 'ц'
- 21: 1, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 15: { # 'з'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 3, # 'у'
- 29: 1, # 'ф'
- 25: 2, # 'х'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 2, # 'ш'
- 24: 1, # 'щ'
- 17: 2, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 2, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 2: { # 'и'
- 63: 1, # 'e'
- 45: 1, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 1, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 1, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 3, # 'з'
- 2: 3, # 'и'
- 26: 3, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 2, # 'у'
- 29: 3, # 'ф'
- 25: 3, # 'х'
- 22: 3, # 'ц'
- 21: 3, # 'ч'
- 27: 3, # 'ш'
- 24: 3, # 'щ'
- 17: 2, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 26: { # 'й'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 1, # 'а'
- 18: 2, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 2, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 2, # 'з'
- 2: 1, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 2, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 2, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 1, # 'у'
- 29: 2, # 'ф'
- 25: 1, # 'х'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 12: { # 'к'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 1, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 3, # 'в'
- 20: 2, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 2, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 3, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 1, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 3, # 'у'
- 29: 1, # 'ф'
- 25: 1, # 'х'
- 22: 3, # 'ц'
- 21: 2, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 3, # 'ъ'
- 52: 1, # 'ь'
- 42: 2, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 10: { # 'л'
- 63: 1, # 'e'
- 45: 1, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 1, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 2, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 1, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 2, # 'п'
- 7: 2, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 3, # 'у'
- 29: 2, # 'ф'
- 25: 2, # 'х'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 2, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ъ'
- 52: 2, # 'ь'
- 42: 3, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 14: { # 'м'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 2, # 'к'
- 10: 3, # 'л'
- 14: 1, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 2, # 'р'
- 8: 2, # 'с'
- 5: 1, # 'т'
- 19: 3, # 'у'
- 29: 2, # 'ф'
- 25: 1, # 'х'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 2, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ъ'
- 52: 1, # 'ь'
- 42: 2, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 6: { # 'н'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 1, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 2, # 'б'
- 9: 2, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 2, # 'ж'
- 15: 2, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 1, # 'п'
- 7: 2, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 3, # 'у'
- 29: 3, # 'ф'
- 25: 2, # 'х'
- 22: 3, # 'ц'
- 21: 3, # 'ч'
- 27: 2, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ъ'
- 52: 2, # 'ь'
- 42: 2, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 4: { # 'о'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 3, # 'з'
- 2: 3, # 'и'
- 26: 3, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 2, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 2, # 'у'
- 29: 3, # 'ф'
- 25: 3, # 'х'
- 22: 3, # 'ц'
- 21: 3, # 'ч'
- 27: 3, # 'ш'
- 24: 3, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 13: { # 'п'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 1, # 'й'
- 12: 2, # 'к'
- 10: 3, # 'л'
- 14: 1, # 'м'
- 6: 2, # 'н'
- 4: 3, # 'о'
- 13: 1, # 'п'
- 7: 3, # 'р'
- 8: 2, # 'с'
- 5: 2, # 'т'
- 19: 3, # 'у'
- 29: 1, # 'ф'
- 25: 1, # 'х'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ъ'
- 52: 1, # 'ь'
- 42: 2, # 'ю'
- 16: 2, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 7: { # 'р'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 2, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 2, # 'п'
- 7: 1, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 3, # 'у'
- 29: 2, # 'ф'
- 25: 3, # 'х'
- 22: 3, # 'ц'
- 21: 2, # 'ч'
- 27: 3, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ъ'
- 52: 1, # 'ь'
- 42: 2, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 8: { # 'с'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 2, # 'б'
- 9: 3, # 'в'
- 20: 2, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'р'
- 8: 1, # 'с'
- 5: 3, # 'т'
- 19: 3, # 'у'
- 29: 2, # 'ф'
- 25: 2, # 'х'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 2, # 'ш'
- 24: 0, # 'щ'
- 17: 3, # 'ъ'
- 52: 2, # 'ь'
- 42: 2, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 5: { # 'т'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 2, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 2, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 3, # 'у'
- 29: 1, # 'ф'
- 25: 2, # 'х'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ъ'
- 52: 2, # 'ь'
- 42: 2, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 19: { # 'у'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 2, # 'е'
- 23: 3, # 'ж'
- 15: 3, # 'з'
- 2: 2, # 'и'
- 26: 2, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 2, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 1, # 'у'
- 29: 2, # 'ф'
- 25: 2, # 'х'
- 22: 2, # 'ц'
- 21: 3, # 'ч'
- 27: 3, # 'ш'
- 24: 2, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 29: { # 'ф'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 1, # 'в'
- 20: 1, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 2, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'р'
- 8: 2, # 'с'
- 5: 2, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 2, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 25: { # 'х'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 3, # 'в'
- 20: 0, # 'г'
- 11: 1, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 2, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 1, # 'п'
- 7: 3, # 'р'
- 8: 1, # 'с'
- 5: 2, # 'т'
- 19: 3, # 'у'
- 29: 0, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 22: { # 'ц'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 2, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'р'
- 8: 1, # 'с'
- 5: 1, # 'т'
- 19: 2, # 'у'
- 29: 1, # 'ф'
- 25: 1, # 'х'
- 22: 1, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 2, # 'ъ'
- 52: 1, # 'ь'
- 42: 0, # 'ю'
- 16: 2, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 21: { # 'ч'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 3, # 'в'
- 20: 1, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 2, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'р'
- 8: 0, # 'с'
- 5: 2, # 'т'
- 19: 3, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 27: { # 'ш'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 2, # 'в'
- 20: 0, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 3, # 'н'
- 4: 2, # 'о'
- 13: 2, # 'п'
- 7: 1, # 'р'
- 8: 0, # 'с'
- 5: 1, # 'т'
- 19: 2, # 'у'
- 29: 1, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 24: { # 'щ'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 1, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 2, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'р'
- 8: 0, # 'с'
- 5: 2, # 'т'
- 19: 3, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 1, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 2, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 17: { # 'ъ'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 1, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 2, # 'е'
- 23: 3, # 'ж'
- 15: 3, # 'з'
- 2: 1, # 'и'
- 26: 2, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 1, # 'у'
- 29: 1, # 'ф'
- 25: 2, # 'х'
- 22: 2, # 'ц'
- 21: 3, # 'ч'
- 27: 2, # 'ш'
- 24: 3, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 2, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 52: { # 'ь'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 1, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 0, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 1, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'р'
- 8: 0, # 'с'
- 5: 1, # 'т'
- 19: 0, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 1, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 42: { # 'ю'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 1, # 'а'
- 18: 2, # 'б'
- 9: 1, # 'в'
- 20: 2, # 'г'
- 11: 2, # 'д'
- 3: 1, # 'е'
- 23: 2, # 'ж'
- 15: 2, # 'з'
- 2: 1, # 'и'
- 26: 1, # 'й'
- 12: 2, # 'к'
- 10: 2, # 'л'
- 14: 2, # 'м'
- 6: 2, # 'н'
- 4: 1, # 'о'
- 13: 1, # 'п'
- 7: 2, # 'р'
- 8: 2, # 'с'
- 5: 2, # 'т'
- 19: 1, # 'у'
- 29: 1, # 'ф'
- 25: 1, # 'х'
- 22: 2, # 'ц'
- 21: 3, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 16: { # 'я'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 2, # 'г'
- 11: 3, # 'д'
- 3: 2, # 'е'
- 23: 1, # 'ж'
- 15: 2, # 'з'
- 2: 1, # 'и'
- 26: 2, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 1, # 'о'
- 13: 2, # 'п'
- 7: 2, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 1, # 'у'
- 29: 1, # 'ф'
- 25: 3, # 'х'
- 22: 2, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 2, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 58: { # 'є'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 0, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 0, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 0, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 0, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 62: { # '№'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 0, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 0, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 0, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 0, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-ISO_8859_5_BULGARIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 77, # 'A'
- 66: 90, # 'B'
- 67: 99, # 'C'
- 68: 100, # 'D'
- 69: 72, # 'E'
- 70: 109, # 'F'
- 71: 107, # 'G'
- 72: 101, # 'H'
- 73: 79, # 'I'
- 74: 185, # 'J'
- 75: 81, # 'K'
- 76: 102, # 'L'
- 77: 76, # 'M'
- 78: 94, # 'N'
- 79: 82, # 'O'
- 80: 110, # 'P'
- 81: 186, # 'Q'
- 82: 108, # 'R'
- 83: 91, # 'S'
- 84: 74, # 'T'
- 85: 119, # 'U'
- 86: 84, # 'V'
- 87: 96, # 'W'
- 88: 111, # 'X'
- 89: 187, # 'Y'
- 90: 115, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 65, # 'a'
- 98: 69, # 'b'
- 99: 70, # 'c'
- 100: 66, # 'd'
- 101: 63, # 'e'
- 102: 68, # 'f'
- 103: 112, # 'g'
- 104: 103, # 'h'
- 105: 92, # 'i'
- 106: 194, # 'j'
- 107: 104, # 'k'
- 108: 95, # 'l'
- 109: 86, # 'm'
- 110: 87, # 'n'
- 111: 71, # 'o'
- 112: 116, # 'p'
- 113: 195, # 'q'
- 114: 85, # 'r'
- 115: 93, # 's'
- 116: 97, # 't'
- 117: 113, # 'u'
- 118: 196, # 'v'
- 119: 197, # 'w'
- 120: 198, # 'x'
- 121: 199, # 'y'
- 122: 200, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 194, # '\x80'
- 129: 195, # '\x81'
- 130: 196, # '\x82'
- 131: 197, # '\x83'
- 132: 198, # '\x84'
- 133: 199, # '\x85'
- 134: 200, # '\x86'
- 135: 201, # '\x87'
- 136: 202, # '\x88'
- 137: 203, # '\x89'
- 138: 204, # '\x8a'
- 139: 205, # '\x8b'
- 140: 206, # '\x8c'
- 141: 207, # '\x8d'
- 142: 208, # '\x8e'
- 143: 209, # '\x8f'
- 144: 210, # '\x90'
- 145: 211, # '\x91'
- 146: 212, # '\x92'
- 147: 213, # '\x93'
- 148: 214, # '\x94'
- 149: 215, # '\x95'
- 150: 216, # '\x96'
- 151: 217, # '\x97'
- 152: 218, # '\x98'
- 153: 219, # '\x99'
- 154: 220, # '\x9a'
- 155: 221, # '\x9b'
- 156: 222, # '\x9c'
- 157: 223, # '\x9d'
- 158: 224, # '\x9e'
- 159: 225, # '\x9f'
- 160: 81, # '\xa0'
- 161: 226, # 'Ё'
- 162: 227, # 'Ђ'
- 163: 228, # 'Ѓ'
- 164: 229, # 'Є'
- 165: 230, # 'Ѕ'
- 166: 105, # 'І'
- 167: 231, # 'Ї'
- 168: 232, # 'Ј'
- 169: 233, # 'Љ'
- 170: 234, # 'Њ'
- 171: 235, # 'Ћ'
- 172: 236, # 'Ќ'
- 173: 45, # '\xad'
- 174: 237, # 'Ў'
- 175: 238, # 'Џ'
- 176: 31, # 'А'
- 177: 32, # 'Б'
- 178: 35, # 'В'
- 179: 43, # 'Г'
- 180: 37, # 'Д'
- 181: 44, # 'Е'
- 182: 55, # 'Ж'
- 183: 47, # 'З'
- 184: 40, # 'И'
- 185: 59, # 'Й'
- 186: 33, # 'К'
- 187: 46, # 'Л'
- 188: 38, # 'М'
- 189: 36, # 'Н'
- 190: 41, # 'О'
- 191: 30, # 'П'
- 192: 39, # 'Р'
- 193: 28, # 'С'
- 194: 34, # 'Т'
- 195: 51, # 'У'
- 196: 48, # 'Ф'
- 197: 49, # 'Х'
- 198: 53, # 'Ц'
- 199: 50, # 'Ч'
- 200: 54, # 'Ш'
- 201: 57, # 'Щ'
- 202: 61, # 'Ъ'
- 203: 239, # 'Ы'
- 204: 67, # 'Ь'
- 205: 240, # 'Э'
- 206: 60, # 'Ю'
- 207: 56, # 'Я'
- 208: 1, # 'а'
- 209: 18, # 'б'
- 210: 9, # 'в'
- 211: 20, # 'г'
- 212: 11, # 'д'
- 213: 3, # 'е'
- 214: 23, # 'ж'
- 215: 15, # 'з'
- 216: 2, # 'и'
- 217: 26, # 'й'
- 218: 12, # 'к'
- 219: 10, # 'л'
- 220: 14, # 'м'
- 221: 6, # 'н'
- 222: 4, # 'о'
- 223: 13, # 'п'
- 224: 7, # 'р'
- 225: 8, # 'с'
- 226: 5, # 'т'
- 227: 19, # 'у'
- 228: 29, # 'ф'
- 229: 25, # 'х'
- 230: 22, # 'ц'
- 231: 21, # 'ч'
- 232: 27, # 'ш'
- 233: 24, # 'щ'
- 234: 17, # 'ъ'
- 235: 75, # 'ы'
- 236: 52, # 'ь'
- 237: 241, # 'э'
- 238: 42, # 'ю'
- 239: 16, # 'я'
- 240: 62, # '№'
- 241: 242, # 'ё'
- 242: 243, # 'ђ'
- 243: 244, # 'ѓ'
- 244: 58, # 'є'
- 245: 245, # 'ѕ'
- 246: 98, # 'і'
- 247: 246, # 'ї'
- 248: 247, # 'ј'
- 249: 248, # 'љ'
- 250: 249, # 'њ'
- 251: 250, # 'ћ'
- 252: 251, # 'ќ'
- 253: 91, # '§'
- 254: 252, # 'ў'
- 255: 253, # 'џ'
-}
-
-ISO_8859_5_BULGARIAN_MODEL = SingleByteCharSetModel(
- charset_name="ISO-8859-5",
- language="Bulgarian",
- char_to_order_map=ISO_8859_5_BULGARIAN_CHAR_TO_ORDER,
- language_model=BULGARIAN_LANG_MODEL,
- typical_positive_ratio=0.969392,
- keep_ascii_letters=False,
- alphabet="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцчшщъьюя",
-)
-
-WINDOWS_1251_BULGARIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 77, # 'A'
- 66: 90, # 'B'
- 67: 99, # 'C'
- 68: 100, # 'D'
- 69: 72, # 'E'
- 70: 109, # 'F'
- 71: 107, # 'G'
- 72: 101, # 'H'
- 73: 79, # 'I'
- 74: 185, # 'J'
- 75: 81, # 'K'
- 76: 102, # 'L'
- 77: 76, # 'M'
- 78: 94, # 'N'
- 79: 82, # 'O'
- 80: 110, # 'P'
- 81: 186, # 'Q'
- 82: 108, # 'R'
- 83: 91, # 'S'
- 84: 74, # 'T'
- 85: 119, # 'U'
- 86: 84, # 'V'
- 87: 96, # 'W'
- 88: 111, # 'X'
- 89: 187, # 'Y'
- 90: 115, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 65, # 'a'
- 98: 69, # 'b'
- 99: 70, # 'c'
- 100: 66, # 'd'
- 101: 63, # 'e'
- 102: 68, # 'f'
- 103: 112, # 'g'
- 104: 103, # 'h'
- 105: 92, # 'i'
- 106: 194, # 'j'
- 107: 104, # 'k'
- 108: 95, # 'l'
- 109: 86, # 'm'
- 110: 87, # 'n'
- 111: 71, # 'o'
- 112: 116, # 'p'
- 113: 195, # 'q'
- 114: 85, # 'r'
- 115: 93, # 's'
- 116: 97, # 't'
- 117: 113, # 'u'
- 118: 196, # 'v'
- 119: 197, # 'w'
- 120: 198, # 'x'
- 121: 199, # 'y'
- 122: 200, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 206, # 'Ђ'
- 129: 207, # 'Ѓ'
- 130: 208, # '‚'
- 131: 209, # 'ѓ'
- 132: 210, # '„'
- 133: 211, # '…'
- 134: 212, # '†'
- 135: 213, # '‡'
- 136: 120, # '€'
- 137: 214, # '‰'
- 138: 215, # 'Љ'
- 139: 216, # '‹'
- 140: 217, # 'Њ'
- 141: 218, # 'Ќ'
- 142: 219, # 'Ћ'
- 143: 220, # 'Џ'
- 144: 221, # 'ђ'
- 145: 78, # '‘'
- 146: 64, # '’'
- 147: 83, # '“'
- 148: 121, # '”'
- 149: 98, # '•'
- 150: 117, # '–'
- 151: 105, # '—'
- 152: 222, # None
- 153: 223, # '™'
- 154: 224, # 'љ'
- 155: 225, # '›'
- 156: 226, # 'њ'
- 157: 227, # 'ќ'
- 158: 228, # 'ћ'
- 159: 229, # 'џ'
- 160: 88, # '\xa0'
- 161: 230, # 'Ў'
- 162: 231, # 'ў'
- 163: 232, # 'Ј'
- 164: 233, # '¤'
- 165: 122, # 'Ґ'
- 166: 89, # '¦'
- 167: 106, # '§'
- 168: 234, # 'Ё'
- 169: 235, # '©'
- 170: 236, # 'Є'
- 171: 237, # '«'
- 172: 238, # '¬'
- 173: 45, # '\xad'
- 174: 239, # '®'
- 175: 240, # 'Ї'
- 176: 73, # '°'
- 177: 80, # '±'
- 178: 118, # 'І'
- 179: 114, # 'і'
- 180: 241, # 'ґ'
- 181: 242, # 'µ'
- 182: 243, # '¶'
- 183: 244, # '·'
- 184: 245, # 'ё'
- 185: 62, # '№'
- 186: 58, # 'є'
- 187: 246, # '»'
- 188: 247, # 'ј'
- 189: 248, # 'Ѕ'
- 190: 249, # 'ѕ'
- 191: 250, # 'ї'
- 192: 31, # 'А'
- 193: 32, # 'Б'
- 194: 35, # 'В'
- 195: 43, # 'Г'
- 196: 37, # 'Д'
- 197: 44, # 'Е'
- 198: 55, # 'Ж'
- 199: 47, # 'З'
- 200: 40, # 'И'
- 201: 59, # 'Й'
- 202: 33, # 'К'
- 203: 46, # 'Л'
- 204: 38, # 'М'
- 205: 36, # 'Н'
- 206: 41, # 'О'
- 207: 30, # 'П'
- 208: 39, # 'Р'
- 209: 28, # 'С'
- 210: 34, # 'Т'
- 211: 51, # 'У'
- 212: 48, # 'Ф'
- 213: 49, # 'Х'
- 214: 53, # 'Ц'
- 215: 50, # 'Ч'
- 216: 54, # 'Ш'
- 217: 57, # 'Щ'
- 218: 61, # 'Ъ'
- 219: 251, # 'Ы'
- 220: 67, # 'Ь'
- 221: 252, # 'Э'
- 222: 60, # 'Ю'
- 223: 56, # 'Я'
- 224: 1, # 'а'
- 225: 18, # 'б'
- 226: 9, # 'в'
- 227: 20, # 'г'
- 228: 11, # 'д'
- 229: 3, # 'е'
- 230: 23, # 'ж'
- 231: 15, # 'з'
- 232: 2, # 'и'
- 233: 26, # 'й'
- 234: 12, # 'к'
- 235: 10, # 'л'
- 236: 14, # 'м'
- 237: 6, # 'н'
- 238: 4, # 'о'
- 239: 13, # 'п'
- 240: 7, # 'р'
- 241: 8, # 'с'
- 242: 5, # 'т'
- 243: 19, # 'у'
- 244: 29, # 'ф'
- 245: 25, # 'х'
- 246: 22, # 'ц'
- 247: 21, # 'ч'
- 248: 27, # 'ш'
- 249: 24, # 'щ'
- 250: 17, # 'ъ'
- 251: 75, # 'ы'
- 252: 52, # 'ь'
- 253: 253, # 'э'
- 254: 42, # 'ю'
- 255: 16, # 'я'
-}
-
-WINDOWS_1251_BULGARIAN_MODEL = SingleByteCharSetModel(
- charset_name="windows-1251",
- language="Bulgarian",
- char_to_order_map=WINDOWS_1251_BULGARIAN_CHAR_TO_ORDER,
- language_model=BULGARIAN_LANG_MODEL,
- typical_positive_ratio=0.969392,
- keep_ascii_letters=False,
- alphabet="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцчшщъьюя",
-)
diff --git a/contrib/python/pip/pip/_vendor/chardet/langgreekmodel.py b/contrib/python/pip/pip/_vendor/chardet/langgreekmodel.py
deleted file mode 100644
index cfb8639e56..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/langgreekmodel.py
+++ /dev/null
@@ -1,4397 +0,0 @@
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-GREEK_LANG_MODEL = {
- 60: { # 'e'
- 60: 2, # 'e'
- 55: 1, # 'o'
- 58: 2, # 't'
- 36: 1, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 1, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 55: { # 'o'
- 60: 0, # 'e'
- 55: 2, # 'o'
- 58: 2, # 't'
- 36: 1, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 1, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 1, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 58: { # 't'
- 60: 2, # 'e'
- 55: 1, # 'o'
- 58: 1, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 1, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 36: { # '·'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 61: { # 'Ά'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 1, # 'γ'
- 21: 2, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 1, # 'π'
- 8: 2, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 46: { # 'Έ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 2, # 'β'
- 20: 2, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 2, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 0, # 'ο'
- 9: 2, # 'π'
- 8: 2, # 'ρ'
- 14: 0, # 'ς'
- 7: 1, # 'σ'
- 2: 2, # 'τ'
- 12: 0, # 'υ'
- 28: 2, # 'φ'
- 23: 3, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 54: { # 'Ό'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 2, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 2, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 2, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 31: { # 'Α'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 2, # 'Β'
- 43: 2, # 'Γ'
- 41: 1, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 2, # 'Θ'
- 47: 2, # 'Ι'
- 44: 2, # 'Κ'
- 53: 2, # 'Λ'
- 38: 2, # 'Μ'
- 49: 2, # 'Ν'
- 59: 1, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 2, # 'Π'
- 48: 2, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 2, # 'Υ'
- 56: 2, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 2, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 1, # 'θ'
- 5: 0, # 'ι'
- 11: 2, # 'κ'
- 16: 3, # 'λ'
- 10: 2, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 0, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 2, # 'ς'
- 7: 2, # 'σ'
- 2: 0, # 'τ'
- 12: 3, # 'υ'
- 28: 2, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 2, # 'ύ'
- 27: 0, # 'ώ'
- },
- 51: { # 'Β'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 1, # 'Ε'
- 40: 1, # 'Η'
- 52: 0, # 'Θ'
- 47: 1, # 'Ι'
- 44: 0, # 'Κ'
- 53: 1, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'έ'
- 22: 2, # 'ή'
- 15: 0, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'π'
- 8: 2, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 43: { # 'Γ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 1, # 'Α'
- 51: 0, # 'Β'
- 43: 2, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 1, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 1, # 'Κ'
- 53: 1, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 1, # 'Ο'
- 35: 0, # 'Π'
- 48: 2, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 2, # 'Υ'
- 56: 0, # 'Φ'
- 50: 1, # 'Χ'
- 57: 2, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'π'
- 8: 2, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 41: { # 'Δ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 2, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 2, # 'ή'
- 15: 2, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'π'
- 8: 2, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 2, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 1, # 'ό'
- 26: 2, # 'ύ'
- 27: 2, # 'ώ'
- },
- 34: { # 'Ε'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Β'
- 43: 2, # 'Γ'
- 41: 2, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 2, # 'Κ'
- 53: 2, # 'Λ'
- 38: 2, # 'Μ'
- 49: 2, # 'Ν'
- 59: 1, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 2, # 'Π'
- 48: 2, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 2, # 'Υ'
- 56: 0, # 'Φ'
- 50: 2, # 'Χ'
- 57: 2, # 'Ω'
- 17: 3, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 3, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 3, # 'γ'
- 21: 2, # 'δ'
- 3: 1, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 1, # 'θ'
- 5: 2, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 2, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 0, # 'ο'
- 9: 3, # 'π'
- 8: 2, # 'ρ'
- 14: 0, # 'ς'
- 7: 2, # 'σ'
- 2: 2, # 'τ'
- 12: 2, # 'υ'
- 28: 2, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 1, # 'ύ'
- 27: 0, # 'ώ'
- },
- 40: { # 'Η'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 1, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 2, # 'Θ'
- 47: 0, # 'Ι'
- 44: 2, # 'Κ'
- 53: 0, # 'Λ'
- 38: 2, # 'Μ'
- 49: 2, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 2, # 'Π'
- 48: 2, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 1, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 1, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 1, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 52: { # 'Θ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 1, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 1, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 2, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 2, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 2, # 'ύ'
- 27: 0, # 'ώ'
- },
- 47: { # 'Ι'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 1, # 'Β'
- 43: 1, # 'Γ'
- 41: 2, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 2, # 'Κ'
- 53: 2, # 'Λ'
- 38: 2, # 'Μ'
- 49: 2, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 2, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 0, # 'Υ'
- 56: 2, # 'Φ'
- 50: 0, # 'Χ'
- 57: 2, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 2, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 1, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 2, # 'σ'
- 2: 1, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 1, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 44: { # 'Κ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 1, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 1, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 2, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 1, # 'Τ'
- 45: 2, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 1, # 'Ω'
- 17: 3, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'π'
- 8: 2, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 2, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 2, # 'ό'
- 26: 2, # 'ύ'
- 27: 2, # 'ώ'
- },
- 53: { # 'Λ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 2, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 0, # 'Τ'
- 45: 2, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 2, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'έ'
- 22: 0, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 1, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 2, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 2, # 'ό'
- 26: 2, # 'ύ'
- 27: 0, # 'ώ'
- },
- 38: { # 'Μ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 2, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 2, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 2, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'έ'
- 22: 2, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 3, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 2, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 2, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 49: { # 'Ν'
- 60: 2, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 2, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 2, # 'Ω'
- 17: 0, # 'ά'
- 18: 2, # 'έ'
- 22: 0, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 1, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 1, # 'ω'
- 19: 2, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 59: { # 'Ξ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 1, # 'Ε'
- 40: 1, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 1, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 2, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 39: { # 'Ο'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 1, # 'Β'
- 43: 2, # 'Γ'
- 41: 2, # 'Δ'
- 34: 2, # 'Ε'
- 40: 1, # 'Η'
- 52: 2, # 'Θ'
- 47: 2, # 'Ι'
- 44: 2, # 'Κ'
- 53: 2, # 'Λ'
- 38: 2, # 'Μ'
- 49: 2, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 2, # 'Π'
- 48: 2, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 2, # 'Υ'
- 56: 2, # 'Φ'
- 50: 2, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 2, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 2, # 'κ'
- 16: 2, # 'λ'
- 10: 2, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 2, # 'π'
- 8: 2, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 2, # 'τ'
- 12: 2, # 'υ'
- 28: 1, # 'φ'
- 23: 1, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 2, # 'ύ'
- 27: 0, # 'ώ'
- },
- 35: { # 'Π'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 2, # 'Λ'
- 38: 1, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 2, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 1, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 1, # 'Χ'
- 57: 2, # 'Ω'
- 17: 2, # 'ά'
- 18: 1, # 'έ'
- 22: 1, # 'ή'
- 15: 2, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 3, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 2, # 'υ'
- 28: 0, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 2, # 'ό'
- 26: 0, # 'ύ'
- 27: 3, # 'ώ'
- },
- 48: { # 'Ρ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Β'
- 43: 1, # 'Γ'
- 41: 1, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 2, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 2, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 1, # 'Τ'
- 45: 1, # 'Υ'
- 56: 0, # 'Φ'
- 50: 1, # 'Χ'
- 57: 1, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 2, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 1, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 3, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 2, # 'ύ'
- 27: 0, # 'ώ'
- },
- 37: { # 'Σ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 1, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 2, # 'Κ'
- 53: 0, # 'Λ'
- 38: 2, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 2, # 'Υ'
- 56: 0, # 'Φ'
- 50: 2, # 'Χ'
- 57: 2, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 2, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 2, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 2, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 2, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 0, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 2, # 'ύ'
- 27: 2, # 'ώ'
- },
- 33: { # 'Τ'
- 60: 0, # 'e'
- 55: 1, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 2, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 2, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 1, # 'Τ'
- 45: 1, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 2, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'έ'
- 22: 0, # 'ή'
- 15: 2, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 2, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 2, # 'ρ'
- 14: 0, # 'ς'
- 7: 2, # 'σ'
- 2: 0, # 'τ'
- 12: 2, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 2, # 'ό'
- 26: 2, # 'ύ'
- 27: 3, # 'ώ'
- },
- 45: { # 'Υ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 2, # 'Γ'
- 41: 0, # 'Δ'
- 34: 1, # 'Ε'
- 40: 2, # 'Η'
- 52: 2, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 1, # 'Λ'
- 38: 2, # 'Μ'
- 49: 2, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 2, # 'Π'
- 48: 1, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 1, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 3, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 56: { # 'Φ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 1, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 1, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 2, # 'τ'
- 12: 2, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 1, # 'ύ'
- 27: 1, # 'ώ'
- },
- 50: { # 'Χ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 1, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 1, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 1, # 'Ο'
- 35: 0, # 'Π'
- 48: 2, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 1, # 'Χ'
- 57: 1, # 'Ω'
- 17: 2, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'π'
- 8: 3, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 2, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 57: { # 'Ω'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 1, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 1, # 'Λ'
- 38: 0, # 'Μ'
- 49: 2, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 2, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'π'
- 8: 2, # 'ρ'
- 14: 2, # 'ς'
- 7: 2, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 1, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 17: { # 'ά'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 3, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 3, # 'ε'
- 32: 3, # 'ζ'
- 13: 0, # 'η'
- 25: 3, # 'θ'
- 5: 2, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 0, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 3, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 18: { # 'έ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 3, # 'α'
- 29: 2, # 'β'
- 20: 3, # 'γ'
- 21: 2, # 'δ'
- 3: 3, # 'ε'
- 32: 2, # 'ζ'
- 13: 0, # 'η'
- 25: 3, # 'θ'
- 5: 0, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 3, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 22: { # 'ή'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 1, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 3, # 'θ'
- 5: 0, # 'ι'
- 11: 3, # 'κ'
- 16: 2, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 0, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 2, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 15: { # 'ί'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 3, # 'α'
- 29: 2, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 3, # 'ε'
- 32: 3, # 'ζ'
- 13: 3, # 'η'
- 25: 3, # 'θ'
- 5: 0, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 1, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 3, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 1: { # 'α'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 2, # 'έ'
- 22: 0, # 'ή'
- 15: 3, # 'ί'
- 1: 0, # 'α'
- 29: 3, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 2, # 'ε'
- 32: 3, # 'ζ'
- 13: 1, # 'η'
- 25: 3, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 2, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 0, # 'ω'
- 19: 2, # 'ό'
- 26: 2, # 'ύ'
- 27: 0, # 'ώ'
- },
- 29: { # 'β'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 2, # 'έ'
- 22: 3, # 'ή'
- 15: 2, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 2, # 'γ'
- 21: 2, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 3, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 3, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 2, # 'ό'
- 26: 2, # 'ύ'
- 27: 2, # 'ώ'
- },
- 20: { # 'γ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 3, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 3, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 2, # 'υ'
- 28: 0, # 'φ'
- 23: 3, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 2, # 'ύ'
- 27: 3, # 'ώ'
- },
- 21: { # 'δ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 3, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 3, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'ύ'
- 27: 3, # 'ώ'
- },
- 3: { # 'ε'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 3, # 'ί'
- 1: 2, # 'α'
- 29: 3, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 2, # 'ε'
- 32: 2, # 'ζ'
- 13: 0, # 'η'
- 25: 3, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 2, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 3, # 'ω'
- 19: 2, # 'ό'
- 26: 3, # 'ύ'
- 27: 2, # 'ώ'
- },
- 32: { # 'ζ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'έ'
- 22: 2, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 1, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 2, # 'ό'
- 26: 0, # 'ύ'
- 27: 2, # 'ώ'
- },
- 13: { # 'η'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 3, # 'γ'
- 21: 2, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 3, # 'θ'
- 5: 0, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 0, # 'ο'
- 9: 2, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 2, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 25: { # 'θ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 2, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 1, # 'λ'
- 10: 3, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 3, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 3, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'ύ'
- 27: 3, # 'ώ'
- },
- 5: { # 'ι'
- 60: 0, # 'e'
- 55: 1, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 1, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 0, # 'ί'
- 1: 3, # 'α'
- 29: 3, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 3, # 'ε'
- 32: 2, # 'ζ'
- 13: 3, # 'η'
- 25: 3, # 'θ'
- 5: 0, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 2, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 0, # 'ύ'
- 27: 3, # 'ώ'
- },
- 11: { # 'κ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 3, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 2, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 2, # 'π'
- 8: 3, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 2, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'ύ'
- 27: 3, # 'ώ'
- },
- 16: { # 'λ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 1, # 'β'
- 20: 2, # 'γ'
- 21: 1, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 2, # 'θ'
- 5: 3, # 'ι'
- 11: 2, # 'κ'
- 16: 3, # 'λ'
- 10: 2, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 2, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'ύ'
- 27: 3, # 'ώ'
- },
- 10: { # 'μ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 1, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 3, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 2, # 'υ'
- 28: 3, # 'φ'
- 23: 0, # 'χ'
- 42: 2, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 2, # 'ύ'
- 27: 2, # 'ώ'
- },
- 6: { # 'ν'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 3, # 'δ'
- 3: 3, # 'ε'
- 32: 2, # 'ζ'
- 13: 3, # 'η'
- 25: 3, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 1, # 'λ'
- 10: 0, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'ύ'
- 27: 3, # 'ώ'
- },
- 30: { # 'ξ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 2, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 3, # 'τ'
- 12: 2, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 2, # 'ό'
- 26: 3, # 'ύ'
- 27: 1, # 'ώ'
- },
- 4: { # 'ο'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 2, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 2, # 'α'
- 29: 3, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 3, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 2, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 2, # 'ω'
- 19: 1, # 'ό'
- 26: 3, # 'ύ'
- 27: 2, # 'ώ'
- },
- 9: { # 'π'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 3, # 'λ'
- 10: 0, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 3, # 'ρ'
- 14: 2, # 'ς'
- 7: 0, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 0, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 2, # 'ύ'
- 27: 3, # 'ώ'
- },
- 8: { # 'ρ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 2, # 'β'
- 20: 3, # 'γ'
- 21: 2, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 3, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 1, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 3, # 'ο'
- 9: 2, # 'π'
- 8: 2, # 'ρ'
- 14: 0, # 'ς'
- 7: 2, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'ύ'
- 27: 3, # 'ώ'
- },
- 14: { # 'ς'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 7: { # 'σ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 3, # 'β'
- 20: 0, # 'γ'
- 21: 2, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 3, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 2, # 'λ'
- 10: 3, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'ύ'
- 27: 2, # 'ώ'
- },
- 2: { # 'τ'
- 60: 0, # 'e'
- 55: 2, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 2, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 2, # 'κ'
- 16: 2, # 'λ'
- 10: 3, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 3, # 'ρ'
- 14: 0, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 2, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'ύ'
- 27: 3, # 'ώ'
- },
- 12: { # 'υ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'έ'
- 22: 3, # 'ή'
- 15: 2, # 'ί'
- 1: 3, # 'α'
- 29: 2, # 'β'
- 20: 3, # 'γ'
- 21: 2, # 'δ'
- 3: 2, # 'ε'
- 32: 2, # 'ζ'
- 13: 2, # 'η'
- 25: 3, # 'θ'
- 5: 2, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 2, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 2, # 'ω'
- 19: 2, # 'ό'
- 26: 0, # 'ύ'
- 27: 2, # 'ώ'
- },
- 28: { # 'φ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 2, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 1, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 3, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 1, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 2, # 'ύ'
- 27: 2, # 'ώ'
- },
- 23: { # 'χ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 2, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 2, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 2, # 'μ'
- 6: 3, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 3, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 0, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'ύ'
- 27: 3, # 'ώ'
- },
- 42: { # 'ψ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'έ'
- 22: 1, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 2, # 'τ'
- 12: 1, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 24: { # 'ω'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 1, # 'ά'
- 18: 0, # 'έ'
- 22: 2, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 2, # 'β'
- 20: 3, # 'γ'
- 21: 2, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 3, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 2, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 19: { # 'ό'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 3, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 1, # 'ε'
- 32: 2, # 'ζ'
- 13: 2, # 'η'
- 25: 2, # 'θ'
- 5: 2, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 1, # 'ξ'
- 4: 2, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 2, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 26: { # 'ύ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 2, # 'α'
- 29: 2, # 'β'
- 20: 2, # 'γ'
- 21: 1, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 3, # 'θ'
- 5: 0, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 2, # 'φ'
- 23: 2, # 'χ'
- 42: 2, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 27: { # 'ώ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 1, # 'β'
- 20: 0, # 'γ'
- 21: 3, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 1, # 'η'
- 25: 2, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 1, # 'ξ'
- 4: 0, # 'ο'
- 9: 2, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 1, # 'φ'
- 23: 1, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-WINDOWS_1253_GREEK_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 82, # 'A'
- 66: 100, # 'B'
- 67: 104, # 'C'
- 68: 94, # 'D'
- 69: 98, # 'E'
- 70: 101, # 'F'
- 71: 116, # 'G'
- 72: 102, # 'H'
- 73: 111, # 'I'
- 74: 187, # 'J'
- 75: 117, # 'K'
- 76: 92, # 'L'
- 77: 88, # 'M'
- 78: 113, # 'N'
- 79: 85, # 'O'
- 80: 79, # 'P'
- 81: 118, # 'Q'
- 82: 105, # 'R'
- 83: 83, # 'S'
- 84: 67, # 'T'
- 85: 114, # 'U'
- 86: 119, # 'V'
- 87: 95, # 'W'
- 88: 99, # 'X'
- 89: 109, # 'Y'
- 90: 188, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 72, # 'a'
- 98: 70, # 'b'
- 99: 80, # 'c'
- 100: 81, # 'd'
- 101: 60, # 'e'
- 102: 96, # 'f'
- 103: 93, # 'g'
- 104: 89, # 'h'
- 105: 68, # 'i'
- 106: 120, # 'j'
- 107: 97, # 'k'
- 108: 77, # 'l'
- 109: 86, # 'm'
- 110: 69, # 'n'
- 111: 55, # 'o'
- 112: 78, # 'p'
- 113: 115, # 'q'
- 114: 65, # 'r'
- 115: 66, # 's'
- 116: 58, # 't'
- 117: 76, # 'u'
- 118: 106, # 'v'
- 119: 103, # 'w'
- 120: 87, # 'x'
- 121: 107, # 'y'
- 122: 112, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 255, # '€'
- 129: 255, # None
- 130: 255, # '‚'
- 131: 255, # 'ƒ'
- 132: 255, # '„'
- 133: 255, # '…'
- 134: 255, # '†'
- 135: 255, # '‡'
- 136: 255, # None
- 137: 255, # '‰'
- 138: 255, # None
- 139: 255, # '‹'
- 140: 255, # None
- 141: 255, # None
- 142: 255, # None
- 143: 255, # None
- 144: 255, # None
- 145: 255, # '‘'
- 146: 255, # '’'
- 147: 255, # '“'
- 148: 255, # '”'
- 149: 255, # '•'
- 150: 255, # '–'
- 151: 255, # '—'
- 152: 255, # None
- 153: 255, # '™'
- 154: 255, # None
- 155: 255, # '›'
- 156: 255, # None
- 157: 255, # None
- 158: 255, # None
- 159: 255, # None
- 160: 253, # '\xa0'
- 161: 233, # '΅'
- 162: 61, # 'Ά'
- 163: 253, # '£'
- 164: 253, # '¤'
- 165: 253, # '¥'
- 166: 253, # '¦'
- 167: 253, # '§'
- 168: 253, # '¨'
- 169: 253, # '©'
- 170: 253, # None
- 171: 253, # '«'
- 172: 253, # '¬'
- 173: 74, # '\xad'
- 174: 253, # '®'
- 175: 253, # '―'
- 176: 253, # '°'
- 177: 253, # '±'
- 178: 253, # '²'
- 179: 253, # '³'
- 180: 247, # '΄'
- 181: 253, # 'µ'
- 182: 253, # '¶'
- 183: 36, # '·'
- 184: 46, # 'Έ'
- 185: 71, # 'Ή'
- 186: 73, # 'Ί'
- 187: 253, # '»'
- 188: 54, # 'Ό'
- 189: 253, # '½'
- 190: 108, # 'Ύ'
- 191: 123, # 'Ώ'
- 192: 110, # 'ΐ'
- 193: 31, # 'Α'
- 194: 51, # 'Β'
- 195: 43, # 'Γ'
- 196: 41, # 'Δ'
- 197: 34, # 'Ε'
- 198: 91, # 'Ζ'
- 199: 40, # 'Η'
- 200: 52, # 'Θ'
- 201: 47, # 'Ι'
- 202: 44, # 'Κ'
- 203: 53, # 'Λ'
- 204: 38, # 'Μ'
- 205: 49, # 'Ν'
- 206: 59, # 'Ξ'
- 207: 39, # 'Ο'
- 208: 35, # 'Π'
- 209: 48, # 'Ρ'
- 210: 250, # None
- 211: 37, # 'Σ'
- 212: 33, # 'Τ'
- 213: 45, # 'Υ'
- 214: 56, # 'Φ'
- 215: 50, # 'Χ'
- 216: 84, # 'Ψ'
- 217: 57, # 'Ω'
- 218: 120, # 'Ϊ'
- 219: 121, # 'Ϋ'
- 220: 17, # 'ά'
- 221: 18, # 'έ'
- 222: 22, # 'ή'
- 223: 15, # 'ί'
- 224: 124, # 'ΰ'
- 225: 1, # 'α'
- 226: 29, # 'β'
- 227: 20, # 'γ'
- 228: 21, # 'δ'
- 229: 3, # 'ε'
- 230: 32, # 'ζ'
- 231: 13, # 'η'
- 232: 25, # 'θ'
- 233: 5, # 'ι'
- 234: 11, # 'κ'
- 235: 16, # 'λ'
- 236: 10, # 'μ'
- 237: 6, # 'ν'
- 238: 30, # 'ξ'
- 239: 4, # 'ο'
- 240: 9, # 'π'
- 241: 8, # 'ρ'
- 242: 14, # 'ς'
- 243: 7, # 'σ'
- 244: 2, # 'τ'
- 245: 12, # 'υ'
- 246: 28, # 'φ'
- 247: 23, # 'χ'
- 248: 42, # 'ψ'
- 249: 24, # 'ω'
- 250: 64, # 'ϊ'
- 251: 75, # 'ϋ'
- 252: 19, # 'ό'
- 253: 26, # 'ύ'
- 254: 27, # 'ώ'
- 255: 253, # None
-}
-
-WINDOWS_1253_GREEK_MODEL = SingleByteCharSetModel(
- charset_name="windows-1253",
- language="Greek",
- char_to_order_map=WINDOWS_1253_GREEK_CHAR_TO_ORDER,
- language_model=GREEK_LANG_MODEL,
- typical_positive_ratio=0.982851,
- keep_ascii_letters=False,
- alphabet="ΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩάέήίαβγδεζηθικλμνξοπρςστυφχψωόύώ",
-)
-
-ISO_8859_7_GREEK_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 82, # 'A'
- 66: 100, # 'B'
- 67: 104, # 'C'
- 68: 94, # 'D'
- 69: 98, # 'E'
- 70: 101, # 'F'
- 71: 116, # 'G'
- 72: 102, # 'H'
- 73: 111, # 'I'
- 74: 187, # 'J'
- 75: 117, # 'K'
- 76: 92, # 'L'
- 77: 88, # 'M'
- 78: 113, # 'N'
- 79: 85, # 'O'
- 80: 79, # 'P'
- 81: 118, # 'Q'
- 82: 105, # 'R'
- 83: 83, # 'S'
- 84: 67, # 'T'
- 85: 114, # 'U'
- 86: 119, # 'V'
- 87: 95, # 'W'
- 88: 99, # 'X'
- 89: 109, # 'Y'
- 90: 188, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 72, # 'a'
- 98: 70, # 'b'
- 99: 80, # 'c'
- 100: 81, # 'd'
- 101: 60, # 'e'
- 102: 96, # 'f'
- 103: 93, # 'g'
- 104: 89, # 'h'
- 105: 68, # 'i'
- 106: 120, # 'j'
- 107: 97, # 'k'
- 108: 77, # 'l'
- 109: 86, # 'm'
- 110: 69, # 'n'
- 111: 55, # 'o'
- 112: 78, # 'p'
- 113: 115, # 'q'
- 114: 65, # 'r'
- 115: 66, # 's'
- 116: 58, # 't'
- 117: 76, # 'u'
- 118: 106, # 'v'
- 119: 103, # 'w'
- 120: 87, # 'x'
- 121: 107, # 'y'
- 122: 112, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 255, # '\x80'
- 129: 255, # '\x81'
- 130: 255, # '\x82'
- 131: 255, # '\x83'
- 132: 255, # '\x84'
- 133: 255, # '\x85'
- 134: 255, # '\x86'
- 135: 255, # '\x87'
- 136: 255, # '\x88'
- 137: 255, # '\x89'
- 138: 255, # '\x8a'
- 139: 255, # '\x8b'
- 140: 255, # '\x8c'
- 141: 255, # '\x8d'
- 142: 255, # '\x8e'
- 143: 255, # '\x8f'
- 144: 255, # '\x90'
- 145: 255, # '\x91'
- 146: 255, # '\x92'
- 147: 255, # '\x93'
- 148: 255, # '\x94'
- 149: 255, # '\x95'
- 150: 255, # '\x96'
- 151: 255, # '\x97'
- 152: 255, # '\x98'
- 153: 255, # '\x99'
- 154: 255, # '\x9a'
- 155: 255, # '\x9b'
- 156: 255, # '\x9c'
- 157: 255, # '\x9d'
- 158: 255, # '\x9e'
- 159: 255, # '\x9f'
- 160: 253, # '\xa0'
- 161: 233, # '‘'
- 162: 90, # '’'
- 163: 253, # '£'
- 164: 253, # '€'
- 165: 253, # '₯'
- 166: 253, # '¦'
- 167: 253, # '§'
- 168: 253, # '¨'
- 169: 253, # '©'
- 170: 253, # 'ͺ'
- 171: 253, # '«'
- 172: 253, # '¬'
- 173: 74, # '\xad'
- 174: 253, # None
- 175: 253, # '―'
- 176: 253, # '°'
- 177: 253, # '±'
- 178: 253, # '²'
- 179: 253, # '³'
- 180: 247, # '΄'
- 181: 248, # '΅'
- 182: 61, # 'Ά'
- 183: 36, # '·'
- 184: 46, # 'Έ'
- 185: 71, # 'Ή'
- 186: 73, # 'Ί'
- 187: 253, # '»'
- 188: 54, # 'Ό'
- 189: 253, # '½'
- 190: 108, # 'Ύ'
- 191: 123, # 'Ώ'
- 192: 110, # 'ΐ'
- 193: 31, # 'Α'
- 194: 51, # 'Β'
- 195: 43, # 'Γ'
- 196: 41, # 'Δ'
- 197: 34, # 'Ε'
- 198: 91, # 'Ζ'
- 199: 40, # 'Η'
- 200: 52, # 'Θ'
- 201: 47, # 'Ι'
- 202: 44, # 'Κ'
- 203: 53, # 'Λ'
- 204: 38, # 'Μ'
- 205: 49, # 'Ν'
- 206: 59, # 'Ξ'
- 207: 39, # 'Ο'
- 208: 35, # 'Π'
- 209: 48, # 'Ρ'
- 210: 250, # None
- 211: 37, # 'Σ'
- 212: 33, # 'Τ'
- 213: 45, # 'Υ'
- 214: 56, # 'Φ'
- 215: 50, # 'Χ'
- 216: 84, # 'Ψ'
- 217: 57, # 'Ω'
- 218: 120, # 'Ϊ'
- 219: 121, # 'Ϋ'
- 220: 17, # 'ά'
- 221: 18, # 'έ'
- 222: 22, # 'ή'
- 223: 15, # 'ί'
- 224: 124, # 'ΰ'
- 225: 1, # 'α'
- 226: 29, # 'β'
- 227: 20, # 'γ'
- 228: 21, # 'δ'
- 229: 3, # 'ε'
- 230: 32, # 'ζ'
- 231: 13, # 'η'
- 232: 25, # 'θ'
- 233: 5, # 'ι'
- 234: 11, # 'κ'
- 235: 16, # 'λ'
- 236: 10, # 'μ'
- 237: 6, # 'ν'
- 238: 30, # 'ξ'
- 239: 4, # 'ο'
- 240: 9, # 'π'
- 241: 8, # 'ρ'
- 242: 14, # 'ς'
- 243: 7, # 'σ'
- 244: 2, # 'τ'
- 245: 12, # 'υ'
- 246: 28, # 'φ'
- 247: 23, # 'χ'
- 248: 42, # 'ψ'
- 249: 24, # 'ω'
- 250: 64, # 'ϊ'
- 251: 75, # 'ϋ'
- 252: 19, # 'ό'
- 253: 26, # 'ύ'
- 254: 27, # 'ώ'
- 255: 253, # None
-}
-
-ISO_8859_7_GREEK_MODEL = SingleByteCharSetModel(
- charset_name="ISO-8859-7",
- language="Greek",
- char_to_order_map=ISO_8859_7_GREEK_CHAR_TO_ORDER,
- language_model=GREEK_LANG_MODEL,
- typical_positive_ratio=0.982851,
- keep_ascii_letters=False,
- alphabet="ΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩάέήίαβγδεζηθικλμνξοπρςστυφχψωόύώ",
-)
diff --git a/contrib/python/pip/pip/_vendor/chardet/langhebrewmodel.py b/contrib/python/pip/pip/_vendor/chardet/langhebrewmodel.py
deleted file mode 100644
index 56d2975877..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/langhebrewmodel.py
+++ /dev/null
@@ -1,4380 +0,0 @@
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-HEBREW_LANG_MODEL = {
- 50: { # 'a'
- 50: 0, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 2, # 'l'
- 54: 2, # 'n'
- 49: 0, # 'o'
- 51: 2, # 'r'
- 43: 1, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 1, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 1, # 'ק'
- 7: 0, # 'ר'
- 10: 1, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 60: { # 'c'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 0, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 0, # 'n'
- 49: 1, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 1, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 61: { # 'd'
- 50: 1, # 'a'
- 60: 0, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 1, # 'n'
- 49: 2, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 0, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 1, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 1, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 42: { # 'e'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 2, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 2, # 'l'
- 54: 2, # 'n'
- 49: 1, # 'o'
- 51: 2, # 'r'
- 43: 2, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 1, # '–'
- 52: 2, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 53: { # 'i'
- 50: 1, # 'a'
- 60: 2, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 0, # 'i'
- 56: 1, # 'l'
- 54: 2, # 'n'
- 49: 2, # 'o'
- 51: 1, # 'r'
- 43: 2, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 56: { # 'l'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 2, # 'e'
- 53: 2, # 'i'
- 56: 2, # 'l'
- 54: 1, # 'n'
- 49: 1, # 'o'
- 51: 0, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 54: { # 'n'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 1, # 'n'
- 49: 1, # 'o'
- 51: 0, # 'r'
- 43: 1, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 1, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 2, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 49: { # 'o'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 2, # 'n'
- 49: 1, # 'o'
- 51: 2, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 51: { # 'r'
- 50: 2, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 2, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 1, # 'n'
- 49: 2, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 2, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 43: { # 's'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 0, # 'd'
- 42: 2, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 1, # 'n'
- 49: 1, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 2, # '”'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 44: { # 't'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 0, # 'd'
- 42: 2, # 'e'
- 53: 2, # 'i'
- 56: 1, # 'l'
- 54: 0, # 'n'
- 49: 1, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 1, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 2, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 63: { # 'u'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 1, # 'n'
- 49: 0, # 'o'
- 51: 1, # 'r'
- 43: 2, # 's'
- 44: 1, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 34: { # '\xa0'
- 50: 1, # 'a'
- 60: 0, # 'c'
- 61: 1, # 'd'
- 42: 0, # 'e'
- 53: 1, # 'i'
- 56: 0, # 'l'
- 54: 1, # 'n'
- 49: 1, # 'o'
- 51: 0, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 0, # 'u'
- 34: 2, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 1, # 'ב'
- 20: 1, # 'ג'
- 16: 1, # 'ד'
- 3: 1, # 'ה'
- 2: 1, # 'ו'
- 24: 1, # 'ז'
- 14: 1, # 'ח'
- 22: 1, # 'ט'
- 1: 2, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 2, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # 'נ'
- 19: 1, # 'ס'
- 13: 1, # 'ע'
- 26: 0, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 1, # 'צ'
- 17: 1, # 'ק'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 55: { # '´'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 1, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 1, # 'ה'
- 2: 1, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 2, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 1, # 'ן'
- 12: 1, # 'נ'
- 19: 1, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 48: { # '¼'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 1, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 39: { # '½'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 1, # 'צ'
- 17: 1, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 57: { # '¾'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 30: { # 'ְ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 2, # 'ב'
- 20: 2, # 'ג'
- 16: 2, # 'ד'
- 3: 2, # 'ה'
- 2: 2, # 'ו'
- 24: 2, # 'ז'
- 14: 2, # 'ח'
- 22: 2, # 'ט'
- 1: 2, # 'י'
- 25: 2, # 'ך'
- 15: 2, # 'כ'
- 4: 2, # 'ל'
- 11: 1, # 'ם'
- 6: 2, # 'מ'
- 23: 0, # 'ן'
- 12: 2, # 'נ'
- 19: 2, # 'ס'
- 13: 2, # 'ע'
- 26: 0, # 'ף'
- 18: 2, # 'פ'
- 27: 0, # 'ץ'
- 21: 2, # 'צ'
- 17: 2, # 'ק'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 59: { # 'ֱ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 1, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 1, # 'ב'
- 20: 1, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 1, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 1, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 2, # 'ל'
- 11: 0, # 'ם'
- 6: 2, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 41: { # 'ֲ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 2, # 'ב'
- 20: 1, # 'ג'
- 16: 2, # 'ד'
- 3: 1, # 'ה'
- 2: 1, # 'ו'
- 24: 1, # 'ז'
- 14: 1, # 'ח'
- 22: 1, # 'ט'
- 1: 1, # 'י'
- 25: 1, # 'ך'
- 15: 1, # 'כ'
- 4: 2, # 'ל'
- 11: 0, # 'ם'
- 6: 2, # 'מ'
- 23: 0, # 'ן'
- 12: 2, # 'נ'
- 19: 1, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 2, # 'צ'
- 17: 1, # 'ק'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 33: { # 'ִ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 1, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 1, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 1, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 1, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 2, # 'ב'
- 20: 2, # 'ג'
- 16: 2, # 'ד'
- 3: 1, # 'ה'
- 2: 1, # 'ו'
- 24: 2, # 'ז'
- 14: 1, # 'ח'
- 22: 1, # 'ט'
- 1: 3, # 'י'
- 25: 1, # 'ך'
- 15: 2, # 'כ'
- 4: 2, # 'ל'
- 11: 2, # 'ם'
- 6: 2, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # 'נ'
- 19: 2, # 'ס'
- 13: 1, # 'ע'
- 26: 0, # 'ף'
- 18: 2, # 'פ'
- 27: 1, # 'ץ'
- 21: 2, # 'צ'
- 17: 2, # 'ק'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 37: { # 'ֵ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 1, # 'ַ'
- 29: 1, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 2, # 'ב'
- 20: 1, # 'ג'
- 16: 2, # 'ד'
- 3: 2, # 'ה'
- 2: 1, # 'ו'
- 24: 1, # 'ז'
- 14: 2, # 'ח'
- 22: 1, # 'ט'
- 1: 3, # 'י'
- 25: 2, # 'ך'
- 15: 1, # 'כ'
- 4: 2, # 'ל'
- 11: 2, # 'ם'
- 6: 1, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # 'נ'
- 19: 1, # 'ס'
- 13: 2, # 'ע'
- 26: 1, # 'ף'
- 18: 1, # 'פ'
- 27: 1, # 'ץ'
- 21: 1, # 'צ'
- 17: 1, # 'ק'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 36: { # 'ֶ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 1, # 'ַ'
- 29: 1, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 2, # 'ב'
- 20: 1, # 'ג'
- 16: 2, # 'ד'
- 3: 2, # 'ה'
- 2: 1, # 'ו'
- 24: 1, # 'ז'
- 14: 2, # 'ח'
- 22: 1, # 'ט'
- 1: 2, # 'י'
- 25: 2, # 'ך'
- 15: 1, # 'כ'
- 4: 2, # 'ל'
- 11: 2, # 'ם'
- 6: 2, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # 'נ'
- 19: 2, # 'ס'
- 13: 1, # 'ע'
- 26: 1, # 'ף'
- 18: 1, # 'פ'
- 27: 2, # 'ץ'
- 21: 1, # 'צ'
- 17: 1, # 'ק'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 31: { # 'ַ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 1, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 2, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 2, # 'ב'
- 20: 2, # 'ג'
- 16: 2, # 'ד'
- 3: 2, # 'ה'
- 2: 1, # 'ו'
- 24: 2, # 'ז'
- 14: 2, # 'ח'
- 22: 2, # 'ט'
- 1: 3, # 'י'
- 25: 1, # 'ך'
- 15: 2, # 'כ'
- 4: 2, # 'ל'
- 11: 2, # 'ם'
- 6: 2, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # 'נ'
- 19: 2, # 'ס'
- 13: 2, # 'ע'
- 26: 2, # 'ף'
- 18: 2, # 'פ'
- 27: 1, # 'ץ'
- 21: 2, # 'צ'
- 17: 2, # 'ק'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 29: { # 'ָ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 1, # 'ַ'
- 29: 2, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 1, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 2, # 'ב'
- 20: 2, # 'ג'
- 16: 2, # 'ד'
- 3: 3, # 'ה'
- 2: 2, # 'ו'
- 24: 2, # 'ז'
- 14: 2, # 'ח'
- 22: 1, # 'ט'
- 1: 2, # 'י'
- 25: 2, # 'ך'
- 15: 2, # 'כ'
- 4: 2, # 'ל'
- 11: 2, # 'ם'
- 6: 2, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # 'נ'
- 19: 1, # 'ס'
- 13: 2, # 'ע'
- 26: 1, # 'ף'
- 18: 2, # 'פ'
- 27: 1, # 'ץ'
- 21: 2, # 'צ'
- 17: 2, # 'ק'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 35: { # 'ֹ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 2, # 'ב'
- 20: 1, # 'ג'
- 16: 2, # 'ד'
- 3: 2, # 'ה'
- 2: 1, # 'ו'
- 24: 1, # 'ז'
- 14: 1, # 'ח'
- 22: 1, # 'ט'
- 1: 1, # 'י'
- 25: 1, # 'ך'
- 15: 2, # 'כ'
- 4: 2, # 'ל'
- 11: 2, # 'ם'
- 6: 2, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # 'נ'
- 19: 2, # 'ס'
- 13: 2, # 'ע'
- 26: 1, # 'ף'
- 18: 2, # 'פ'
- 27: 1, # 'ץ'
- 21: 2, # 'צ'
- 17: 2, # 'ק'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 62: { # 'ֻ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 1, # 'ב'
- 20: 1, # 'ג'
- 16: 1, # 'ד'
- 3: 1, # 'ה'
- 2: 1, # 'ו'
- 24: 1, # 'ז'
- 14: 1, # 'ח'
- 22: 0, # 'ט'
- 1: 1, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 2, # 'ל'
- 11: 1, # 'ם'
- 6: 1, # 'מ'
- 23: 1, # 'ן'
- 12: 1, # 'נ'
- 19: 1, # 'ס'
- 13: 1, # 'ע'
- 26: 0, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 1, # 'צ'
- 17: 1, # 'ק'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 28: { # 'ּ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 3, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 1, # 'ֲ'
- 33: 3, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 3, # 'ַ'
- 29: 3, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 2, # 'ׁ'
- 45: 1, # 'ׂ'
- 9: 2, # 'א'
- 8: 2, # 'ב'
- 20: 1, # 'ג'
- 16: 2, # 'ד'
- 3: 1, # 'ה'
- 2: 2, # 'ו'
- 24: 1, # 'ז'
- 14: 1, # 'ח'
- 22: 1, # 'ט'
- 1: 2, # 'י'
- 25: 2, # 'ך'
- 15: 2, # 'כ'
- 4: 2, # 'ל'
- 11: 1, # 'ם'
- 6: 2, # 'מ'
- 23: 1, # 'ן'
- 12: 2, # 'נ'
- 19: 1, # 'ס'
- 13: 2, # 'ע'
- 26: 1, # 'ף'
- 18: 1, # 'פ'
- 27: 1, # 'ץ'
- 21: 1, # 'צ'
- 17: 1, # 'ק'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 38: { # 'ׁ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 2, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 1, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 1, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 45: { # 'ׂ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 1, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 1, # 'ַ'
- 29: 2, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 0, # 'ב'
- 20: 1, # 'ג'
- 16: 0, # 'ד'
- 3: 1, # 'ה'
- 2: 2, # 'ו'
- 24: 0, # 'ז'
- 14: 1, # 'ח'
- 22: 0, # 'ט'
- 1: 1, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 1, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # 'נ'
- 19: 0, # 'ס'
- 13: 1, # 'ע'
- 26: 0, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 1, # 'ר'
- 10: 0, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 9: { # 'א'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 2, # 'ֱ'
- 41: 2, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 3, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 2, # 'ע'
- 26: 3, # 'ף'
- 18: 3, # 'פ'
- 27: 1, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 8: { # 'ב'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 1, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 3, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 2, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 2, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 3, # 'ע'
- 26: 1, # 'ף'
- 18: 3, # 'פ'
- 27: 2, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 1, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 20: { # 'ג'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 2, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 1, # 'ִ'
- 37: 1, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 3, # 'ב'
- 20: 2, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 2, # 'ח'
- 22: 2, # 'ט'
- 1: 3, # 'י'
- 25: 1, # 'ך'
- 15: 1, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 2, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 2, # 'פ'
- 27: 1, # 'ץ'
- 21: 1, # 'צ'
- 17: 1, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 16: { # 'ד'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 1, # 'ז'
- 14: 2, # 'ח'
- 22: 2, # 'ט'
- 1: 3, # 'י'
- 25: 2, # 'ך'
- 15: 2, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # 'נ'
- 19: 2, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 3, # 'פ'
- 27: 0, # 'ץ'
- 21: 2, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 3: { # 'ה'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 1, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 1, # 'ְ'
- 59: 1, # 'ֱ'
- 41: 2, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 3, # 'ַ'
- 29: 2, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 1, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 3, # 'ע'
- 26: 0, # 'ף'
- 18: 3, # 'פ'
- 27: 1, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 1, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 2: { # 'ו'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 1, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 1, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 3, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 3, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 3, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 3, # 'ע'
- 26: 3, # 'ף'
- 18: 3, # 'פ'
- 27: 3, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 1, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 24: { # 'ז'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 1, # 'ֲ'
- 33: 1, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 2, # 'ב'
- 20: 2, # 'ג'
- 16: 2, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 2, # 'ז'
- 14: 2, # 'ח'
- 22: 1, # 'ט'
- 1: 3, # 'י'
- 25: 1, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 2, # 'ם'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # 'נ'
- 19: 1, # 'ס'
- 13: 2, # 'ע'
- 26: 1, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 2, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 1, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 14: { # 'ח'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 1, # 'ֱ'
- 41: 2, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 3, # 'ב'
- 20: 2, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 2, # 'ח'
- 22: 2, # 'ט'
- 1: 3, # 'י'
- 25: 1, # 'ך'
- 15: 2, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 1, # 'ע'
- 26: 2, # 'ף'
- 18: 2, # 'פ'
- 27: 2, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 22: { # 'ט'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 1, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 1, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 1, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 1, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 2, # 'ז'
- 14: 3, # 'ח'
- 22: 2, # 'ט'
- 1: 3, # 'י'
- 25: 1, # 'ך'
- 15: 2, # 'כ'
- 4: 3, # 'ל'
- 11: 2, # 'ם'
- 6: 2, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # 'נ'
- 19: 2, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 3, # 'פ'
- 27: 1, # 'ץ'
- 21: 2, # 'צ'
- 17: 2, # 'ק'
- 7: 3, # 'ר'
- 10: 2, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 1: { # 'י'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 3, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 3, # 'ע'
- 26: 3, # 'ף'
- 18: 3, # 'פ'
- 27: 3, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 1, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 25: { # 'ך'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 2, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 1, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 1, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 1, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 1, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 15: { # 'כ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 3, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 2, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 3, # 'ח'
- 22: 2, # 'ט'
- 1: 3, # 'י'
- 25: 3, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 2, # 'ע'
- 26: 3, # 'ף'
- 18: 3, # 'פ'
- 27: 1, # 'ץ'
- 21: 2, # 'צ'
- 17: 2, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 4: { # 'ל'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 3, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 3, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 3, # 'פ'
- 27: 2, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 1, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 11: { # 'ם'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 1, # 'ב'
- 20: 1, # 'ג'
- 16: 0, # 'ד'
- 3: 1, # 'ה'
- 2: 1, # 'ו'
- 24: 1, # 'ז'
- 14: 1, # 'ח'
- 22: 0, # 'ט'
- 1: 1, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 1, # 'ל'
- 11: 1, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # 'נ'
- 19: 0, # 'ס'
- 13: 1, # 'ע'
- 26: 0, # 'ף'
- 18: 1, # 'פ'
- 27: 1, # 'ץ'
- 21: 1, # 'צ'
- 17: 1, # 'ק'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 6: { # 'מ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 2, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 3, # 'ע'
- 26: 0, # 'ף'
- 18: 3, # 'פ'
- 27: 2, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 23: { # 'ן'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 1, # 'ב'
- 20: 1, # 'ג'
- 16: 1, # 'ד'
- 3: 1, # 'ה'
- 2: 1, # 'ו'
- 24: 0, # 'ז'
- 14: 1, # 'ח'
- 22: 1, # 'ט'
- 1: 1, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 1, # 'ל'
- 11: 1, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # 'נ'
- 19: 1, # 'ס'
- 13: 1, # 'ע'
- 26: 1, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 1, # 'ק'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 1, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 12: { # 'נ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 2, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 3, # 'פ'
- 27: 2, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 19: { # 'ס'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 1, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 1, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 2, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 1, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 2, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 2, # 'ם'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # 'נ'
- 19: 2, # 'ס'
- 13: 3, # 'ע'
- 26: 3, # 'ף'
- 18: 3, # 'פ'
- 27: 0, # 'ץ'
- 21: 2, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 1, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 13: { # 'ע'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 1, # 'ְ'
- 59: 1, # 'ֱ'
- 41: 2, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 1, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 2, # 'ך'
- 15: 2, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 2, # 'ע'
- 26: 1, # 'ף'
- 18: 2, # 'פ'
- 27: 2, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 26: { # 'ף'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 1, # 'ו'
- 24: 0, # 'ז'
- 14: 1, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 1, # 'ס'
- 13: 0, # 'ע'
- 26: 1, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 1, # 'ק'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 18: { # 'פ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 1, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 1, # 'ַ'
- 29: 2, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 2, # 'ב'
- 20: 3, # 'ג'
- 16: 2, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 2, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 2, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 2, # 'ם'
- 6: 2, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 2, # 'פ'
- 27: 2, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 27: { # 'ץ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 1, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 1, # 'ר'
- 10: 0, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 21: { # 'צ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 2, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 1, # 'ז'
- 14: 3, # 'ח'
- 22: 2, # 'ט'
- 1: 3, # 'י'
- 25: 1, # 'ך'
- 15: 1, # 'כ'
- 4: 3, # 'ל'
- 11: 2, # 'ם'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # 'נ'
- 19: 1, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 3, # 'פ'
- 27: 2, # 'ץ'
- 21: 2, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 0, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 17: { # 'ק'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 2, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 2, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 1, # 'ך'
- 15: 1, # 'כ'
- 4: 3, # 'ל'
- 11: 2, # 'ם'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 3, # 'פ'
- 27: 2, # 'ץ'
- 21: 3, # 'צ'
- 17: 2, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 7: { # 'ר'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 2, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 1, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 3, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 3, # 'פ'
- 27: 3, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 10: { # 'ש'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 1, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 1, # 'ִ'
- 37: 1, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 1, # 'ַ'
- 29: 1, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 3, # 'ׁ'
- 45: 2, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 2, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 3, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # 'נ'
- 19: 2, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 3, # 'פ'
- 27: 1, # 'ץ'
- 21: 2, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 5: { # 'ת'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 1, # '¼'
- 39: 1, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 2, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 2, # 'ז'
- 14: 3, # 'ח'
- 22: 2, # 'ט'
- 1: 3, # 'י'
- 25: 2, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 2, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 3, # 'פ'
- 27: 1, # 'ץ'
- 21: 2, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 1, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 32: { # '–'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 1, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 1, # 'ב'
- 20: 1, # 'ג'
- 16: 1, # 'ד'
- 3: 1, # 'ה'
- 2: 1, # 'ו'
- 24: 0, # 'ז'
- 14: 1, # 'ח'
- 22: 0, # 'ט'
- 1: 1, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 1, # 'ס'
- 13: 1, # 'ע'
- 26: 0, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 1, # 'צ'
- 17: 0, # 'ק'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 52: { # '’'
- 50: 1, # 'a'
- 60: 0, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 1, # 'r'
- 43: 2, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 1, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 47: { # '“'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 1, # 'n'
- 49: 1, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 1, # 'ב'
- 20: 1, # 'ג'
- 16: 1, # 'ד'
- 3: 1, # 'ה'
- 2: 1, # 'ו'
- 24: 1, # 'ז'
- 14: 1, # 'ח'
- 22: 1, # 'ט'
- 1: 1, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # 'נ'
- 19: 1, # 'ס'
- 13: 1, # 'ע'
- 26: 0, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 1, # 'צ'
- 17: 1, # 'ק'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 46: { # '”'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 1, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 1, # 'ב'
- 20: 1, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 1, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 1, # 'צ'
- 17: 0, # 'ק'
- 7: 1, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 58: { # '†'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 2, # '†'
- 40: 0, # '…'
- },
- 40: { # '…'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 0, # 'l'
- 54: 1, # 'n'
- 49: 0, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 1, # 'ה'
- 2: 1, # 'ו'
- 24: 1, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 1, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 2, # '…'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-WINDOWS_1255_HEBREW_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 69, # 'A'
- 66: 91, # 'B'
- 67: 79, # 'C'
- 68: 80, # 'D'
- 69: 92, # 'E'
- 70: 89, # 'F'
- 71: 97, # 'G'
- 72: 90, # 'H'
- 73: 68, # 'I'
- 74: 111, # 'J'
- 75: 112, # 'K'
- 76: 82, # 'L'
- 77: 73, # 'M'
- 78: 95, # 'N'
- 79: 85, # 'O'
- 80: 78, # 'P'
- 81: 121, # 'Q'
- 82: 86, # 'R'
- 83: 71, # 'S'
- 84: 67, # 'T'
- 85: 102, # 'U'
- 86: 107, # 'V'
- 87: 84, # 'W'
- 88: 114, # 'X'
- 89: 103, # 'Y'
- 90: 115, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 50, # 'a'
- 98: 74, # 'b'
- 99: 60, # 'c'
- 100: 61, # 'd'
- 101: 42, # 'e'
- 102: 76, # 'f'
- 103: 70, # 'g'
- 104: 64, # 'h'
- 105: 53, # 'i'
- 106: 105, # 'j'
- 107: 93, # 'k'
- 108: 56, # 'l'
- 109: 65, # 'm'
- 110: 54, # 'n'
- 111: 49, # 'o'
- 112: 66, # 'p'
- 113: 110, # 'q'
- 114: 51, # 'r'
- 115: 43, # 's'
- 116: 44, # 't'
- 117: 63, # 'u'
- 118: 81, # 'v'
- 119: 77, # 'w'
- 120: 98, # 'x'
- 121: 75, # 'y'
- 122: 108, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 124, # '€'
- 129: 202, # None
- 130: 203, # '‚'
- 131: 204, # 'ƒ'
- 132: 205, # '„'
- 133: 40, # '…'
- 134: 58, # '†'
- 135: 206, # '‡'
- 136: 207, # 'ˆ'
- 137: 208, # '‰'
- 138: 209, # None
- 139: 210, # '‹'
- 140: 211, # None
- 141: 212, # None
- 142: 213, # None
- 143: 214, # None
- 144: 215, # None
- 145: 83, # '‘'
- 146: 52, # '’'
- 147: 47, # '“'
- 148: 46, # '”'
- 149: 72, # '•'
- 150: 32, # '–'
- 151: 94, # '—'
- 152: 216, # '˜'
- 153: 113, # '™'
- 154: 217, # None
- 155: 109, # '›'
- 156: 218, # None
- 157: 219, # None
- 158: 220, # None
- 159: 221, # None
- 160: 34, # '\xa0'
- 161: 116, # '¡'
- 162: 222, # '¢'
- 163: 118, # '£'
- 164: 100, # '₪'
- 165: 223, # '¥'
- 166: 224, # '¦'
- 167: 117, # '§'
- 168: 119, # '¨'
- 169: 104, # '©'
- 170: 125, # '×'
- 171: 225, # '«'
- 172: 226, # '¬'
- 173: 87, # '\xad'
- 174: 99, # '®'
- 175: 227, # '¯'
- 176: 106, # '°'
- 177: 122, # '±'
- 178: 123, # '²'
- 179: 228, # '³'
- 180: 55, # '´'
- 181: 229, # 'µ'
- 182: 230, # '¶'
- 183: 101, # '·'
- 184: 231, # '¸'
- 185: 232, # '¹'
- 186: 120, # '÷'
- 187: 233, # '»'
- 188: 48, # '¼'
- 189: 39, # '½'
- 190: 57, # '¾'
- 191: 234, # '¿'
- 192: 30, # 'ְ'
- 193: 59, # 'ֱ'
- 194: 41, # 'ֲ'
- 195: 88, # 'ֳ'
- 196: 33, # 'ִ'
- 197: 37, # 'ֵ'
- 198: 36, # 'ֶ'
- 199: 31, # 'ַ'
- 200: 29, # 'ָ'
- 201: 35, # 'ֹ'
- 202: 235, # None
- 203: 62, # 'ֻ'
- 204: 28, # 'ּ'
- 205: 236, # 'ֽ'
- 206: 126, # '־'
- 207: 237, # 'ֿ'
- 208: 238, # '׀'
- 209: 38, # 'ׁ'
- 210: 45, # 'ׂ'
- 211: 239, # '׃'
- 212: 240, # 'װ'
- 213: 241, # 'ױ'
- 214: 242, # 'ײ'
- 215: 243, # '׳'
- 216: 127, # '״'
- 217: 244, # None
- 218: 245, # None
- 219: 246, # None
- 220: 247, # None
- 221: 248, # None
- 222: 249, # None
- 223: 250, # None
- 224: 9, # 'א'
- 225: 8, # 'ב'
- 226: 20, # 'ג'
- 227: 16, # 'ד'
- 228: 3, # 'ה'
- 229: 2, # 'ו'
- 230: 24, # 'ז'
- 231: 14, # 'ח'
- 232: 22, # 'ט'
- 233: 1, # 'י'
- 234: 25, # 'ך'
- 235: 15, # 'כ'
- 236: 4, # 'ל'
- 237: 11, # 'ם'
- 238: 6, # 'מ'
- 239: 23, # 'ן'
- 240: 12, # 'נ'
- 241: 19, # 'ס'
- 242: 13, # 'ע'
- 243: 26, # 'ף'
- 244: 18, # 'פ'
- 245: 27, # 'ץ'
- 246: 21, # 'צ'
- 247: 17, # 'ק'
- 248: 7, # 'ר'
- 249: 10, # 'ש'
- 250: 5, # 'ת'
- 251: 251, # None
- 252: 252, # None
- 253: 128, # '\u200e'
- 254: 96, # '\u200f'
- 255: 253, # None
-}
-
-WINDOWS_1255_HEBREW_MODEL = SingleByteCharSetModel(
- charset_name="windows-1255",
- language="Hebrew",
- char_to_order_map=WINDOWS_1255_HEBREW_CHAR_TO_ORDER,
- language_model=HEBREW_LANG_MODEL,
- typical_positive_ratio=0.984004,
- keep_ascii_letters=False,
- alphabet="אבגדהוזחטיךכלםמןנסעףפץצקרשתװױײ",
-)
diff --git a/contrib/python/pip/pip/_vendor/chardet/langhungarianmodel.py b/contrib/python/pip/pip/_vendor/chardet/langhungarianmodel.py
deleted file mode 100644
index 09a0d326b9..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/langhungarianmodel.py
+++ /dev/null
@@ -1,4649 +0,0 @@
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-HUNGARIAN_LANG_MODEL = {
- 28: { # 'A'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 2, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 2, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 2, # 'K'
- 41: 2, # 'L'
- 34: 1, # 'M'
- 35: 2, # 'N'
- 47: 1, # 'O'
- 46: 2, # 'P'
- 43: 2, # 'R'
- 33: 2, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 2, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 1, # 'j'
- 7: 2, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 2, # 'n'
- 8: 0, # 'o'
- 23: 2, # 'p'
- 10: 2, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 1, # 'u'
- 19: 1, # 'v'
- 62: 1, # 'x'
- 16: 0, # 'y'
- 11: 3, # 'z'
- 51: 1, # 'Á'
- 44: 0, # 'É'
- 61: 1, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 40: { # 'B'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 0, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 3, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 2, # 'i'
- 22: 1, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 3, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 54: { # 'C'
- 28: 1, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 0, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 2, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 0, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 1, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 3, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 1, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 45: { # 'D'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 0, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 0, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 3, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 1, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 1, # 'o'
- 23: 0, # 'p'
- 10: 2, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 2, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 1, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'ő'
- 56: 0, # 'ű'
- },
- 32: { # 'E'
- 28: 1, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 2, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 2, # 'K'
- 41: 2, # 'L'
- 34: 2, # 'M'
- 35: 2, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 2, # 'R'
- 33: 2, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 1, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 3, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 2, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 2, # 's'
- 3: 1, # 't'
- 21: 2, # 'u'
- 19: 1, # 'v'
- 62: 1, # 'x'
- 16: 0, # 'y'
- 11: 3, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 0, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 0, # 'Ú'
- 63: 1, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 1, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 50: { # 'F'
- 28: 1, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 0, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 0, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 0, # 'V'
- 55: 1, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 1, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 2, # 'i'
- 22: 1, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 2, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 0, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 0, # 'Ú'
- 63: 1, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 2, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 49: { # 'G'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 2, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 1, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 2, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 2, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'ő'
- 56: 0, # 'ű'
- },
- 38: { # 'H'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 0, # 'D'
- 32: 1, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 1, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 1, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 1, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 0, # 'V'
- 55: 1, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 2, # 'i'
- 22: 1, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 0, # 'n'
- 8: 3, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 2, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Á'
- 44: 2, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 1, # 'é'
- 30: 2, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 39: { # 'I'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 2, # 'K'
- 41: 2, # 'L'
- 34: 1, # 'M'
- 35: 2, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 2, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 2, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 0, # 'e'
- 27: 1, # 'f'
- 12: 2, # 'g'
- 20: 1, # 'h'
- 9: 0, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 1, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 2, # 's'
- 3: 2, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 0, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 53: { # 'J'
- 28: 2, # 'A'
- 40: 0, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 1, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 1, # 'o'
- 23: 0, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 2, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 0, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'í'
- 25: 2, # 'ó'
- 24: 2, # 'ö'
- 31: 1, # 'ú'
- 29: 0, # 'ü'
- 42: 1, # 'ő'
- 56: 0, # 'ű'
- },
- 36: { # 'K'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 0, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 1, # 'f'
- 12: 0, # 'g'
- 20: 1, # 'h'
- 9: 3, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 2, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 2, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 2, # 'ö'
- 31: 1, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'ő'
- 56: 0, # 'ű'
- },
- 41: { # 'L'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 2, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 3, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 2, # 'i'
- 22: 1, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 2, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 0, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 34: { # 'M'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 0, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 3, # 'a'
- 18: 0, # 'b'
- 26: 1, # 'c'
- 17: 0, # 'd'
- 1: 3, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 3, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 3, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 2, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 1, # 'ű'
- },
- 35: { # 'N'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 2, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 2, # 'Y'
- 52: 1, # 'Z'
- 2: 3, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 3, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 2, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 2, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 1, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 1, # 'ő'
- 56: 0, # 'ű'
- },
- 47: { # 'O'
- 28: 1, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 2, # 'K'
- 41: 2, # 'L'
- 34: 2, # 'M'
- 35: 2, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 2, # 'R'
- 33: 2, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 1, # 'j'
- 7: 2, # 'k'
- 6: 2, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 1, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 1, # 's'
- 3: 2, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 1, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 0, # 'Í'
- 58: 1, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 46: { # 'P'
- 28: 1, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 0, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 2, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 1, # 'f'
- 12: 0, # 'g'
- 20: 1, # 'h'
- 9: 2, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 2, # 'r'
- 5: 1, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 0, # 'Ú'
- 63: 1, # 'Ü'
- 14: 3, # 'á'
- 15: 2, # 'é'
- 30: 0, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 0, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'ő'
- 56: 0, # 'ű'
- },
- 43: { # 'R'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 2, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 1, # 'h'
- 9: 2, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 2, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'í'
- 25: 2, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 33: { # 'S'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 2, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 3, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 1, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 1, # 'h'
- 9: 2, # 'i'
- 22: 0, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 1, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 1, # 't'
- 21: 1, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 3, # 'z'
- 51: 2, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 37: { # 'T'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 1, # 'P'
- 43: 2, # 'R'
- 33: 1, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 1, # 'h'
- 9: 2, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 0, # 't'
- 21: 2, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 1, # 'z'
- 51: 2, # 'Á'
- 44: 2, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 2, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 57: { # 'U'
- 28: 1, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 2, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 1, # 'e'
- 27: 0, # 'f'
- 12: 2, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 1, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 48: { # 'V'
- 28: 2, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 0, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 2, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Á'
- 44: 2, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 0, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'í'
- 25: 0, # 'ó'
- 24: 1, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 55: { # 'Y'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 2, # 'Z'
- 2: 1, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 1, # 'd'
- 1: 1, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 1, # 'o'
- 23: 1, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 52: { # 'Z'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 0, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 2, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 1, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 1, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 1, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 8: 1, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 2, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 2: { # 'a'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 2, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 2, # 'o'
- 23: 3, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 1, # 'x'
- 16: 2, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 18: { # 'b'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 2, # 'k'
- 6: 2, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 2, # 's'
- 3: 1, # 't'
- 21: 3, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'í'
- 25: 3, # 'ó'
- 24: 2, # 'ö'
- 31: 2, # 'ú'
- 29: 2, # 'ü'
- 42: 2, # 'ő'
- 56: 1, # 'ű'
- },
- 26: { # 'c'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 1, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 1, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 1, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 1, # 'j'
- 7: 2, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 3, # 's'
- 3: 2, # 't'
- 21: 2, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 2, # 'á'
- 15: 2, # 'é'
- 30: 2, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 17: { # 'd'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 2, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 2, # 'k'
- 6: 1, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 2, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 3, # 'í'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 2, # 'ú'
- 29: 2, # 'ü'
- 42: 2, # 'ő'
- 56: 1, # 'ű'
- },
- 1: { # 'e'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 2, # 'e'
- 27: 3, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 2, # 'o'
- 23: 3, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 2, # 'u'
- 19: 3, # 'v'
- 62: 2, # 'x'
- 16: 2, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 27: { # 'f'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 3, # 'o'
- 23: 0, # 'p'
- 10: 3, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 2, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 3, # 'ö'
- 31: 1, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 12: { # 'g'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 2, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 2, # 'k'
- 6: 3, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 3, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'í'
- 25: 3, # 'ó'
- 24: 2, # 'ö'
- 31: 2, # 'ú'
- 29: 2, # 'ü'
- 42: 2, # 'ő'
- 56: 1, # 'ű'
- },
- 20: { # 'h'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 0, # 'd'
- 1: 3, # 'e'
- 27: 0, # 'f'
- 12: 1, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 3, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 2, # 's'
- 3: 1, # 't'
- 21: 3, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 2, # 'y'
- 11: 0, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 3, # 'í'
- 25: 2, # 'ó'
- 24: 2, # 'ö'
- 31: 2, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 9: { # 'i'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 3, # 'e'
- 27: 3, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 2, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 2, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 1, # 'x'
- 16: 1, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'í'
- 25: 3, # 'ó'
- 24: 1, # 'ö'
- 31: 2, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 1, # 'ű'
- },
- 22: { # 'j'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 2, # 'b'
- 26: 1, # 'c'
- 17: 3, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 2, # 'h'
- 9: 1, # 'i'
- 22: 2, # 'j'
- 7: 2, # 'k'
- 6: 2, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 2, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 1, # 'í'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 3, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 7: { # 'k'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 1, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 2, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 3, # 'í'
- 25: 2, # 'ó'
- 24: 3, # 'ö'
- 31: 1, # 'ú'
- 29: 3, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 6: { # 'l'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 1, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 1, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 2, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 3, # 'e'
- 27: 3, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 2, # 'p'
- 10: 2, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 3, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 3, # 'í'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 2, # 'ú'
- 29: 2, # 'ü'
- 42: 3, # 'ő'
- 56: 1, # 'ű'
- },
- 13: { # 'm'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 1, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 8: 3, # 'o'
- 23: 3, # 'p'
- 10: 2, # 'r'
- 5: 2, # 's'
- 3: 2, # 't'
- 21: 3, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'í'
- 25: 2, # 'ó'
- 24: 2, # 'ö'
- 31: 2, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'ő'
- 56: 2, # 'ű'
- },
- 4: { # 'n'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 2, # 'p'
- 10: 2, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 2, # 'v'
- 62: 1, # 'x'
- 16: 3, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'í'
- 25: 2, # 'ó'
- 24: 3, # 'ö'
- 31: 2, # 'ú'
- 29: 3, # 'ü'
- 42: 2, # 'ő'
- 56: 1, # 'ű'
- },
- 8: { # 'o'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 1, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 2, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 2, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 1, # 'o'
- 23: 3, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 2, # 'u'
- 19: 3, # 'v'
- 62: 1, # 'x'
- 16: 1, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 23: { # 'p'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 1, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 2, # 'k'
- 6: 3, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 8: 3, # 'o'
- 23: 3, # 'p'
- 10: 3, # 'r'
- 5: 2, # 's'
- 3: 2, # 't'
- 21: 3, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'í'
- 25: 2, # 'ó'
- 24: 2, # 'ö'
- 31: 1, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 10: { # 'r'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 1, # 'x'
- 16: 2, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'í'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 3, # 'ú'
- 29: 3, # 'ü'
- 42: 2, # 'ő'
- 56: 2, # 'ű'
- },
- 5: { # 's'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 2, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 2, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 1, # 'j'
- 7: 3, # 'k'
- 6: 2, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 3, # 'í'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 3, # 'ú'
- 29: 3, # 'ü'
- 42: 2, # 'ő'
- 56: 1, # 'ű'
- },
- 3: { # 't'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 1, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 3, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'í'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 3, # 'ú'
- 29: 3, # 'ü'
- 42: 3, # 'ő'
- 56: 2, # 'ű'
- },
- 21: { # 'u'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 2, # 'b'
- 26: 2, # 'c'
- 17: 3, # 'd'
- 1: 2, # 'e'
- 27: 1, # 'f'
- 12: 3, # 'g'
- 20: 2, # 'h'
- 9: 2, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 1, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 1, # 'u'
- 19: 3, # 'v'
- 62: 1, # 'x'
- 16: 1, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 2, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 0, # 'ö'
- 31: 1, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 19: { # 'v'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 2, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 3, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 1, # 'r'
- 5: 2, # 's'
- 3: 2, # 't'
- 21: 2, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'í'
- 25: 2, # 'ó'
- 24: 2, # 'ö'
- 31: 1, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 62: { # 'x'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 0, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 1, # 'i'
- 22: 0, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 1, # 'o'
- 23: 1, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 16: { # 'y'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 2, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 2, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 2, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 2, # 'p'
- 10: 2, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'í'
- 25: 2, # 'ó'
- 24: 3, # 'ö'
- 31: 2, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'ő'
- 56: 2, # 'ű'
- },
- 11: { # 'z'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 2, # 'b'
- 26: 1, # 'c'
- 17: 3, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 2, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 1, # 'j'
- 7: 3, # 'k'
- 6: 2, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 3, # 'í'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 2, # 'ú'
- 29: 3, # 'ü'
- 42: 2, # 'ő'
- 56: 1, # 'ű'
- },
- 51: { # 'Á'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 0, # 'E'
- 50: 1, # 'F'
- 49: 2, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 2, # 'L'
- 34: 1, # 'M'
- 35: 2, # 'N'
- 47: 0, # 'O'
- 46: 1, # 'P'
- 43: 2, # 'R'
- 33: 2, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 0, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 1, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 44: { # 'É'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 0, # 'F'
- 49: 2, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 2, # 'L'
- 34: 1, # 'M'
- 35: 2, # 'N'
- 47: 0, # 'O'
- 46: 1, # 'P'
- 43: 2, # 'R'
- 33: 2, # 'S'
- 37: 2, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 0, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 2, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 3, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 0, # 'Á'
- 44: 1, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 61: { # 'Í'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 0, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 1, # 'J'
- 36: 0, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 0, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 2, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 1, # 'm'
- 4: 0, # 'n'
- 8: 0, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 0, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 58: { # 'Ó'
- 28: 1, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 0, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 2, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 0, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 2, # 'h'
- 9: 0, # 'i'
- 22: 0, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 0, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Á'
- 44: 1, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 59: { # 'Ö'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 0, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 0, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 0, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 0, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 0, # 'o'
- 23: 0, # 'p'
- 10: 2, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 60: { # 'Ú'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 0, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 2, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 2, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 8: 0, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 63: { # 'Ü'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 0, # 'C'
- 45: 1, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 0, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 0, # 'c'
- 17: 1, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 1, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 8: 0, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 14: { # 'á'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 1, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 2, # 'h'
- 9: 2, # 'i'
- 22: 3, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 1, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 2, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'í'
- 25: 0, # 'ó'
- 24: 1, # 'ö'
- 31: 0, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 15: { # 'é'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 3, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 2, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 1, # 'o'
- 23: 3, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 0, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 30: { # 'í'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 0, # 'e'
- 27: 1, # 'f'
- 12: 3, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 2, # 's'
- 3: 3, # 't'
- 21: 0, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 25: { # 'ó'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 3, # 'd'
- 1: 1, # 'e'
- 27: 2, # 'f'
- 12: 2, # 'g'
- 20: 2, # 'h'
- 9: 2, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 1, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 1, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 0, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 24: { # 'ö'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 0, # 'a'
- 18: 3, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 0, # 'e'
- 27: 1, # 'f'
- 12: 2, # 'g'
- 20: 1, # 'h'
- 9: 0, # 'i'
- 22: 1, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 0, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 0, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 31: { # 'ú'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 1, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 1, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 3, # 'j'
- 7: 1, # 'k'
- 6: 3, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 2, # 't'
- 21: 1, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 29: { # 'ü'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 3, # 'g'
- 20: 2, # 'h'
- 9: 1, # 'i'
- 22: 1, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 1, # 'm'
- 4: 3, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 2, # 's'
- 3: 2, # 't'
- 21: 0, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 42: { # 'ő'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 2, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 1, # 'j'
- 7: 2, # 'k'
- 6: 3, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 8: 1, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 2, # 's'
- 3: 2, # 't'
- 21: 1, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 56: { # 'ű'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 1, # 'b'
- 26: 0, # 'c'
- 17: 1, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 2, # 'n'
- 8: 0, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-WINDOWS_1250_HUNGARIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 28, # 'A'
- 66: 40, # 'B'
- 67: 54, # 'C'
- 68: 45, # 'D'
- 69: 32, # 'E'
- 70: 50, # 'F'
- 71: 49, # 'G'
- 72: 38, # 'H'
- 73: 39, # 'I'
- 74: 53, # 'J'
- 75: 36, # 'K'
- 76: 41, # 'L'
- 77: 34, # 'M'
- 78: 35, # 'N'
- 79: 47, # 'O'
- 80: 46, # 'P'
- 81: 72, # 'Q'
- 82: 43, # 'R'
- 83: 33, # 'S'
- 84: 37, # 'T'
- 85: 57, # 'U'
- 86: 48, # 'V'
- 87: 64, # 'W'
- 88: 68, # 'X'
- 89: 55, # 'Y'
- 90: 52, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 2, # 'a'
- 98: 18, # 'b'
- 99: 26, # 'c'
- 100: 17, # 'd'
- 101: 1, # 'e'
- 102: 27, # 'f'
- 103: 12, # 'g'
- 104: 20, # 'h'
- 105: 9, # 'i'
- 106: 22, # 'j'
- 107: 7, # 'k'
- 108: 6, # 'l'
- 109: 13, # 'm'
- 110: 4, # 'n'
- 111: 8, # 'o'
- 112: 23, # 'p'
- 113: 67, # 'q'
- 114: 10, # 'r'
- 115: 5, # 's'
- 116: 3, # 't'
- 117: 21, # 'u'
- 118: 19, # 'v'
- 119: 65, # 'w'
- 120: 62, # 'x'
- 121: 16, # 'y'
- 122: 11, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 161, # '€'
- 129: 162, # None
- 130: 163, # '‚'
- 131: 164, # None
- 132: 165, # '„'
- 133: 166, # '…'
- 134: 167, # '†'
- 135: 168, # '‡'
- 136: 169, # None
- 137: 170, # '‰'
- 138: 171, # 'Š'
- 139: 172, # '‹'
- 140: 173, # 'Ś'
- 141: 174, # 'Ť'
- 142: 175, # 'Ž'
- 143: 176, # 'Ź'
- 144: 177, # None
- 145: 178, # '‘'
- 146: 179, # '’'
- 147: 180, # '“'
- 148: 78, # '”'
- 149: 181, # '•'
- 150: 69, # '–'
- 151: 182, # '—'
- 152: 183, # None
- 153: 184, # '™'
- 154: 185, # 'š'
- 155: 186, # '›'
- 156: 187, # 'ś'
- 157: 188, # 'ť'
- 158: 189, # 'ž'
- 159: 190, # 'ź'
- 160: 191, # '\xa0'
- 161: 192, # 'ˇ'
- 162: 193, # '˘'
- 163: 194, # 'Ł'
- 164: 195, # '¤'
- 165: 196, # 'Ą'
- 166: 197, # '¦'
- 167: 76, # '§'
- 168: 198, # '¨'
- 169: 199, # '©'
- 170: 200, # 'Ş'
- 171: 201, # '«'
- 172: 202, # '¬'
- 173: 203, # '\xad'
- 174: 204, # '®'
- 175: 205, # 'Ż'
- 176: 81, # '°'
- 177: 206, # '±'
- 178: 207, # '˛'
- 179: 208, # 'ł'
- 180: 209, # '´'
- 181: 210, # 'µ'
- 182: 211, # '¶'
- 183: 212, # '·'
- 184: 213, # '¸'
- 185: 214, # 'ą'
- 186: 215, # 'ş'
- 187: 216, # '»'
- 188: 217, # 'Ľ'
- 189: 218, # '˝'
- 190: 219, # 'ľ'
- 191: 220, # 'ż'
- 192: 221, # 'Ŕ'
- 193: 51, # 'Á'
- 194: 83, # 'Â'
- 195: 222, # 'Ă'
- 196: 80, # 'Ä'
- 197: 223, # 'Ĺ'
- 198: 224, # 'Ć'
- 199: 225, # 'Ç'
- 200: 226, # 'Č'
- 201: 44, # 'É'
- 202: 227, # 'Ę'
- 203: 228, # 'Ë'
- 204: 229, # 'Ě'
- 205: 61, # 'Í'
- 206: 230, # 'Î'
- 207: 231, # 'Ď'
- 208: 232, # 'Đ'
- 209: 233, # 'Ń'
- 210: 234, # 'Ň'
- 211: 58, # 'Ó'
- 212: 235, # 'Ô'
- 213: 66, # 'Ő'
- 214: 59, # 'Ö'
- 215: 236, # '×'
- 216: 237, # 'Ř'
- 217: 238, # 'Ů'
- 218: 60, # 'Ú'
- 219: 70, # 'Ű'
- 220: 63, # 'Ü'
- 221: 239, # 'Ý'
- 222: 240, # 'Ţ'
- 223: 241, # 'ß'
- 224: 84, # 'ŕ'
- 225: 14, # 'á'
- 226: 75, # 'â'
- 227: 242, # 'ă'
- 228: 71, # 'ä'
- 229: 82, # 'ĺ'
- 230: 243, # 'ć'
- 231: 73, # 'ç'
- 232: 244, # 'č'
- 233: 15, # 'é'
- 234: 85, # 'ę'
- 235: 79, # 'ë'
- 236: 86, # 'ě'
- 237: 30, # 'í'
- 238: 77, # 'î'
- 239: 87, # 'ď'
- 240: 245, # 'đ'
- 241: 246, # 'ń'
- 242: 247, # 'ň'
- 243: 25, # 'ó'
- 244: 74, # 'ô'
- 245: 42, # 'ő'
- 246: 24, # 'ö'
- 247: 248, # '÷'
- 248: 249, # 'ř'
- 249: 250, # 'ů'
- 250: 31, # 'ú'
- 251: 56, # 'ű'
- 252: 29, # 'ü'
- 253: 251, # 'ý'
- 254: 252, # 'ţ'
- 255: 253, # '˙'
-}
-
-WINDOWS_1250_HUNGARIAN_MODEL = SingleByteCharSetModel(
- charset_name="windows-1250",
- language="Hungarian",
- char_to_order_map=WINDOWS_1250_HUNGARIAN_CHAR_TO_ORDER,
- language_model=HUNGARIAN_LANG_MODEL,
- typical_positive_ratio=0.947368,
- keep_ascii_letters=True,
- alphabet="ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnoprstuvzÁÉÍÓÖÚÜáéíóöúüŐőŰű",
-)
-
-ISO_8859_2_HUNGARIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 28, # 'A'
- 66: 40, # 'B'
- 67: 54, # 'C'
- 68: 45, # 'D'
- 69: 32, # 'E'
- 70: 50, # 'F'
- 71: 49, # 'G'
- 72: 38, # 'H'
- 73: 39, # 'I'
- 74: 53, # 'J'
- 75: 36, # 'K'
- 76: 41, # 'L'
- 77: 34, # 'M'
- 78: 35, # 'N'
- 79: 47, # 'O'
- 80: 46, # 'P'
- 81: 71, # 'Q'
- 82: 43, # 'R'
- 83: 33, # 'S'
- 84: 37, # 'T'
- 85: 57, # 'U'
- 86: 48, # 'V'
- 87: 64, # 'W'
- 88: 68, # 'X'
- 89: 55, # 'Y'
- 90: 52, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 2, # 'a'
- 98: 18, # 'b'
- 99: 26, # 'c'
- 100: 17, # 'd'
- 101: 1, # 'e'
- 102: 27, # 'f'
- 103: 12, # 'g'
- 104: 20, # 'h'
- 105: 9, # 'i'
- 106: 22, # 'j'
- 107: 7, # 'k'
- 108: 6, # 'l'
- 109: 13, # 'm'
- 110: 4, # 'n'
- 111: 8, # 'o'
- 112: 23, # 'p'
- 113: 67, # 'q'
- 114: 10, # 'r'
- 115: 5, # 's'
- 116: 3, # 't'
- 117: 21, # 'u'
- 118: 19, # 'v'
- 119: 65, # 'w'
- 120: 62, # 'x'
- 121: 16, # 'y'
- 122: 11, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 159, # '\x80'
- 129: 160, # '\x81'
- 130: 161, # '\x82'
- 131: 162, # '\x83'
- 132: 163, # '\x84'
- 133: 164, # '\x85'
- 134: 165, # '\x86'
- 135: 166, # '\x87'
- 136: 167, # '\x88'
- 137: 168, # '\x89'
- 138: 169, # '\x8a'
- 139: 170, # '\x8b'
- 140: 171, # '\x8c'
- 141: 172, # '\x8d'
- 142: 173, # '\x8e'
- 143: 174, # '\x8f'
- 144: 175, # '\x90'
- 145: 176, # '\x91'
- 146: 177, # '\x92'
- 147: 178, # '\x93'
- 148: 179, # '\x94'
- 149: 180, # '\x95'
- 150: 181, # '\x96'
- 151: 182, # '\x97'
- 152: 183, # '\x98'
- 153: 184, # '\x99'
- 154: 185, # '\x9a'
- 155: 186, # '\x9b'
- 156: 187, # '\x9c'
- 157: 188, # '\x9d'
- 158: 189, # '\x9e'
- 159: 190, # '\x9f'
- 160: 191, # '\xa0'
- 161: 192, # 'Ą'
- 162: 193, # '˘'
- 163: 194, # 'Ł'
- 164: 195, # '¤'
- 165: 196, # 'Ľ'
- 166: 197, # 'Ś'
- 167: 75, # '§'
- 168: 198, # '¨'
- 169: 199, # 'Š'
- 170: 200, # 'Ş'
- 171: 201, # 'Ť'
- 172: 202, # 'Ź'
- 173: 203, # '\xad'
- 174: 204, # 'Ž'
- 175: 205, # 'Ż'
- 176: 79, # '°'
- 177: 206, # 'ą'
- 178: 207, # '˛'
- 179: 208, # 'ł'
- 180: 209, # '´'
- 181: 210, # 'ľ'
- 182: 211, # 'ś'
- 183: 212, # 'ˇ'
- 184: 213, # '¸'
- 185: 214, # 'š'
- 186: 215, # 'ş'
- 187: 216, # 'ť'
- 188: 217, # 'ź'
- 189: 218, # '˝'
- 190: 219, # 'ž'
- 191: 220, # 'ż'
- 192: 221, # 'Ŕ'
- 193: 51, # 'Á'
- 194: 81, # 'Â'
- 195: 222, # 'Ă'
- 196: 78, # 'Ä'
- 197: 223, # 'Ĺ'
- 198: 224, # 'Ć'
- 199: 225, # 'Ç'
- 200: 226, # 'Č'
- 201: 44, # 'É'
- 202: 227, # 'Ę'
- 203: 228, # 'Ë'
- 204: 229, # 'Ě'
- 205: 61, # 'Í'
- 206: 230, # 'Î'
- 207: 231, # 'Ď'
- 208: 232, # 'Đ'
- 209: 233, # 'Ń'
- 210: 234, # 'Ň'
- 211: 58, # 'Ó'
- 212: 235, # 'Ô'
- 213: 66, # 'Ő'
- 214: 59, # 'Ö'
- 215: 236, # '×'
- 216: 237, # 'Ř'
- 217: 238, # 'Ů'
- 218: 60, # 'Ú'
- 219: 69, # 'Ű'
- 220: 63, # 'Ü'
- 221: 239, # 'Ý'
- 222: 240, # 'Ţ'
- 223: 241, # 'ß'
- 224: 82, # 'ŕ'
- 225: 14, # 'á'
- 226: 74, # 'â'
- 227: 242, # 'ă'
- 228: 70, # 'ä'
- 229: 80, # 'ĺ'
- 230: 243, # 'ć'
- 231: 72, # 'ç'
- 232: 244, # 'č'
- 233: 15, # 'é'
- 234: 83, # 'ę'
- 235: 77, # 'ë'
- 236: 84, # 'ě'
- 237: 30, # 'í'
- 238: 76, # 'î'
- 239: 85, # 'ď'
- 240: 245, # 'đ'
- 241: 246, # 'ń'
- 242: 247, # 'ň'
- 243: 25, # 'ó'
- 244: 73, # 'ô'
- 245: 42, # 'ő'
- 246: 24, # 'ö'
- 247: 248, # '÷'
- 248: 249, # 'ř'
- 249: 250, # 'ů'
- 250: 31, # 'ú'
- 251: 56, # 'ű'
- 252: 29, # 'ü'
- 253: 251, # 'ý'
- 254: 252, # 'ţ'
- 255: 253, # '˙'
-}
-
-ISO_8859_2_HUNGARIAN_MODEL = SingleByteCharSetModel(
- charset_name="ISO-8859-2",
- language="Hungarian",
- char_to_order_map=ISO_8859_2_HUNGARIAN_CHAR_TO_ORDER,
- language_model=HUNGARIAN_LANG_MODEL,
- typical_positive_ratio=0.947368,
- keep_ascii_letters=True,
- alphabet="ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnoprstuvzÁÉÍÓÖÚÜáéíóöúüŐőŰű",
-)
diff --git a/contrib/python/pip/pip/_vendor/chardet/langrussianmodel.py b/contrib/python/pip/pip/_vendor/chardet/langrussianmodel.py
deleted file mode 100644
index 39a5388948..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/langrussianmodel.py
+++ /dev/null
@@ -1,5725 +0,0 @@
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-RUSSIAN_LANG_MODEL = {
- 37: { # 'А'
- 37: 0, # 'А'
- 44: 1, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 1, # 'Ж'
- 51: 1, # 'З'
- 42: 1, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 2, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 1, # 'Ф'
- 55: 1, # 'Х'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 1, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 1, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 0, # 'е'
- 24: 1, # 'ж'
- 20: 1, # 'з'
- 4: 0, # 'и'
- 23: 1, # 'й'
- 11: 2, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 0, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'р'
- 7: 2, # 'с'
- 6: 2, # 'т'
- 14: 2, # 'у'
- 39: 2, # 'ф'
- 26: 2, # 'х'
- 28: 0, # 'ц'
- 22: 1, # 'ч'
- 25: 2, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 1, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 44: { # 'Б'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 1, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 2, # 'ы'
- 17: 1, # 'ь'
- 30: 2, # 'э'
- 27: 1, # 'ю'
- 16: 1, # 'я'
- },
- 33: { # 'В'
- 37: 2, # 'А'
- 44: 0, # 'Б'
- 33: 1, # 'В'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 1, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 2, # 'а'
- 21: 1, # 'б'
- 10: 1, # 'в'
- 19: 1, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 2, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'р'
- 7: 3, # 'с'
- 6: 2, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 1, # 'х'
- 28: 1, # 'ц'
- 22: 2, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 1, # 'ъ'
- 18: 3, # 'ы'
- 17: 1, # 'ь'
- 30: 2, # 'э'
- 27: 0, # 'ю'
- 16: 1, # 'я'
- },
- 46: { # 'Г'
- 37: 1, # 'А'
- 44: 1, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 2, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 1, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 1, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 0, # 'я'
- },
- 41: { # 'Д'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 1, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 2, # 'Е'
- 56: 1, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 2, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 3, # 'ж'
- 20: 1, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 1, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 1, # 'ы'
- 17: 1, # 'ь'
- 30: 2, # 'э'
- 27: 1, # 'ю'
- 16: 1, # 'я'
- },
- 48: { # 'Е'
- 37: 1, # 'А'
- 44: 1, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 1, # 'Ж'
- 51: 1, # 'З'
- 42: 1, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 2, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 2, # 'Р'
- 32: 2, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Х'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 1, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 0, # 'а'
- 21: 0, # 'б'
- 10: 2, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 2, # 'е'
- 24: 1, # 'ж'
- 20: 1, # 'з'
- 4: 0, # 'и'
- 23: 2, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 1, # 'н'
- 1: 0, # 'о'
- 15: 1, # 'п'
- 9: 1, # 'р'
- 7: 3, # 'с'
- 6: 0, # 'т'
- 14: 0, # 'у'
- 39: 1, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 2, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 1, # 'ю'
- 16: 0, # 'я'
- },
- 56: { # 'Ж'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 1, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 1, # 'б'
- 10: 0, # 'в'
- 19: 1, # 'г'
- 13: 1, # 'д'
- 2: 2, # 'е'
- 24: 1, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 1, # 'м'
- 5: 0, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 2, # 'ю'
- 16: 0, # 'я'
- },
- 51: { # 'З'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 0, # 'г'
- 13: 2, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 1, # 'л'
- 12: 1, # 'м'
- 5: 2, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 1, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 1, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 1, # 'я'
- },
- 42: { # 'И'
- 37: 1, # 'А'
- 44: 1, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 2, # 'Е'
- 56: 1, # 'Ж'
- 51: 1, # 'З'
- 42: 1, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Р'
- 32: 2, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 1, # 'Ф'
- 55: 1, # 'Х'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 1, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 2, # 'з'
- 4: 1, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 1, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'р'
- 7: 2, # 'с'
- 6: 2, # 'т'
- 14: 1, # 'у'
- 39: 1, # 'ф'
- 26: 2, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 1, # 'ю'
- 16: 0, # 'я'
- },
- 60: { # 'Й'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Х'
- 58: 1, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 1, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 0, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 0, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 36: { # 'К'
- 37: 2, # 'А'
- 44: 0, # 'Б'
- 33: 1, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 1, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 2, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 1, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 0, # 'м'
- 5: 1, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'р'
- 7: 2, # 'с'
- 6: 2, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 1, # 'ы'
- 17: 1, # 'ь'
- 30: 2, # 'э'
- 27: 1, # 'ю'
- 16: 0, # 'я'
- },
- 49: { # 'Л'
- 37: 2, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 1, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 1, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 0, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 0, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Э'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 1, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 1, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 1, # 'л'
- 12: 0, # 'м'
- 5: 1, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 1, # 'ы'
- 17: 1, # 'ь'
- 30: 2, # 'э'
- 27: 2, # 'ю'
- 16: 1, # 'я'
- },
- 38: { # 'М'
- 37: 1, # 'А'
- 44: 1, # 'Б'
- 33: 1, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 1, # 'Ф'
- 55: 1, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 0, # 'Ь'
- 47: 1, # 'Э'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 1, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 1, # 'л'
- 12: 1, # 'м'
- 5: 2, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'р'
- 7: 1, # 'с'
- 6: 0, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 3, # 'ы'
- 17: 1, # 'ь'
- 30: 2, # 'э'
- 27: 1, # 'ю'
- 16: 1, # 'я'
- },
- 31: { # 'Н'
- 37: 2, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 1, # 'З'
- 42: 2, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 1, # 'Ф'
- 55: 1, # 'Х'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 1, # 'Э'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 3, # 'у'
- 39: 0, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 1, # 'ы'
- 17: 2, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 1, # 'я'
- },
- 34: { # 'О'
- 37: 0, # 'А'
- 44: 1, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 2, # 'Д'
- 48: 1, # 'Е'
- 56: 1, # 'Ж'
- 51: 1, # 'З'
- 42: 1, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 2, # 'Л'
- 38: 1, # 'М'
- 31: 2, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 2, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 1, # 'Ф'
- 55: 1, # 'Х'
- 58: 0, # 'Ц'
- 50: 1, # 'Ч'
- 57: 1, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 1, # 'а'
- 21: 2, # 'б'
- 10: 1, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 0, # 'е'
- 24: 1, # 'ж'
- 20: 1, # 'з'
- 4: 0, # 'и'
- 23: 1, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 3, # 'н'
- 1: 0, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'р'
- 7: 2, # 'с'
- 6: 2, # 'т'
- 14: 1, # 'у'
- 39: 1, # 'ф'
- 26: 2, # 'х'
- 28: 1, # 'ц'
- 22: 2, # 'ч'
- 25: 2, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 35: { # 'П'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 2, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 0, # 'м'
- 5: 1, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 3, # 'р'
- 7: 1, # 'с'
- 6: 1, # 'т'
- 14: 2, # 'у'
- 39: 1, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 1, # 'ы'
- 17: 2, # 'ь'
- 30: 1, # 'э'
- 27: 0, # 'ю'
- 16: 2, # 'я'
- },
- 45: { # 'Р'
- 37: 2, # 'А'
- 44: 1, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 2, # 'Е'
- 56: 1, # 'Ж'
- 51: 0, # 'З'
- 42: 2, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 2, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Х'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 1, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 1, # 'Э'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 1, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 2, # 'ы'
- 17: 0, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 2, # 'я'
- },
- 32: { # 'С'
- 37: 1, # 'А'
- 44: 1, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 2, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Х'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 1, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 1, # 'Э'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 2, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 1, # 'ж'
- 20: 1, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 2, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'р'
- 7: 1, # 'с'
- 6: 3, # 'т'
- 14: 2, # 'у'
- 39: 1, # 'ф'
- 26: 1, # 'х'
- 28: 1, # 'ц'
- 22: 1, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 1, # 'ъ'
- 18: 1, # 'ы'
- 17: 1, # 'ь'
- 30: 2, # 'э'
- 27: 1, # 'ю'
- 16: 1, # 'я'
- },
- 40: { # 'Т'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 1, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 2, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 1, # 'Э'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 1, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'р'
- 7: 1, # 'с'
- 6: 0, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ъ'
- 18: 3, # 'ы'
- 17: 1, # 'ь'
- 30: 2, # 'э'
- 27: 1, # 'ю'
- 16: 1, # 'я'
- },
- 52: { # 'У'
- 37: 1, # 'А'
- 44: 1, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 1, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Х'
- 58: 0, # 'Ц'
- 50: 1, # 'Ч'
- 57: 1, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 1, # 'Ю'
- 43: 0, # 'Я'
- 3: 1, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 2, # 'д'
- 2: 1, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 2, # 'и'
- 23: 1, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 1, # 'н'
- 1: 2, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'р'
- 7: 2, # 'с'
- 6: 2, # 'т'
- 14: 0, # 'у'
- 39: 1, # 'ф'
- 26: 1, # 'х'
- 28: 1, # 'ц'
- 22: 2, # 'ч'
- 25: 1, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 2, # 'э'
- 27: 1, # 'ю'
- 16: 0, # 'я'
- },
- 53: { # 'Ф'
- 37: 1, # 'А'
- 44: 1, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'р'
- 7: 0, # 'с'
- 6: 1, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 1, # 'ь'
- 30: 2, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 55: { # 'Х'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 1, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 2, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 0, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 1, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 1, # 'ь'
- 30: 1, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 58: { # 'Ц'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 1, # 'а'
- 21: 0, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 0, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 1, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 1, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 1, # 'ю'
- 16: 0, # 'я'
- },
- 50: { # 'Ч'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 0, # 'О'
- 35: 1, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 1, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 1, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'р'
- 7: 0, # 'с'
- 6: 3, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 1, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 57: { # 'Ш'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 1, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 1, # 'н'
- 1: 2, # 'о'
- 15: 2, # 'п'
- 9: 1, # 'р'
- 7: 0, # 'с'
- 6: 2, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 1, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 63: { # 'Щ'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 1, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 1, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 1, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 1, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 1, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 62: { # 'Ы'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 0, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Х'
- 58: 1, # 'Ц'
- 50: 0, # 'Ч'
- 57: 1, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 0, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 0, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 0, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 0, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 61: { # 'Ь'
- 37: 0, # 'А'
- 44: 1, # 'Б'
- 33: 1, # 'В'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 0, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 1, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 1, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 1, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 0, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 0, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 0, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 0, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 0, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 47: { # 'Э'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 1, # 'В'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 0, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 1, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 2, # 'д'
- 2: 0, # 'е'
- 24: 1, # 'ж'
- 20: 0, # 'з'
- 4: 0, # 'и'
- 23: 2, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 0, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'р'
- 7: 1, # 'с'
- 6: 3, # 'т'
- 14: 1, # 'у'
- 39: 1, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 59: { # 'Ю'
- 37: 1, # 'А'
- 44: 1, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Р'
- 32: 0, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 1, # 'б'
- 10: 0, # 'в'
- 19: 1, # 'г'
- 13: 1, # 'д'
- 2: 0, # 'е'
- 24: 1, # 'ж'
- 20: 0, # 'з'
- 4: 0, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 2, # 'н'
- 1: 0, # 'о'
- 15: 1, # 'п'
- 9: 1, # 'р'
- 7: 1, # 'с'
- 6: 0, # 'т'
- 14: 0, # 'у'
- 39: 0, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 43: { # 'Я'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Х'
- 58: 0, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 0, # 'а'
- 21: 1, # 'б'
- 10: 1, # 'в'
- 19: 1, # 'г'
- 13: 1, # 'д'
- 2: 0, # 'е'
- 24: 0, # 'ж'
- 20: 1, # 'з'
- 4: 0, # 'и'
- 23: 1, # 'й'
- 11: 1, # 'к'
- 8: 1, # 'л'
- 12: 1, # 'м'
- 5: 2, # 'н'
- 1: 0, # 'о'
- 15: 1, # 'п'
- 9: 1, # 'р'
- 7: 1, # 'с'
- 6: 0, # 'т'
- 14: 0, # 'у'
- 39: 0, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 3: { # 'а'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 3, # 'з'
- 4: 3, # 'и'
- 23: 3, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 2, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 3, # 'у'
- 39: 2, # 'ф'
- 26: 3, # 'х'
- 28: 3, # 'ц'
- 22: 3, # 'ч'
- 25: 3, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 2, # 'э'
- 27: 3, # 'ю'
- 16: 3, # 'я'
- },
- 21: { # 'б'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 1, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 2, # 'т'
- 14: 3, # 'у'
- 39: 0, # 'ф'
- 26: 2, # 'х'
- 28: 1, # 'ц'
- 22: 1, # 'ч'
- 25: 2, # 'ш'
- 29: 3, # 'щ'
- 54: 2, # 'ъ'
- 18: 3, # 'ы'
- 17: 2, # 'ь'
- 30: 1, # 'э'
- 27: 2, # 'ю'
- 16: 3, # 'я'
- },
- 10: { # 'в'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 2, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 1, # 'ж'
- 20: 3, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 3, # 'у'
- 39: 1, # 'ф'
- 26: 2, # 'х'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 3, # 'ш'
- 29: 2, # 'щ'
- 54: 2, # 'ъ'
- 18: 3, # 'ы'
- 17: 3, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 3, # 'я'
- },
- 19: { # 'г'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 3, # 'р'
- 7: 2, # 'с'
- 6: 2, # 'т'
- 14: 3, # 'у'
- 39: 1, # 'ф'
- 26: 1, # 'х'
- 28: 1, # 'ц'
- 22: 2, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 1, # 'ы'
- 17: 1, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 0, # 'я'
- },
- 13: { # 'д'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 3, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 3, # 'у'
- 39: 1, # 'ф'
- 26: 2, # 'х'
- 28: 3, # 'ц'
- 22: 2, # 'ч'
- 25: 2, # 'ш'
- 29: 1, # 'щ'
- 54: 2, # 'ъ'
- 18: 3, # 'ы'
- 17: 3, # 'ь'
- 30: 1, # 'э'
- 27: 2, # 'ю'
- 16: 3, # 'я'
- },
- 2: { # 'е'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 3, # 'з'
- 4: 2, # 'и'
- 23: 3, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 2, # 'у'
- 39: 2, # 'ф'
- 26: 3, # 'х'
- 28: 3, # 'ц'
- 22: 3, # 'ч'
- 25: 3, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 1, # 'э'
- 27: 2, # 'ю'
- 16: 3, # 'я'
- },
- 24: { # 'ж'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 1, # 'в'
- 19: 2, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 3, # 'н'
- 1: 2, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'р'
- 7: 2, # 'с'
- 6: 1, # 'т'
- 14: 3, # 'у'
- 39: 1, # 'ф'
- 26: 0, # 'х'
- 28: 1, # 'ц'
- 22: 2, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 1, # 'ы'
- 17: 2, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 1, # 'я'
- },
- 20: { # 'з'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 3, # 'р'
- 7: 2, # 'с'
- 6: 2, # 'т'
- 14: 3, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 1, # 'ц'
- 22: 2, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 2, # 'ъ'
- 18: 3, # 'ы'
- 17: 2, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 3, # 'я'
- },
- 4: { # 'и'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 3, # 'з'
- 4: 3, # 'и'
- 23: 3, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 2, # 'у'
- 39: 2, # 'ф'
- 26: 3, # 'х'
- 28: 3, # 'ц'
- 22: 3, # 'ч'
- 25: 3, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 2, # 'э'
- 27: 3, # 'ю'
- 16: 3, # 'я'
- },
- 23: { # 'й'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 1, # 'а'
- 21: 1, # 'б'
- 10: 1, # 'в'
- 19: 2, # 'г'
- 13: 3, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 2, # 'з'
- 4: 1, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 2, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 1, # 'у'
- 39: 2, # 'ф'
- 26: 1, # 'х'
- 28: 2, # 'ц'
- 22: 3, # 'ч'
- 25: 2, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 2, # 'я'
- },
- 11: { # 'к'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 3, # 'в'
- 19: 1, # 'г'
- 13: 1, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 3, # 'л'
- 12: 1, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 3, # 'у'
- 39: 1, # 'ф'
- 26: 2, # 'х'
- 28: 2, # 'ц'
- 22: 1, # 'ч'
- 25: 2, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 1, # 'ы'
- 17: 1, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 1, # 'я'
- },
- 8: { # 'л'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 3, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 1, # 'р'
- 7: 3, # 'с'
- 6: 2, # 'т'
- 14: 3, # 'у'
- 39: 2, # 'ф'
- 26: 2, # 'х'
- 28: 1, # 'ц'
- 22: 3, # 'ч'
- 25: 2, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ъ'
- 18: 3, # 'ы'
- 17: 3, # 'ь'
- 30: 1, # 'э'
- 27: 3, # 'ю'
- 16: 3, # 'я'
- },
- 12: { # 'м'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 2, # 'г'
- 13: 1, # 'д'
- 2: 3, # 'е'
- 24: 1, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'р'
- 7: 3, # 'с'
- 6: 2, # 'т'
- 14: 3, # 'у'
- 39: 2, # 'ф'
- 26: 2, # 'х'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 1, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ъ'
- 18: 3, # 'ы'
- 17: 2, # 'ь'
- 30: 2, # 'э'
- 27: 1, # 'ю'
- 16: 3, # 'я'
- },
- 5: { # 'н'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 3, # 'у'
- 39: 2, # 'ф'
- 26: 2, # 'х'
- 28: 3, # 'ц'
- 22: 3, # 'ч'
- 25: 2, # 'ш'
- 29: 2, # 'щ'
- 54: 1, # 'ъ'
- 18: 3, # 'ы'
- 17: 3, # 'ь'
- 30: 1, # 'э'
- 27: 3, # 'ю'
- 16: 3, # 'я'
- },
- 1: { # 'о'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 3, # 'з'
- 4: 3, # 'и'
- 23: 3, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 2, # 'у'
- 39: 2, # 'ф'
- 26: 3, # 'х'
- 28: 2, # 'ц'
- 22: 3, # 'ч'
- 25: 3, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 2, # 'э'
- 27: 3, # 'ю'
- 16: 3, # 'я'
- },
- 15: { # 'п'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 3, # 'л'
- 12: 1, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 3, # 'р'
- 7: 2, # 'с'
- 6: 2, # 'т'
- 14: 3, # 'у'
- 39: 1, # 'ф'
- 26: 0, # 'х'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 1, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ъ'
- 18: 3, # 'ы'
- 17: 2, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 3, # 'я'
- },
- 9: { # 'р'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 2, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 3, # 'у'
- 39: 2, # 'ф'
- 26: 3, # 'х'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 3, # 'ш'
- 29: 2, # 'щ'
- 54: 0, # 'ъ'
- 18: 3, # 'ы'
- 17: 3, # 'ь'
- 30: 2, # 'э'
- 27: 2, # 'ю'
- 16: 3, # 'я'
- },
- 7: { # 'с'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 1, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 3, # 'в'
- 19: 2, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 3, # 'у'
- 39: 2, # 'ф'
- 26: 3, # 'х'
- 28: 2, # 'ц'
- 22: 3, # 'ч'
- 25: 2, # 'ш'
- 29: 1, # 'щ'
- 54: 2, # 'ъ'
- 18: 3, # 'ы'
- 17: 3, # 'ь'
- 30: 2, # 'э'
- 27: 3, # 'ю'
- 16: 3, # 'я'
- },
- 6: { # 'т'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 3, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 1, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 2, # 'т'
- 14: 3, # 'у'
- 39: 2, # 'ф'
- 26: 2, # 'х'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 2, # 'ш'
- 29: 2, # 'щ'
- 54: 2, # 'ъ'
- 18: 3, # 'ы'
- 17: 3, # 'ь'
- 30: 2, # 'э'
- 27: 2, # 'ю'
- 16: 3, # 'я'
- },
- 14: { # 'у'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 3, # 'з'
- 4: 2, # 'и'
- 23: 2, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 2, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 1, # 'у'
- 39: 2, # 'ф'
- 26: 3, # 'х'
- 28: 2, # 'ц'
- 22: 3, # 'ч'
- 25: 3, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 2, # 'э'
- 27: 3, # 'ю'
- 16: 2, # 'я'
- },
- 39: { # 'ф'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 0, # 'в'
- 19: 1, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 1, # 'н'
- 1: 3, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'р'
- 7: 2, # 'с'
- 6: 2, # 'т'
- 14: 2, # 'у'
- 39: 2, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 1, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 2, # 'ы'
- 17: 1, # 'ь'
- 30: 2, # 'э'
- 27: 1, # 'ю'
- 16: 1, # 'я'
- },
- 26: { # 'х'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 3, # 'в'
- 19: 1, # 'г'
- 13: 1, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 1, # 'п'
- 9: 3, # 'р'
- 7: 2, # 'с'
- 6: 2, # 'т'
- 14: 2, # 'у'
- 39: 1, # 'ф'
- 26: 1, # 'х'
- 28: 1, # 'ц'
- 22: 1, # 'ч'
- 25: 2, # 'ш'
- 29: 0, # 'щ'
- 54: 1, # 'ъ'
- 18: 0, # 'ы'
- 17: 1, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 0, # 'я'
- },
- 28: { # 'ц'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 1, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 1, # 'л'
- 12: 1, # 'м'
- 5: 1, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'р'
- 7: 0, # 'с'
- 6: 1, # 'т'
- 14: 3, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 1, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 3, # 'ы'
- 17: 1, # 'ь'
- 30: 0, # 'э'
- 27: 1, # 'ю'
- 16: 0, # 'я'
- },
- 22: { # 'ч'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 1, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 3, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'р'
- 7: 1, # 'с'
- 6: 3, # 'т'
- 14: 3, # 'у'
- 39: 1, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 1, # 'ч'
- 25: 2, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 3, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 25: { # 'ш'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'р'
- 7: 1, # 'с'
- 6: 2, # 'т'
- 14: 3, # 'у'
- 39: 2, # 'ф'
- 26: 1, # 'х'
- 28: 1, # 'ц'
- 22: 1, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 3, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 0, # 'я'
- },
- 29: { # 'щ'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 1, # 'м'
- 5: 2, # 'н'
- 1: 1, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 2, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 54: { # 'ъ'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 0, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 0, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 0, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 1, # 'ю'
- 16: 2, # 'я'
- },
- 18: { # 'ы'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 2, # 'и'
- 23: 3, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 1, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 1, # 'у'
- 39: 0, # 'ф'
- 26: 3, # 'х'
- 28: 2, # 'ц'
- 22: 3, # 'ч'
- 25: 3, # 'ш'
- 29: 2, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 2, # 'я'
- },
- 17: { # 'ь'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 1, # 'ж'
- 20: 3, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 0, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 2, # 'о'
- 15: 2, # 'п'
- 9: 1, # 'р'
- 7: 3, # 'с'
- 6: 2, # 'т'
- 14: 0, # 'у'
- 39: 2, # 'ф'
- 26: 1, # 'х'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 3, # 'ш'
- 29: 2, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 1, # 'э'
- 27: 3, # 'ю'
- 16: 3, # 'я'
- },
- 30: { # 'э'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 1, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 1, # 'б'
- 10: 1, # 'в'
- 19: 1, # 'г'
- 13: 2, # 'д'
- 2: 1, # 'е'
- 24: 0, # 'ж'
- 20: 1, # 'з'
- 4: 0, # 'и'
- 23: 2, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 0, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'р'
- 7: 2, # 'с'
- 6: 3, # 'т'
- 14: 1, # 'у'
- 39: 2, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 1, # 'я'
- },
- 27: { # 'ю'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 3, # 'б'
- 10: 1, # 'в'
- 19: 2, # 'г'
- 13: 3, # 'д'
- 2: 1, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 1, # 'и'
- 23: 1, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 1, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 0, # 'у'
- 39: 1, # 'ф'
- 26: 2, # 'х'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 2, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 1, # 'э'
- 27: 2, # 'ю'
- 16: 1, # 'я'
- },
- 16: { # 'я'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 2, # 'б'
- 10: 3, # 'в'
- 19: 2, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 3, # 'з'
- 4: 2, # 'и'
- 23: 2, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 0, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 1, # 'у'
- 39: 1, # 'ф'
- 26: 3, # 'х'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 2, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 2, # 'ю'
- 16: 2, # 'я'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-IBM866_RUSSIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 142, # 'A'
- 66: 143, # 'B'
- 67: 144, # 'C'
- 68: 145, # 'D'
- 69: 146, # 'E'
- 70: 147, # 'F'
- 71: 148, # 'G'
- 72: 149, # 'H'
- 73: 150, # 'I'
- 74: 151, # 'J'
- 75: 152, # 'K'
- 76: 74, # 'L'
- 77: 153, # 'M'
- 78: 75, # 'N'
- 79: 154, # 'O'
- 80: 155, # 'P'
- 81: 156, # 'Q'
- 82: 157, # 'R'
- 83: 158, # 'S'
- 84: 159, # 'T'
- 85: 160, # 'U'
- 86: 161, # 'V'
- 87: 162, # 'W'
- 88: 163, # 'X'
- 89: 164, # 'Y'
- 90: 165, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 71, # 'a'
- 98: 172, # 'b'
- 99: 66, # 'c'
- 100: 173, # 'd'
- 101: 65, # 'e'
- 102: 174, # 'f'
- 103: 76, # 'g'
- 104: 175, # 'h'
- 105: 64, # 'i'
- 106: 176, # 'j'
- 107: 177, # 'k'
- 108: 77, # 'l'
- 109: 72, # 'm'
- 110: 178, # 'n'
- 111: 69, # 'o'
- 112: 67, # 'p'
- 113: 179, # 'q'
- 114: 78, # 'r'
- 115: 73, # 's'
- 116: 180, # 't'
- 117: 181, # 'u'
- 118: 79, # 'v'
- 119: 182, # 'w'
- 120: 183, # 'x'
- 121: 184, # 'y'
- 122: 185, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 37, # 'А'
- 129: 44, # 'Б'
- 130: 33, # 'В'
- 131: 46, # 'Г'
- 132: 41, # 'Д'
- 133: 48, # 'Е'
- 134: 56, # 'Ж'
- 135: 51, # 'З'
- 136: 42, # 'И'
- 137: 60, # 'Й'
- 138: 36, # 'К'
- 139: 49, # 'Л'
- 140: 38, # 'М'
- 141: 31, # 'Н'
- 142: 34, # 'О'
- 143: 35, # 'П'
- 144: 45, # 'Р'
- 145: 32, # 'С'
- 146: 40, # 'Т'
- 147: 52, # 'У'
- 148: 53, # 'Ф'
- 149: 55, # 'Х'
- 150: 58, # 'Ц'
- 151: 50, # 'Ч'
- 152: 57, # 'Ш'
- 153: 63, # 'Щ'
- 154: 70, # 'Ъ'
- 155: 62, # 'Ы'
- 156: 61, # 'Ь'
- 157: 47, # 'Э'
- 158: 59, # 'Ю'
- 159: 43, # 'Я'
- 160: 3, # 'а'
- 161: 21, # 'б'
- 162: 10, # 'в'
- 163: 19, # 'г'
- 164: 13, # 'д'
- 165: 2, # 'е'
- 166: 24, # 'ж'
- 167: 20, # 'з'
- 168: 4, # 'и'
- 169: 23, # 'й'
- 170: 11, # 'к'
- 171: 8, # 'л'
- 172: 12, # 'м'
- 173: 5, # 'н'
- 174: 1, # 'о'
- 175: 15, # 'п'
- 176: 191, # '░'
- 177: 192, # '▒'
- 178: 193, # '▓'
- 179: 194, # '│'
- 180: 195, # '┤'
- 181: 196, # '╡'
- 182: 197, # '╢'
- 183: 198, # '╖'
- 184: 199, # '╕'
- 185: 200, # '╣'
- 186: 201, # '║'
- 187: 202, # '╗'
- 188: 203, # '╝'
- 189: 204, # '╜'
- 190: 205, # '╛'
- 191: 206, # '┐'
- 192: 207, # '└'
- 193: 208, # '┴'
- 194: 209, # '┬'
- 195: 210, # '├'
- 196: 211, # '─'
- 197: 212, # '┼'
- 198: 213, # '╞'
- 199: 214, # '╟'
- 200: 215, # '╚'
- 201: 216, # '╔'
- 202: 217, # '╩'
- 203: 218, # '╦'
- 204: 219, # '╠'
- 205: 220, # '═'
- 206: 221, # '╬'
- 207: 222, # '╧'
- 208: 223, # '╨'
- 209: 224, # '╤'
- 210: 225, # '╥'
- 211: 226, # '╙'
- 212: 227, # '╘'
- 213: 228, # '╒'
- 214: 229, # '╓'
- 215: 230, # '╫'
- 216: 231, # '╪'
- 217: 232, # '┘'
- 218: 233, # '┌'
- 219: 234, # '█'
- 220: 235, # '▄'
- 221: 236, # '▌'
- 222: 237, # '▐'
- 223: 238, # '▀'
- 224: 9, # 'р'
- 225: 7, # 'с'
- 226: 6, # 'т'
- 227: 14, # 'у'
- 228: 39, # 'ф'
- 229: 26, # 'х'
- 230: 28, # 'ц'
- 231: 22, # 'ч'
- 232: 25, # 'ш'
- 233: 29, # 'щ'
- 234: 54, # 'ъ'
- 235: 18, # 'ы'
- 236: 17, # 'ь'
- 237: 30, # 'э'
- 238: 27, # 'ю'
- 239: 16, # 'я'
- 240: 239, # 'Ё'
- 241: 68, # 'ё'
- 242: 240, # 'Є'
- 243: 241, # 'є'
- 244: 242, # 'Ї'
- 245: 243, # 'ї'
- 246: 244, # 'Ў'
- 247: 245, # 'ў'
- 248: 246, # '°'
- 249: 247, # '∙'
- 250: 248, # '·'
- 251: 249, # '√'
- 252: 250, # '№'
- 253: 251, # '¤'
- 254: 252, # '■'
- 255: 255, # '\xa0'
-}
-
-IBM866_RUSSIAN_MODEL = SingleByteCharSetModel(
- charset_name="IBM866",
- language="Russian",
- char_to_order_map=IBM866_RUSSIAN_CHAR_TO_ORDER,
- language_model=RUSSIAN_LANG_MODEL,
- typical_positive_ratio=0.976601,
- keep_ascii_letters=False,
- alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё",
-)
-
-WINDOWS_1251_RUSSIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 142, # 'A'
- 66: 143, # 'B'
- 67: 144, # 'C'
- 68: 145, # 'D'
- 69: 146, # 'E'
- 70: 147, # 'F'
- 71: 148, # 'G'
- 72: 149, # 'H'
- 73: 150, # 'I'
- 74: 151, # 'J'
- 75: 152, # 'K'
- 76: 74, # 'L'
- 77: 153, # 'M'
- 78: 75, # 'N'
- 79: 154, # 'O'
- 80: 155, # 'P'
- 81: 156, # 'Q'
- 82: 157, # 'R'
- 83: 158, # 'S'
- 84: 159, # 'T'
- 85: 160, # 'U'
- 86: 161, # 'V'
- 87: 162, # 'W'
- 88: 163, # 'X'
- 89: 164, # 'Y'
- 90: 165, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 71, # 'a'
- 98: 172, # 'b'
- 99: 66, # 'c'
- 100: 173, # 'd'
- 101: 65, # 'e'
- 102: 174, # 'f'
- 103: 76, # 'g'
- 104: 175, # 'h'
- 105: 64, # 'i'
- 106: 176, # 'j'
- 107: 177, # 'k'
- 108: 77, # 'l'
- 109: 72, # 'm'
- 110: 178, # 'n'
- 111: 69, # 'o'
- 112: 67, # 'p'
- 113: 179, # 'q'
- 114: 78, # 'r'
- 115: 73, # 's'
- 116: 180, # 't'
- 117: 181, # 'u'
- 118: 79, # 'v'
- 119: 182, # 'w'
- 120: 183, # 'x'
- 121: 184, # 'y'
- 122: 185, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 191, # 'Ђ'
- 129: 192, # 'Ѓ'
- 130: 193, # '‚'
- 131: 194, # 'ѓ'
- 132: 195, # '„'
- 133: 196, # '…'
- 134: 197, # '†'
- 135: 198, # '‡'
- 136: 199, # '€'
- 137: 200, # '‰'
- 138: 201, # 'Љ'
- 139: 202, # '‹'
- 140: 203, # 'Њ'
- 141: 204, # 'Ќ'
- 142: 205, # 'Ћ'
- 143: 206, # 'Џ'
- 144: 207, # 'ђ'
- 145: 208, # '‘'
- 146: 209, # '’'
- 147: 210, # '“'
- 148: 211, # '”'
- 149: 212, # '•'
- 150: 213, # '–'
- 151: 214, # '—'
- 152: 215, # None
- 153: 216, # '™'
- 154: 217, # 'љ'
- 155: 218, # '›'
- 156: 219, # 'њ'
- 157: 220, # 'ќ'
- 158: 221, # 'ћ'
- 159: 222, # 'џ'
- 160: 223, # '\xa0'
- 161: 224, # 'Ў'
- 162: 225, # 'ў'
- 163: 226, # 'Ј'
- 164: 227, # '¤'
- 165: 228, # 'Ґ'
- 166: 229, # '¦'
- 167: 230, # '§'
- 168: 231, # 'Ё'
- 169: 232, # '©'
- 170: 233, # 'Є'
- 171: 234, # '«'
- 172: 235, # '¬'
- 173: 236, # '\xad'
- 174: 237, # '®'
- 175: 238, # 'Ї'
- 176: 239, # '°'
- 177: 240, # '±'
- 178: 241, # 'І'
- 179: 242, # 'і'
- 180: 243, # 'ґ'
- 181: 244, # 'µ'
- 182: 245, # '¶'
- 183: 246, # '·'
- 184: 68, # 'ё'
- 185: 247, # '№'
- 186: 248, # 'є'
- 187: 249, # '»'
- 188: 250, # 'ј'
- 189: 251, # 'Ѕ'
- 190: 252, # 'ѕ'
- 191: 253, # 'ї'
- 192: 37, # 'А'
- 193: 44, # 'Б'
- 194: 33, # 'В'
- 195: 46, # 'Г'
- 196: 41, # 'Д'
- 197: 48, # 'Е'
- 198: 56, # 'Ж'
- 199: 51, # 'З'
- 200: 42, # 'И'
- 201: 60, # 'Й'
- 202: 36, # 'К'
- 203: 49, # 'Л'
- 204: 38, # 'М'
- 205: 31, # 'Н'
- 206: 34, # 'О'
- 207: 35, # 'П'
- 208: 45, # 'Р'
- 209: 32, # 'С'
- 210: 40, # 'Т'
- 211: 52, # 'У'
- 212: 53, # 'Ф'
- 213: 55, # 'Х'
- 214: 58, # 'Ц'
- 215: 50, # 'Ч'
- 216: 57, # 'Ш'
- 217: 63, # 'Щ'
- 218: 70, # 'Ъ'
- 219: 62, # 'Ы'
- 220: 61, # 'Ь'
- 221: 47, # 'Э'
- 222: 59, # 'Ю'
- 223: 43, # 'Я'
- 224: 3, # 'а'
- 225: 21, # 'б'
- 226: 10, # 'в'
- 227: 19, # 'г'
- 228: 13, # 'д'
- 229: 2, # 'е'
- 230: 24, # 'ж'
- 231: 20, # 'з'
- 232: 4, # 'и'
- 233: 23, # 'й'
- 234: 11, # 'к'
- 235: 8, # 'л'
- 236: 12, # 'м'
- 237: 5, # 'н'
- 238: 1, # 'о'
- 239: 15, # 'п'
- 240: 9, # 'р'
- 241: 7, # 'с'
- 242: 6, # 'т'
- 243: 14, # 'у'
- 244: 39, # 'ф'
- 245: 26, # 'х'
- 246: 28, # 'ц'
- 247: 22, # 'ч'
- 248: 25, # 'ш'
- 249: 29, # 'щ'
- 250: 54, # 'ъ'
- 251: 18, # 'ы'
- 252: 17, # 'ь'
- 253: 30, # 'э'
- 254: 27, # 'ю'
- 255: 16, # 'я'
-}
-
-WINDOWS_1251_RUSSIAN_MODEL = SingleByteCharSetModel(
- charset_name="windows-1251",
- language="Russian",
- char_to_order_map=WINDOWS_1251_RUSSIAN_CHAR_TO_ORDER,
- language_model=RUSSIAN_LANG_MODEL,
- typical_positive_ratio=0.976601,
- keep_ascii_letters=False,
- alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё",
-)
-
-IBM855_RUSSIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 142, # 'A'
- 66: 143, # 'B'
- 67: 144, # 'C'
- 68: 145, # 'D'
- 69: 146, # 'E'
- 70: 147, # 'F'
- 71: 148, # 'G'
- 72: 149, # 'H'
- 73: 150, # 'I'
- 74: 151, # 'J'
- 75: 152, # 'K'
- 76: 74, # 'L'
- 77: 153, # 'M'
- 78: 75, # 'N'
- 79: 154, # 'O'
- 80: 155, # 'P'
- 81: 156, # 'Q'
- 82: 157, # 'R'
- 83: 158, # 'S'
- 84: 159, # 'T'
- 85: 160, # 'U'
- 86: 161, # 'V'
- 87: 162, # 'W'
- 88: 163, # 'X'
- 89: 164, # 'Y'
- 90: 165, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 71, # 'a'
- 98: 172, # 'b'
- 99: 66, # 'c'
- 100: 173, # 'd'
- 101: 65, # 'e'
- 102: 174, # 'f'
- 103: 76, # 'g'
- 104: 175, # 'h'
- 105: 64, # 'i'
- 106: 176, # 'j'
- 107: 177, # 'k'
- 108: 77, # 'l'
- 109: 72, # 'm'
- 110: 178, # 'n'
- 111: 69, # 'o'
- 112: 67, # 'p'
- 113: 179, # 'q'
- 114: 78, # 'r'
- 115: 73, # 's'
- 116: 180, # 't'
- 117: 181, # 'u'
- 118: 79, # 'v'
- 119: 182, # 'w'
- 120: 183, # 'x'
- 121: 184, # 'y'
- 122: 185, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 191, # 'ђ'
- 129: 192, # 'Ђ'
- 130: 193, # 'ѓ'
- 131: 194, # 'Ѓ'
- 132: 68, # 'ё'
- 133: 195, # 'Ё'
- 134: 196, # 'є'
- 135: 197, # 'Є'
- 136: 198, # 'ѕ'
- 137: 199, # 'Ѕ'
- 138: 200, # 'і'
- 139: 201, # 'І'
- 140: 202, # 'ї'
- 141: 203, # 'Ї'
- 142: 204, # 'ј'
- 143: 205, # 'Ј'
- 144: 206, # 'љ'
- 145: 207, # 'Љ'
- 146: 208, # 'њ'
- 147: 209, # 'Њ'
- 148: 210, # 'ћ'
- 149: 211, # 'Ћ'
- 150: 212, # 'ќ'
- 151: 213, # 'Ќ'
- 152: 214, # 'ў'
- 153: 215, # 'Ў'
- 154: 216, # 'џ'
- 155: 217, # 'Џ'
- 156: 27, # 'ю'
- 157: 59, # 'Ю'
- 158: 54, # 'ъ'
- 159: 70, # 'Ъ'
- 160: 3, # 'а'
- 161: 37, # 'А'
- 162: 21, # 'б'
- 163: 44, # 'Б'
- 164: 28, # 'ц'
- 165: 58, # 'Ц'
- 166: 13, # 'д'
- 167: 41, # 'Д'
- 168: 2, # 'е'
- 169: 48, # 'Е'
- 170: 39, # 'ф'
- 171: 53, # 'Ф'
- 172: 19, # 'г'
- 173: 46, # 'Г'
- 174: 218, # '«'
- 175: 219, # '»'
- 176: 220, # '░'
- 177: 221, # '▒'
- 178: 222, # '▓'
- 179: 223, # '│'
- 180: 224, # '┤'
- 181: 26, # 'х'
- 182: 55, # 'Х'
- 183: 4, # 'и'
- 184: 42, # 'И'
- 185: 225, # '╣'
- 186: 226, # '║'
- 187: 227, # '╗'
- 188: 228, # '╝'
- 189: 23, # 'й'
- 190: 60, # 'Й'
- 191: 229, # '┐'
- 192: 230, # '└'
- 193: 231, # '┴'
- 194: 232, # '┬'
- 195: 233, # '├'
- 196: 234, # '─'
- 197: 235, # '┼'
- 198: 11, # 'к'
- 199: 36, # 'К'
- 200: 236, # '╚'
- 201: 237, # '╔'
- 202: 238, # '╩'
- 203: 239, # '╦'
- 204: 240, # '╠'
- 205: 241, # '═'
- 206: 242, # '╬'
- 207: 243, # '¤'
- 208: 8, # 'л'
- 209: 49, # 'Л'
- 210: 12, # 'м'
- 211: 38, # 'М'
- 212: 5, # 'н'
- 213: 31, # 'Н'
- 214: 1, # 'о'
- 215: 34, # 'О'
- 216: 15, # 'п'
- 217: 244, # '┘'
- 218: 245, # '┌'
- 219: 246, # '█'
- 220: 247, # '▄'
- 221: 35, # 'П'
- 222: 16, # 'я'
- 223: 248, # '▀'
- 224: 43, # 'Я'
- 225: 9, # 'р'
- 226: 45, # 'Р'
- 227: 7, # 'с'
- 228: 32, # 'С'
- 229: 6, # 'т'
- 230: 40, # 'Т'
- 231: 14, # 'у'
- 232: 52, # 'У'
- 233: 24, # 'ж'
- 234: 56, # 'Ж'
- 235: 10, # 'в'
- 236: 33, # 'В'
- 237: 17, # 'ь'
- 238: 61, # 'Ь'
- 239: 249, # '№'
- 240: 250, # '\xad'
- 241: 18, # 'ы'
- 242: 62, # 'Ы'
- 243: 20, # 'з'
- 244: 51, # 'З'
- 245: 25, # 'ш'
- 246: 57, # 'Ш'
- 247: 30, # 'э'
- 248: 47, # 'Э'
- 249: 29, # 'щ'
- 250: 63, # 'Щ'
- 251: 22, # 'ч'
- 252: 50, # 'Ч'
- 253: 251, # '§'
- 254: 252, # '■'
- 255: 255, # '\xa0'
-}
-
-IBM855_RUSSIAN_MODEL = SingleByteCharSetModel(
- charset_name="IBM855",
- language="Russian",
- char_to_order_map=IBM855_RUSSIAN_CHAR_TO_ORDER,
- language_model=RUSSIAN_LANG_MODEL,
- typical_positive_ratio=0.976601,
- keep_ascii_letters=False,
- alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё",
-)
-
-KOI8_R_RUSSIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 142, # 'A'
- 66: 143, # 'B'
- 67: 144, # 'C'
- 68: 145, # 'D'
- 69: 146, # 'E'
- 70: 147, # 'F'
- 71: 148, # 'G'
- 72: 149, # 'H'
- 73: 150, # 'I'
- 74: 151, # 'J'
- 75: 152, # 'K'
- 76: 74, # 'L'
- 77: 153, # 'M'
- 78: 75, # 'N'
- 79: 154, # 'O'
- 80: 155, # 'P'
- 81: 156, # 'Q'
- 82: 157, # 'R'
- 83: 158, # 'S'
- 84: 159, # 'T'
- 85: 160, # 'U'
- 86: 161, # 'V'
- 87: 162, # 'W'
- 88: 163, # 'X'
- 89: 164, # 'Y'
- 90: 165, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 71, # 'a'
- 98: 172, # 'b'
- 99: 66, # 'c'
- 100: 173, # 'd'
- 101: 65, # 'e'
- 102: 174, # 'f'
- 103: 76, # 'g'
- 104: 175, # 'h'
- 105: 64, # 'i'
- 106: 176, # 'j'
- 107: 177, # 'k'
- 108: 77, # 'l'
- 109: 72, # 'm'
- 110: 178, # 'n'
- 111: 69, # 'o'
- 112: 67, # 'p'
- 113: 179, # 'q'
- 114: 78, # 'r'
- 115: 73, # 's'
- 116: 180, # 't'
- 117: 181, # 'u'
- 118: 79, # 'v'
- 119: 182, # 'w'
- 120: 183, # 'x'
- 121: 184, # 'y'
- 122: 185, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 191, # '─'
- 129: 192, # '│'
- 130: 193, # '┌'
- 131: 194, # '┐'
- 132: 195, # '└'
- 133: 196, # '┘'
- 134: 197, # '├'
- 135: 198, # '┤'
- 136: 199, # '┬'
- 137: 200, # '┴'
- 138: 201, # '┼'
- 139: 202, # '▀'
- 140: 203, # '▄'
- 141: 204, # '█'
- 142: 205, # '▌'
- 143: 206, # '▐'
- 144: 207, # '░'
- 145: 208, # '▒'
- 146: 209, # '▓'
- 147: 210, # '⌠'
- 148: 211, # '■'
- 149: 212, # '∙'
- 150: 213, # '√'
- 151: 214, # '≈'
- 152: 215, # '≤'
- 153: 216, # '≥'
- 154: 217, # '\xa0'
- 155: 218, # '⌡'
- 156: 219, # '°'
- 157: 220, # '²'
- 158: 221, # '·'
- 159: 222, # '÷'
- 160: 223, # '═'
- 161: 224, # '║'
- 162: 225, # '╒'
- 163: 68, # 'ё'
- 164: 226, # '╓'
- 165: 227, # '╔'
- 166: 228, # '╕'
- 167: 229, # '╖'
- 168: 230, # '╗'
- 169: 231, # '╘'
- 170: 232, # '╙'
- 171: 233, # '╚'
- 172: 234, # '╛'
- 173: 235, # '╜'
- 174: 236, # '╝'
- 175: 237, # '╞'
- 176: 238, # '╟'
- 177: 239, # '╠'
- 178: 240, # '╡'
- 179: 241, # 'Ё'
- 180: 242, # '╢'
- 181: 243, # '╣'
- 182: 244, # '╤'
- 183: 245, # '╥'
- 184: 246, # '╦'
- 185: 247, # '╧'
- 186: 248, # '╨'
- 187: 249, # '╩'
- 188: 250, # '╪'
- 189: 251, # '╫'
- 190: 252, # '╬'
- 191: 253, # '©'
- 192: 27, # 'ю'
- 193: 3, # 'а'
- 194: 21, # 'б'
- 195: 28, # 'ц'
- 196: 13, # 'д'
- 197: 2, # 'е'
- 198: 39, # 'ф'
- 199: 19, # 'г'
- 200: 26, # 'х'
- 201: 4, # 'и'
- 202: 23, # 'й'
- 203: 11, # 'к'
- 204: 8, # 'л'
- 205: 12, # 'м'
- 206: 5, # 'н'
- 207: 1, # 'о'
- 208: 15, # 'п'
- 209: 16, # 'я'
- 210: 9, # 'р'
- 211: 7, # 'с'
- 212: 6, # 'т'
- 213: 14, # 'у'
- 214: 24, # 'ж'
- 215: 10, # 'в'
- 216: 17, # 'ь'
- 217: 18, # 'ы'
- 218: 20, # 'з'
- 219: 25, # 'ш'
- 220: 30, # 'э'
- 221: 29, # 'щ'
- 222: 22, # 'ч'
- 223: 54, # 'ъ'
- 224: 59, # 'Ю'
- 225: 37, # 'А'
- 226: 44, # 'Б'
- 227: 58, # 'Ц'
- 228: 41, # 'Д'
- 229: 48, # 'Е'
- 230: 53, # 'Ф'
- 231: 46, # 'Г'
- 232: 55, # 'Х'
- 233: 42, # 'И'
- 234: 60, # 'Й'
- 235: 36, # 'К'
- 236: 49, # 'Л'
- 237: 38, # 'М'
- 238: 31, # 'Н'
- 239: 34, # 'О'
- 240: 35, # 'П'
- 241: 43, # 'Я'
- 242: 45, # 'Р'
- 243: 32, # 'С'
- 244: 40, # 'Т'
- 245: 52, # 'У'
- 246: 56, # 'Ж'
- 247: 33, # 'В'
- 248: 61, # 'Ь'
- 249: 62, # 'Ы'
- 250: 51, # 'З'
- 251: 57, # 'Ш'
- 252: 47, # 'Э'
- 253: 63, # 'Щ'
- 254: 50, # 'Ч'
- 255: 70, # 'Ъ'
-}
-
-KOI8_R_RUSSIAN_MODEL = SingleByteCharSetModel(
- charset_name="KOI8-R",
- language="Russian",
- char_to_order_map=KOI8_R_RUSSIAN_CHAR_TO_ORDER,
- language_model=RUSSIAN_LANG_MODEL,
- typical_positive_ratio=0.976601,
- keep_ascii_letters=False,
- alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё",
-)
-
-MACCYRILLIC_RUSSIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 142, # 'A'
- 66: 143, # 'B'
- 67: 144, # 'C'
- 68: 145, # 'D'
- 69: 146, # 'E'
- 70: 147, # 'F'
- 71: 148, # 'G'
- 72: 149, # 'H'
- 73: 150, # 'I'
- 74: 151, # 'J'
- 75: 152, # 'K'
- 76: 74, # 'L'
- 77: 153, # 'M'
- 78: 75, # 'N'
- 79: 154, # 'O'
- 80: 155, # 'P'
- 81: 156, # 'Q'
- 82: 157, # 'R'
- 83: 158, # 'S'
- 84: 159, # 'T'
- 85: 160, # 'U'
- 86: 161, # 'V'
- 87: 162, # 'W'
- 88: 163, # 'X'
- 89: 164, # 'Y'
- 90: 165, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 71, # 'a'
- 98: 172, # 'b'
- 99: 66, # 'c'
- 100: 173, # 'd'
- 101: 65, # 'e'
- 102: 174, # 'f'
- 103: 76, # 'g'
- 104: 175, # 'h'
- 105: 64, # 'i'
- 106: 176, # 'j'
- 107: 177, # 'k'
- 108: 77, # 'l'
- 109: 72, # 'm'
- 110: 178, # 'n'
- 111: 69, # 'o'
- 112: 67, # 'p'
- 113: 179, # 'q'
- 114: 78, # 'r'
- 115: 73, # 's'
- 116: 180, # 't'
- 117: 181, # 'u'
- 118: 79, # 'v'
- 119: 182, # 'w'
- 120: 183, # 'x'
- 121: 184, # 'y'
- 122: 185, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 37, # 'А'
- 129: 44, # 'Б'
- 130: 33, # 'В'
- 131: 46, # 'Г'
- 132: 41, # 'Д'
- 133: 48, # 'Е'
- 134: 56, # 'Ж'
- 135: 51, # 'З'
- 136: 42, # 'И'
- 137: 60, # 'Й'
- 138: 36, # 'К'
- 139: 49, # 'Л'
- 140: 38, # 'М'
- 141: 31, # 'Н'
- 142: 34, # 'О'
- 143: 35, # 'П'
- 144: 45, # 'Р'
- 145: 32, # 'С'
- 146: 40, # 'Т'
- 147: 52, # 'У'
- 148: 53, # 'Ф'
- 149: 55, # 'Х'
- 150: 58, # 'Ц'
- 151: 50, # 'Ч'
- 152: 57, # 'Ш'
- 153: 63, # 'Щ'
- 154: 70, # 'Ъ'
- 155: 62, # 'Ы'
- 156: 61, # 'Ь'
- 157: 47, # 'Э'
- 158: 59, # 'Ю'
- 159: 43, # 'Я'
- 160: 191, # '†'
- 161: 192, # '°'
- 162: 193, # 'Ґ'
- 163: 194, # '£'
- 164: 195, # '§'
- 165: 196, # '•'
- 166: 197, # '¶'
- 167: 198, # 'І'
- 168: 199, # '®'
- 169: 200, # '©'
- 170: 201, # '™'
- 171: 202, # 'Ђ'
- 172: 203, # 'ђ'
- 173: 204, # '≠'
- 174: 205, # 'Ѓ'
- 175: 206, # 'ѓ'
- 176: 207, # '∞'
- 177: 208, # '±'
- 178: 209, # '≤'
- 179: 210, # '≥'
- 180: 211, # 'і'
- 181: 212, # 'µ'
- 182: 213, # 'ґ'
- 183: 214, # 'Ј'
- 184: 215, # 'Є'
- 185: 216, # 'є'
- 186: 217, # 'Ї'
- 187: 218, # 'ї'
- 188: 219, # 'Љ'
- 189: 220, # 'љ'
- 190: 221, # 'Њ'
- 191: 222, # 'њ'
- 192: 223, # 'ј'
- 193: 224, # 'Ѕ'
- 194: 225, # '¬'
- 195: 226, # '√'
- 196: 227, # 'ƒ'
- 197: 228, # '≈'
- 198: 229, # '∆'
- 199: 230, # '«'
- 200: 231, # '»'
- 201: 232, # '…'
- 202: 233, # '\xa0'
- 203: 234, # 'Ћ'
- 204: 235, # 'ћ'
- 205: 236, # 'Ќ'
- 206: 237, # 'ќ'
- 207: 238, # 'ѕ'
- 208: 239, # '–'
- 209: 240, # '—'
- 210: 241, # '“'
- 211: 242, # '”'
- 212: 243, # '‘'
- 213: 244, # '’'
- 214: 245, # '÷'
- 215: 246, # '„'
- 216: 247, # 'Ў'
- 217: 248, # 'ў'
- 218: 249, # 'Џ'
- 219: 250, # 'џ'
- 220: 251, # '№'
- 221: 252, # 'Ё'
- 222: 68, # 'ё'
- 223: 16, # 'я'
- 224: 3, # 'а'
- 225: 21, # 'б'
- 226: 10, # 'в'
- 227: 19, # 'г'
- 228: 13, # 'д'
- 229: 2, # 'е'
- 230: 24, # 'ж'
- 231: 20, # 'з'
- 232: 4, # 'и'
- 233: 23, # 'й'
- 234: 11, # 'к'
- 235: 8, # 'л'
- 236: 12, # 'м'
- 237: 5, # 'н'
- 238: 1, # 'о'
- 239: 15, # 'п'
- 240: 9, # 'р'
- 241: 7, # 'с'
- 242: 6, # 'т'
- 243: 14, # 'у'
- 244: 39, # 'ф'
- 245: 26, # 'х'
- 246: 28, # 'ц'
- 247: 22, # 'ч'
- 248: 25, # 'ш'
- 249: 29, # 'щ'
- 250: 54, # 'ъ'
- 251: 18, # 'ы'
- 252: 17, # 'ь'
- 253: 30, # 'э'
- 254: 27, # 'ю'
- 255: 255, # '€'
-}
-
-MACCYRILLIC_RUSSIAN_MODEL = SingleByteCharSetModel(
- charset_name="MacCyrillic",
- language="Russian",
- char_to_order_map=MACCYRILLIC_RUSSIAN_CHAR_TO_ORDER,
- language_model=RUSSIAN_LANG_MODEL,
- typical_positive_ratio=0.976601,
- keep_ascii_letters=False,
- alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё",
-)
-
-ISO_8859_5_RUSSIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 142, # 'A'
- 66: 143, # 'B'
- 67: 144, # 'C'
- 68: 145, # 'D'
- 69: 146, # 'E'
- 70: 147, # 'F'
- 71: 148, # 'G'
- 72: 149, # 'H'
- 73: 150, # 'I'
- 74: 151, # 'J'
- 75: 152, # 'K'
- 76: 74, # 'L'
- 77: 153, # 'M'
- 78: 75, # 'N'
- 79: 154, # 'O'
- 80: 155, # 'P'
- 81: 156, # 'Q'
- 82: 157, # 'R'
- 83: 158, # 'S'
- 84: 159, # 'T'
- 85: 160, # 'U'
- 86: 161, # 'V'
- 87: 162, # 'W'
- 88: 163, # 'X'
- 89: 164, # 'Y'
- 90: 165, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 71, # 'a'
- 98: 172, # 'b'
- 99: 66, # 'c'
- 100: 173, # 'd'
- 101: 65, # 'e'
- 102: 174, # 'f'
- 103: 76, # 'g'
- 104: 175, # 'h'
- 105: 64, # 'i'
- 106: 176, # 'j'
- 107: 177, # 'k'
- 108: 77, # 'l'
- 109: 72, # 'm'
- 110: 178, # 'n'
- 111: 69, # 'o'
- 112: 67, # 'p'
- 113: 179, # 'q'
- 114: 78, # 'r'
- 115: 73, # 's'
- 116: 180, # 't'
- 117: 181, # 'u'
- 118: 79, # 'v'
- 119: 182, # 'w'
- 120: 183, # 'x'
- 121: 184, # 'y'
- 122: 185, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 191, # '\x80'
- 129: 192, # '\x81'
- 130: 193, # '\x82'
- 131: 194, # '\x83'
- 132: 195, # '\x84'
- 133: 196, # '\x85'
- 134: 197, # '\x86'
- 135: 198, # '\x87'
- 136: 199, # '\x88'
- 137: 200, # '\x89'
- 138: 201, # '\x8a'
- 139: 202, # '\x8b'
- 140: 203, # '\x8c'
- 141: 204, # '\x8d'
- 142: 205, # '\x8e'
- 143: 206, # '\x8f'
- 144: 207, # '\x90'
- 145: 208, # '\x91'
- 146: 209, # '\x92'
- 147: 210, # '\x93'
- 148: 211, # '\x94'
- 149: 212, # '\x95'
- 150: 213, # '\x96'
- 151: 214, # '\x97'
- 152: 215, # '\x98'
- 153: 216, # '\x99'
- 154: 217, # '\x9a'
- 155: 218, # '\x9b'
- 156: 219, # '\x9c'
- 157: 220, # '\x9d'
- 158: 221, # '\x9e'
- 159: 222, # '\x9f'
- 160: 223, # '\xa0'
- 161: 224, # 'Ё'
- 162: 225, # 'Ђ'
- 163: 226, # 'Ѓ'
- 164: 227, # 'Є'
- 165: 228, # 'Ѕ'
- 166: 229, # 'І'
- 167: 230, # 'Ї'
- 168: 231, # 'Ј'
- 169: 232, # 'Љ'
- 170: 233, # 'Њ'
- 171: 234, # 'Ћ'
- 172: 235, # 'Ќ'
- 173: 236, # '\xad'
- 174: 237, # 'Ў'
- 175: 238, # 'Џ'
- 176: 37, # 'А'
- 177: 44, # 'Б'
- 178: 33, # 'В'
- 179: 46, # 'Г'
- 180: 41, # 'Д'
- 181: 48, # 'Е'
- 182: 56, # 'Ж'
- 183: 51, # 'З'
- 184: 42, # 'И'
- 185: 60, # 'Й'
- 186: 36, # 'К'
- 187: 49, # 'Л'
- 188: 38, # 'М'
- 189: 31, # 'Н'
- 190: 34, # 'О'
- 191: 35, # 'П'
- 192: 45, # 'Р'
- 193: 32, # 'С'
- 194: 40, # 'Т'
- 195: 52, # 'У'
- 196: 53, # 'Ф'
- 197: 55, # 'Х'
- 198: 58, # 'Ц'
- 199: 50, # 'Ч'
- 200: 57, # 'Ш'
- 201: 63, # 'Щ'
- 202: 70, # 'Ъ'
- 203: 62, # 'Ы'
- 204: 61, # 'Ь'
- 205: 47, # 'Э'
- 206: 59, # 'Ю'
- 207: 43, # 'Я'
- 208: 3, # 'а'
- 209: 21, # 'б'
- 210: 10, # 'в'
- 211: 19, # 'г'
- 212: 13, # 'д'
- 213: 2, # 'е'
- 214: 24, # 'ж'
- 215: 20, # 'з'
- 216: 4, # 'и'
- 217: 23, # 'й'
- 218: 11, # 'к'
- 219: 8, # 'л'
- 220: 12, # 'м'
- 221: 5, # 'н'
- 222: 1, # 'о'
- 223: 15, # 'п'
- 224: 9, # 'р'
- 225: 7, # 'с'
- 226: 6, # 'т'
- 227: 14, # 'у'
- 228: 39, # 'ф'
- 229: 26, # 'х'
- 230: 28, # 'ц'
- 231: 22, # 'ч'
- 232: 25, # 'ш'
- 233: 29, # 'щ'
- 234: 54, # 'ъ'
- 235: 18, # 'ы'
- 236: 17, # 'ь'
- 237: 30, # 'э'
- 238: 27, # 'ю'
- 239: 16, # 'я'
- 240: 239, # '№'
- 241: 68, # 'ё'
- 242: 240, # 'ђ'
- 243: 241, # 'ѓ'
- 244: 242, # 'є'
- 245: 243, # 'ѕ'
- 246: 244, # 'і'
- 247: 245, # 'ї'
- 248: 246, # 'ј'
- 249: 247, # 'љ'
- 250: 248, # 'њ'
- 251: 249, # 'ћ'
- 252: 250, # 'ќ'
- 253: 251, # '§'
- 254: 252, # 'ў'
- 255: 255, # 'џ'
-}
-
-ISO_8859_5_RUSSIAN_MODEL = SingleByteCharSetModel(
- charset_name="ISO-8859-5",
- language="Russian",
- char_to_order_map=ISO_8859_5_RUSSIAN_CHAR_TO_ORDER,
- language_model=RUSSIAN_LANG_MODEL,
- typical_positive_ratio=0.976601,
- keep_ascii_letters=False,
- alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё",
-)
diff --git a/contrib/python/pip/pip/_vendor/chardet/langthaimodel.py b/contrib/python/pip/pip/_vendor/chardet/langthaimodel.py
deleted file mode 100644
index 489cad930e..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/langthaimodel.py
+++ /dev/null
@@ -1,4380 +0,0 @@
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-THAI_LANG_MODEL = {
- 5: { # 'ก'
- 5: 2, # 'ก'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 2, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 3, # 'ฎ'
- 57: 2, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 2, # 'ณ'
- 20: 2, # 'ด'
- 19: 3, # 'ต'
- 44: 0, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 1, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 1, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 2, # 'ม'
- 16: 1, # 'ย'
- 2: 3, # 'ร'
- 61: 2, # 'ฤ'
- 15: 3, # 'ล'
- 12: 3, # 'ว'
- 42: 2, # 'ศ'
- 46: 3, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 3, # 'อ'
- 63: 1, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 3, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 0, # 'ึ'
- 27: 2, # 'ื'
- 32: 2, # 'ุ'
- 35: 1, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 1, # 'ใ'
- 33: 2, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 3, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 30: { # 'ข'
- 5: 1, # 'ก'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 1, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 2, # 'ณ'
- 20: 0, # 'ด'
- 19: 2, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 1, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 2, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 1, # 'ห'
- 4: 3, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 2, # 'ี'
- 40: 3, # 'ึ'
- 27: 1, # 'ื'
- 32: 1, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 2, # '่'
- 7: 3, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 24: { # 'ค'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 2, # 'ค'
- 8: 2, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 2, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 0, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 2, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 3, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 2, # 'า'
- 36: 3, # 'ำ'
- 23: 3, # 'ิ'
- 13: 2, # 'ี'
- 40: 0, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 2, # 'ู'
- 11: 1, # 'เ'
- 28: 0, # 'แ'
- 41: 3, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 8: { # 'ง'
- 5: 3, # 'ก'
- 30: 2, # 'ข'
- 24: 3, # 'ค'
- 8: 2, # 'ง'
- 26: 2, # 'จ'
- 52: 1, # 'ฉ'
- 34: 2, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 3, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 1, # 'ฝ'
- 31: 2, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 2, # 'ม'
- 16: 1, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 2, # 'ว'
- 42: 2, # 'ศ'
- 46: 1, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 1, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 1, # 'ื'
- 32: 1, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 3, # 'ๆ'
- 37: 0, # '็'
- 6: 2, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 26: { # 'จ'
- 5: 2, # 'ก'
- 30: 1, # 'ข'
- 24: 0, # 'ค'
- 8: 2, # 'ง'
- 26: 3, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 1, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 1, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 1, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 1, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 3, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 3, # 'ำ'
- 23: 2, # 'ิ'
- 13: 1, # 'ี'
- 40: 3, # 'ึ'
- 27: 1, # 'ื'
- 32: 3, # 'ุ'
- 35: 2, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'แ'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 2, # '่'
- 7: 2, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 52: { # 'ฉ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 3, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 3, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 1, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 1, # 'ั'
- 1: 1, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 1, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 34: { # 'ช'
- 5: 1, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 1, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 1, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 1, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 2, # 'ั'
- 1: 3, # 'า'
- 36: 1, # 'ำ'
- 23: 3, # 'ิ'
- 13: 2, # 'ี'
- 40: 0, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 1, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 51: { # 'ซ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 1, # 'ั'
- 1: 1, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 2, # 'ี'
- 40: 3, # 'ึ'
- 27: 2, # 'ื'
- 32: 1, # 'ุ'
- 35: 1, # 'ู'
- 11: 1, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 1, # '่'
- 7: 2, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 47: { # 'ญ'
- 5: 1, # 'ก'
- 30: 1, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 3, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 1, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 2, # 'ห'
- 4: 1, # 'อ'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 2, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'แ'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 0, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 0, # '็'
- 6: 2, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 58: { # 'ฎ'
- 5: 2, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 1, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 2, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 57: { # 'ฏ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 3, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 49: { # 'ฐ'
- 5: 1, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 2, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 1, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 53: { # 'ฑ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 55: { # 'ฒ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 43: { # 'ณ'
- 5: 1, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 3, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 3, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 1, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 3, # 'ะ'
- 10: 0, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 2, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'แ'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 20: { # 'ด'
- 5: 2, # 'ก'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 1, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 2, # 'ม'
- 16: 3, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 1, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 3, # 'ั'
- 1: 2, # 'า'
- 36: 2, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 1, # 'ึ'
- 27: 2, # 'ื'
- 32: 3, # 'ุ'
- 35: 2, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 2, # 'ๆ'
- 37: 2, # '็'
- 6: 1, # '่'
- 7: 3, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 19: { # 'ต'
- 5: 2, # 'ก'
- 30: 1, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 1, # 'ต'
- 44: 2, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 1, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 2, # 'ภ'
- 9: 1, # 'ม'
- 16: 1, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 3, # 'ส'
- 21: 0, # 'ห'
- 4: 3, # 'อ'
- 63: 1, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 2, # 'ำ'
- 23: 3, # 'ิ'
- 13: 2, # 'ี'
- 40: 1, # 'ึ'
- 27: 1, # 'ื'
- 32: 3, # 'ุ'
- 35: 2, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'แ'
- 41: 1, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 2, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 44: { # 'ถ'
- 5: 1, # 'ก'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 2, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 1, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 2, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 1, # 'ี'
- 40: 3, # 'ึ'
- 27: 2, # 'ื'
- 32: 2, # 'ุ'
- 35: 3, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'แ'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 2, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 14: { # 'ท'
- 5: 1, # 'ก'
- 30: 1, # 'ข'
- 24: 3, # 'ค'
- 8: 1, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 3, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 2, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 3, # 'ย'
- 2: 3, # 'ร'
- 61: 1, # 'ฤ'
- 15: 1, # 'ล'
- 12: 2, # 'ว'
- 42: 3, # 'ศ'
- 46: 1, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 3, # 'ำ'
- 23: 2, # 'ิ'
- 13: 3, # 'ี'
- 40: 2, # 'ึ'
- 27: 1, # 'ื'
- 32: 3, # 'ุ'
- 35: 1, # 'ู'
- 11: 0, # 'เ'
- 28: 1, # 'แ'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 48: { # 'ธ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 1, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 2, # 'า'
- 36: 0, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 2, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 3: { # 'น'
- 5: 3, # 'ก'
- 30: 2, # 'ข'
- 24: 3, # 'ค'
- 8: 1, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 1, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 2, # 'ถ'
- 14: 3, # 'ท'
- 48: 3, # 'ธ'
- 3: 2, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 2, # 'พ'
- 54: 1, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 2, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 1, # 'ฤ'
- 15: 2, # 'ล'
- 12: 3, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 3, # 'อ'
- 63: 1, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 3, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 3, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 2, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'แ'
- 41: 3, # 'โ'
- 29: 3, # 'ใ'
- 33: 3, # 'ไ'
- 50: 2, # 'ๆ'
- 37: 1, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 17: { # 'บ'
- 5: 3, # 'ก'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 1, # 'ง'
- 26: 1, # 'จ'
- 52: 1, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 3, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 1, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 1, # 'ม'
- 16: 0, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 3, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 2, # 'อ'
- 63: 1, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 2, # 'ำ'
- 23: 2, # 'ิ'
- 13: 2, # 'ี'
- 40: 0, # 'ึ'
- 27: 2, # 'ื'
- 32: 3, # 'ุ'
- 35: 2, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 2, # '่'
- 7: 2, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 25: { # 'ป'
- 5: 2, # 'ก'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 1, # 'ฎ'
- 57: 3, # 'ฏ'
- 49: 1, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 1, # 'ต'
- 44: 1, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 0, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 1, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 0, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 1, # 'ษ'
- 18: 2, # 'ส'
- 21: 1, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 3, # 'ั'
- 1: 1, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 3, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 1, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 2, # 'แ'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 2, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 3, # '็'
- 6: 1, # '่'
- 7: 2, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 39: { # 'ผ'
- 5: 1, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 1, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 2, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 1, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 1, # 'ื'
- 32: 0, # 'ุ'
- 35: 3, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 1, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 62: { # 'ฝ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 1, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 1, # 'ี'
- 40: 2, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 2, # '่'
- 7: 1, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 31: { # 'พ'
- 5: 1, # 'ก'
- 30: 1, # 'ข'
- 24: 1, # 'ค'
- 8: 1, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 1, # 'ณ'
- 20: 1, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 2, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 0, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 2, # 'ย'
- 2: 3, # 'ร'
- 61: 2, # 'ฤ'
- 15: 2, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 1, # 'ห'
- 4: 2, # 'อ'
- 63: 1, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 3, # 'ิ'
- 13: 2, # 'ี'
- 40: 1, # 'ึ'
- 27: 3, # 'ื'
- 32: 1, # 'ุ'
- 35: 2, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'แ'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 0, # '่'
- 7: 1, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 54: { # 'ฟ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 2, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 1, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 2, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 1, # 'ื'
- 32: 1, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 1, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 2, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 45: { # 'ภ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 3, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 2, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 9: { # 'ม'
- 5: 2, # 'ก'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 2, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 1, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 3, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 2, # 'ม'
- 16: 1, # 'ย'
- 2: 2, # 'ร'
- 61: 2, # 'ฤ'
- 15: 2, # 'ล'
- 12: 2, # 'ว'
- 42: 1, # 'ศ'
- 46: 1, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 3, # 'อ'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 0, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 3, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'แ'
- 41: 2, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 1, # '็'
- 6: 3, # '่'
- 7: 2, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 16: { # 'ย'
- 5: 3, # 'ก'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 2, # 'ช'
- 51: 0, # 'ซ'
- 47: 2, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 2, # 'ม'
- 16: 0, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 3, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 1, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 3, # 'ี'
- 40: 1, # 'ึ'
- 27: 2, # 'ื'
- 32: 2, # 'ุ'
- 35: 3, # 'ู'
- 11: 2, # 'เ'
- 28: 1, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 2, # 'ๆ'
- 37: 1, # '็'
- 6: 3, # '่'
- 7: 2, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 2: { # 'ร'
- 5: 3, # 'ก'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 2, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 3, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 3, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 3, # 'ถ'
- 14: 3, # 'ท'
- 48: 1, # 'ธ'
- 3: 2, # 'น'
- 17: 2, # 'บ'
- 25: 3, # 'ป'
- 39: 2, # 'ผ'
- 62: 1, # 'ฝ'
- 31: 2, # 'พ'
- 54: 1, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 3, # 'ม'
- 16: 2, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 3, # 'ว'
- 42: 2, # 'ศ'
- 46: 2, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 3, # 'อ'
- 63: 1, # 'ฯ'
- 22: 3, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 2, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 3, # 'ู'
- 11: 3, # 'เ'
- 28: 3, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 3, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 61: { # 'ฤ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 2, # 'ต'
- 44: 0, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 2, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 15: { # 'ล'
- 5: 2, # 'ก'
- 30: 3, # 'ข'
- 24: 1, # 'ค'
- 8: 3, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 1, # 'ม'
- 16: 3, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 1, # 'ห'
- 4: 3, # 'อ'
- 63: 2, # 'ฯ'
- 22: 3, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 2, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 2, # 'ึ'
- 27: 3, # 'ื'
- 32: 2, # 'ุ'
- 35: 3, # 'ู'
- 11: 2, # 'เ'
- 28: 1, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 2, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 12: { # 'ว'
- 5: 3, # 'ก'
- 30: 2, # 'ข'
- 24: 1, # 'ค'
- 8: 3, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 1, # 'ณ'
- 20: 2, # 'ด'
- 19: 1, # 'ต'
- 44: 1, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 1, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 3, # 'ม'
- 16: 3, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 3, # 'ิ'
- 13: 2, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 2, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 1, # 'ใ'
- 33: 2, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 42: { # 'ศ'
- 5: 1, # 'ก'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 1, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 2, # 'ว'
- 42: 1, # 'ศ'
- 46: 2, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 2, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 0, # 'ี'
- 40: 3, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 2, # 'ู'
- 11: 0, # 'เ'
- 28: 1, # 'แ'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 46: { # 'ษ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 2, # 'ฎ'
- 57: 1, # 'ฏ'
- 49: 2, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 3, # 'ณ'
- 20: 0, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 1, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 2, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 18: { # 'ส'
- 5: 2, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 2, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 3, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 2, # 'ภ'
- 9: 3, # 'ม'
- 16: 1, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 2, # 'ห'
- 4: 3, # 'อ'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 3, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 2, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 3, # 'ู'
- 11: 2, # 'เ'
- 28: 0, # 'แ'
- 41: 1, # 'โ'
- 29: 0, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 1, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 21: { # 'ห'
- 5: 3, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 1, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 2, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 3, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 0, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 3, # 'ม'
- 16: 2, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 3, # 'อ'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 1, # 'ุ'
- 35: 1, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 3, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 4: { # 'อ'
- 5: 3, # 'ก'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 1, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 3, # 'ม'
- 16: 3, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 2, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 3, # 'อ'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 2, # 'ำ'
- 23: 2, # 'ิ'
- 13: 3, # 'ี'
- 40: 0, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 1, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 1, # '็'
- 6: 2, # '่'
- 7: 2, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 63: { # 'ฯ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 22: { # 'ะ'
- 5: 3, # 'ก'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 1, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 3, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 1, # 'ถ'
- 14: 3, # 'ท'
- 48: 1, # 'ธ'
- 3: 2, # 'น'
- 17: 3, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 2, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 3, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 2, # 'อ'
- 63: 1, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 10: { # 'ั'
- 5: 3, # 'ก'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 3, # 'ง'
- 26: 3, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 3, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 2, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 3, # 'ฒ'
- 43: 3, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 0, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 2, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 3, # 'ม'
- 16: 3, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 3, # 'ว'
- 42: 2, # 'ศ'
- 46: 0, # 'ษ'
- 18: 3, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 1: { # 'า'
- 5: 3, # 'ก'
- 30: 2, # 'ข'
- 24: 3, # 'ค'
- 8: 3, # 'ง'
- 26: 3, # 'จ'
- 52: 0, # 'ฉ'
- 34: 3, # 'ช'
- 51: 1, # 'ซ'
- 47: 2, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 3, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 1, # 'ถ'
- 14: 3, # 'ท'
- 48: 2, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 1, # 'ฝ'
- 31: 3, # 'พ'
- 54: 1, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 3, # 'ม'
- 16: 3, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 3, # 'ว'
- 42: 2, # 'ศ'
- 46: 3, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 2, # 'อ'
- 63: 1, # 'ฯ'
- 22: 3, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 36: { # 'ำ'
- 5: 2, # 'ก'
- 30: 1, # 'ข'
- 24: 3, # 'ค'
- 8: 2, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 1, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 1, # 'ต'
- 44: 1, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 1, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 1, # 'ม'
- 16: 0, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 3, # 'ห'
- 4: 1, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 23: { # 'ิ'
- 5: 3, # 'ก'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 3, # 'จ'
- 52: 0, # 'ฉ'
- 34: 3, # 'ช'
- 51: 0, # 'ซ'
- 47: 2, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 1, # 'ถ'
- 14: 3, # 'ท'
- 48: 3, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 3, # 'พ'
- 54: 1, # 'ฟ'
- 45: 2, # 'ภ'
- 9: 3, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 3, # 'ว'
- 42: 3, # 'ศ'
- 46: 2, # 'ษ'
- 18: 2, # 'ส'
- 21: 3, # 'ห'
- 4: 1, # 'อ'
- 63: 1, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 1, # 'แ'
- 41: 1, # 'โ'
- 29: 1, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 2, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 13: { # 'ี'
- 5: 3, # 'ก'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 2, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 3, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 2, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 1, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 40: { # 'ึ'
- 5: 3, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 3, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 27: { # 'ื'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 3, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 3, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 32: { # 'ุ'
- 5: 3, # 'ก'
- 30: 2, # 'ข'
- 24: 3, # 'ค'
- 8: 3, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 2, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 1, # 'ฒ'
- 43: 3, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 1, # 'ธ'
- 3: 2, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 3, # 'ม'
- 16: 1, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 1, # 'ว'
- 42: 1, # 'ศ'
- 46: 2, # 'ษ'
- 18: 1, # 'ส'
- 21: 1, # 'ห'
- 4: 1, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 0, # 'แ'
- 41: 1, # 'โ'
- 29: 0, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 2, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 35: { # 'ู'
- 5: 3, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 2, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 2, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 1, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 0, # 'บ'
- 25: 3, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'แ'
- 41: 1, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 11: { # 'เ'
- 5: 3, # 'ก'
- 30: 3, # 'ข'
- 24: 3, # 'ค'
- 8: 2, # 'ง'
- 26: 3, # 'จ'
- 52: 3, # 'ฉ'
- 34: 3, # 'ช'
- 51: 2, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 1, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 1, # 'ถ'
- 14: 3, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 3, # 'ป'
- 39: 2, # 'ผ'
- 62: 1, # 'ฝ'
- 31: 3, # 'พ'
- 54: 1, # 'ฟ'
- 45: 3, # 'ภ'
- 9: 3, # 'ม'
- 16: 2, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 3, # 'ว'
- 42: 2, # 'ศ'
- 46: 0, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 3, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 28: { # 'แ'
- 5: 3, # 'ก'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 1, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 3, # 'ต'
- 44: 2, # 'ถ'
- 14: 3, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 2, # 'ป'
- 39: 3, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 2, # 'พ'
- 54: 2, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 1, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 41: { # 'โ'
- 5: 2, # 'ก'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 1, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 2, # 'ต'
- 44: 0, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 1, # 'บ'
- 25: 3, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 1, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 1, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 0, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 0, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 29: { # 'ใ'
- 5: 2, # 'ก'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 3, # 'จ'
- 52: 0, # 'ฉ'
- 34: 3, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 1, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 33: { # 'ไ'
- 5: 1, # 'ก'
- 30: 2, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 3, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 1, # 'บ'
- 25: 3, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 2, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 3, # 'ม'
- 16: 0, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 3, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 2, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 50: { # 'ๆ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 37: { # '็'
- 5: 2, # 'ก'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 2, # 'ง'
- 26: 3, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 1, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 2, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 1, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 1, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 6: { # '่'
- 5: 2, # 'ก'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 1, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 1, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 1, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 3, # 'ม'
- 16: 3, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 3, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 1, # 'ห'
- 4: 3, # 'อ'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 0, # 'ั'
- 1: 3, # 'า'
- 36: 2, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 7: { # '้'
- 5: 2, # 'ก'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 1, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 3, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 3, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 3, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 3, # 'า'
- 36: 2, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 38: { # '์'
- 5: 2, # 'ก'
- 30: 1, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 1, # 'ต'
- 44: 1, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 1, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 1, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 1, # 'ฤ'
- 15: 1, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 1, # 'ห'
- 4: 2, # 'อ'
- 63: 1, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 56: { # '๑'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 2, # '๑'
- 59: 1, # '๒'
- 60: 1, # '๕'
- },
- 59: { # '๒'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 1, # '๑'
- 59: 1, # '๒'
- 60: 3, # '๕'
- },
- 60: { # '๕'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 2, # '๑'
- 59: 1, # '๒'
- 60: 0, # '๕'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-TIS_620_THAI_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 182, # 'A'
- 66: 106, # 'B'
- 67: 107, # 'C'
- 68: 100, # 'D'
- 69: 183, # 'E'
- 70: 184, # 'F'
- 71: 185, # 'G'
- 72: 101, # 'H'
- 73: 94, # 'I'
- 74: 186, # 'J'
- 75: 187, # 'K'
- 76: 108, # 'L'
- 77: 109, # 'M'
- 78: 110, # 'N'
- 79: 111, # 'O'
- 80: 188, # 'P'
- 81: 189, # 'Q'
- 82: 190, # 'R'
- 83: 89, # 'S'
- 84: 95, # 'T'
- 85: 112, # 'U'
- 86: 113, # 'V'
- 87: 191, # 'W'
- 88: 192, # 'X'
- 89: 193, # 'Y'
- 90: 194, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 64, # 'a'
- 98: 72, # 'b'
- 99: 73, # 'c'
- 100: 114, # 'd'
- 101: 74, # 'e'
- 102: 115, # 'f'
- 103: 116, # 'g'
- 104: 102, # 'h'
- 105: 81, # 'i'
- 106: 201, # 'j'
- 107: 117, # 'k'
- 108: 90, # 'l'
- 109: 103, # 'm'
- 110: 78, # 'n'
- 111: 82, # 'o'
- 112: 96, # 'p'
- 113: 202, # 'q'
- 114: 91, # 'r'
- 115: 79, # 's'
- 116: 84, # 't'
- 117: 104, # 'u'
- 118: 105, # 'v'
- 119: 97, # 'w'
- 120: 98, # 'x'
- 121: 92, # 'y'
- 122: 203, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 209, # '\x80'
- 129: 210, # '\x81'
- 130: 211, # '\x82'
- 131: 212, # '\x83'
- 132: 213, # '\x84'
- 133: 88, # '\x85'
- 134: 214, # '\x86'
- 135: 215, # '\x87'
- 136: 216, # '\x88'
- 137: 217, # '\x89'
- 138: 218, # '\x8a'
- 139: 219, # '\x8b'
- 140: 220, # '\x8c'
- 141: 118, # '\x8d'
- 142: 221, # '\x8e'
- 143: 222, # '\x8f'
- 144: 223, # '\x90'
- 145: 224, # '\x91'
- 146: 99, # '\x92'
- 147: 85, # '\x93'
- 148: 83, # '\x94'
- 149: 225, # '\x95'
- 150: 226, # '\x96'
- 151: 227, # '\x97'
- 152: 228, # '\x98'
- 153: 229, # '\x99'
- 154: 230, # '\x9a'
- 155: 231, # '\x9b'
- 156: 232, # '\x9c'
- 157: 233, # '\x9d'
- 158: 234, # '\x9e'
- 159: 235, # '\x9f'
- 160: 236, # None
- 161: 5, # 'ก'
- 162: 30, # 'ข'
- 163: 237, # 'ฃ'
- 164: 24, # 'ค'
- 165: 238, # 'ฅ'
- 166: 75, # 'ฆ'
- 167: 8, # 'ง'
- 168: 26, # 'จ'
- 169: 52, # 'ฉ'
- 170: 34, # 'ช'
- 171: 51, # 'ซ'
- 172: 119, # 'ฌ'
- 173: 47, # 'ญ'
- 174: 58, # 'ฎ'
- 175: 57, # 'ฏ'
- 176: 49, # 'ฐ'
- 177: 53, # 'ฑ'
- 178: 55, # 'ฒ'
- 179: 43, # 'ณ'
- 180: 20, # 'ด'
- 181: 19, # 'ต'
- 182: 44, # 'ถ'
- 183: 14, # 'ท'
- 184: 48, # 'ธ'
- 185: 3, # 'น'
- 186: 17, # 'บ'
- 187: 25, # 'ป'
- 188: 39, # 'ผ'
- 189: 62, # 'ฝ'
- 190: 31, # 'พ'
- 191: 54, # 'ฟ'
- 192: 45, # 'ภ'
- 193: 9, # 'ม'
- 194: 16, # 'ย'
- 195: 2, # 'ร'
- 196: 61, # 'ฤ'
- 197: 15, # 'ล'
- 198: 239, # 'ฦ'
- 199: 12, # 'ว'
- 200: 42, # 'ศ'
- 201: 46, # 'ษ'
- 202: 18, # 'ส'
- 203: 21, # 'ห'
- 204: 76, # 'ฬ'
- 205: 4, # 'อ'
- 206: 66, # 'ฮ'
- 207: 63, # 'ฯ'
- 208: 22, # 'ะ'
- 209: 10, # 'ั'
- 210: 1, # 'า'
- 211: 36, # 'ำ'
- 212: 23, # 'ิ'
- 213: 13, # 'ี'
- 214: 40, # 'ึ'
- 215: 27, # 'ื'
- 216: 32, # 'ุ'
- 217: 35, # 'ู'
- 218: 86, # 'ฺ'
- 219: 240, # None
- 220: 241, # None
- 221: 242, # None
- 222: 243, # None
- 223: 244, # '฿'
- 224: 11, # 'เ'
- 225: 28, # 'แ'
- 226: 41, # 'โ'
- 227: 29, # 'ใ'
- 228: 33, # 'ไ'
- 229: 245, # 'ๅ'
- 230: 50, # 'ๆ'
- 231: 37, # '็'
- 232: 6, # '่'
- 233: 7, # '้'
- 234: 67, # '๊'
- 235: 77, # '๋'
- 236: 38, # '์'
- 237: 93, # 'ํ'
- 238: 246, # '๎'
- 239: 247, # '๏'
- 240: 68, # '๐'
- 241: 56, # '๑'
- 242: 59, # '๒'
- 243: 65, # '๓'
- 244: 69, # '๔'
- 245: 60, # '๕'
- 246: 70, # '๖'
- 247: 80, # '๗'
- 248: 71, # '๘'
- 249: 87, # '๙'
- 250: 248, # '๚'
- 251: 249, # '๛'
- 252: 250, # None
- 253: 251, # None
- 254: 252, # None
- 255: 253, # None
-}
-
-TIS_620_THAI_MODEL = SingleByteCharSetModel(
- charset_name="TIS-620",
- language="Thai",
- char_to_order_map=TIS_620_THAI_CHAR_TO_ORDER,
- language_model=THAI_LANG_MODEL,
- typical_positive_ratio=0.926386,
- keep_ascii_letters=False,
- alphabet="กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛",
-)
diff --git a/contrib/python/pip/pip/_vendor/chardet/langturkishmodel.py b/contrib/python/pip/pip/_vendor/chardet/langturkishmodel.py
deleted file mode 100644
index 291857c25c..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/langturkishmodel.py
+++ /dev/null
@@ -1,4380 +0,0 @@
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-TURKISH_LANG_MODEL = {
- 23: { # 'A'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 1, # 'h'
- 3: 1, # 'i'
- 24: 0, # 'j'
- 10: 2, # 'k'
- 5: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 1, # 'r'
- 8: 1, # 's'
- 9: 1, # 't'
- 14: 1, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 37: { # 'B'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 2, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 1, # 'Ş'
- 19: 1, # 'ş'
- },
- 47: { # 'C'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 1, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 1, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 2, # 'j'
- 10: 1, # 'k'
- 5: 2, # 'l'
- 13: 2, # 'm'
- 4: 2, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 2, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 1, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 39: { # 'D'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 1, # 'l'
- 13: 3, # 'm'
- 4: 0, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 1, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 1, # 'Ş'
- 19: 0, # 'ş'
- },
- 29: { # 'E'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 1, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 0, # 'h'
- 3: 1, # 'i'
- 24: 1, # 'j'
- 10: 0, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 1, # 's'
- 9: 1, # 't'
- 14: 1, # 'u'
- 32: 1, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 52: { # 'F'
- 23: 0, # 'A'
- 37: 1, # 'B'
- 47: 1, # 'C'
- 39: 1, # 'D'
- 29: 1, # 'E'
- 52: 2, # 'F'
- 36: 0, # 'G'
- 45: 2, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 1, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 1, # 'b'
- 28: 1, # 'c'
- 12: 1, # 'd'
- 2: 0, # 'e'
- 18: 1, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 2, # 'i'
- 24: 1, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 2, # 'r'
- 8: 1, # 's'
- 9: 1, # 't'
- 14: 1, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 1, # 'Ö'
- 55: 2, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 1, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 2, # 'ş'
- },
- 36: { # 'G'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 2, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 2, # 'N'
- 42: 1, # 'O'
- 48: 1, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 1, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 1, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 0, # 'r'
- 8: 1, # 's'
- 9: 1, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 1, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 1, # 'İ'
- 6: 2, # 'ı'
- 40: 2, # 'Ş'
- 19: 1, # 'ş'
- },
- 45: { # 'H'
- 23: 0, # 'A'
- 37: 1, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 2, # 'G'
- 45: 1, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 1, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 2, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 2, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 1, # 'o'
- 26: 1, # 'p'
- 7: 1, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 2, # 'ğ'
- 41: 1, # 'İ'
- 6: 0, # 'ı'
- 40: 2, # 'Ş'
- 19: 1, # 'ş'
- },
- 53: { # 'I'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 2, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 1, # 'Ş'
- 19: 1, # 'ş'
- },
- 60: { # 'J'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 1, # 'd'
- 2: 0, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 1, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 1, # 's'
- 9: 0, # 't'
- 14: 0, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 16: { # 'K'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 1, # 'e'
- 18: 3, # 'f'
- 27: 3, # 'g'
- 25: 3, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 0, # 'u'
- 32: 3, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ğ'
- 41: 1, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 49: { # 'L'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 2, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 2, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 0, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 2, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 2, # 'n'
- 15: 1, # 'o'
- 26: 1, # 'p'
- 7: 1, # 'r'
- 8: 1, # 's'
- 9: 1, # 't'
- 14: 0, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 2, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 1, # 'ü'
- 30: 1, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 20: { # 'M'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 1, # 'h'
- 3: 2, # 'i'
- 24: 2, # 'j'
- 10: 2, # 'k'
- 5: 2, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 3, # 'r'
- 8: 0, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 46: { # 'N'
- 23: 0, # 'A'
- 37: 1, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 2, # 'j'
- 10: 1, # 'k'
- 5: 1, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 1, # 'o'
- 26: 1, # 'p'
- 7: 1, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 1, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 1, # 'İ'
- 6: 2, # 'ı'
- 40: 1, # 'Ş'
- 19: 1, # 'ş'
- },
- 42: { # 'O'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 1, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 0, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 2, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 2, # 'İ'
- 6: 1, # 'ı'
- 40: 1, # 'Ş'
- 19: 1, # 'ş'
- },
- 48: { # 'P'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 2, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 2, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 2, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 1, # 'İ'
- 6: 0, # 'ı'
- 40: 2, # 'Ş'
- 19: 1, # 'ş'
- },
- 44: { # 'R'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 1, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 2, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 1, # 'ü'
- 30: 1, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 1, # 'Ş'
- 19: 1, # 'ş'
- },
- 35: { # 'S'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 1, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 1, # 'l'
- 13: 2, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 1, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 2, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 2, # 'Ş'
- 19: 1, # 'ş'
- },
- 31: { # 'T'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 0, # 'c'
- 12: 1, # 'd'
- 2: 3, # 'e'
- 18: 2, # 'f'
- 27: 2, # 'g'
- 25: 0, # 'h'
- 3: 1, # 'i'
- 24: 1, # 'j'
- 10: 2, # 'k'
- 5: 2, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 2, # 'r'
- 8: 0, # 's'
- 9: 2, # 't'
- 14: 2, # 'u'
- 32: 1, # 'v'
- 57: 1, # 'w'
- 58: 1, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 51: { # 'U'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 1, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 1, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 1, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 1, # 'ş'
- },
- 38: { # 'V'
- 23: 1, # 'A'
- 37: 1, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 1, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 2, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 2, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 1, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 1, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 1, # 'İ'
- 6: 3, # 'ı'
- 40: 2, # 'Ş'
- 19: 1, # 'ş'
- },
- 62: { # 'W'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 0, # 'd'
- 2: 0, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 0, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 43: { # 'Y'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 0, # 'G'
- 45: 1, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 2, # 'N'
- 42: 0, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 1, # 'j'
- 10: 1, # 'k'
- 5: 1, # 'l'
- 13: 3, # 'm'
- 4: 0, # 'n'
- 15: 2, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 2, # 'Ö'
- 55: 1, # 'Ü'
- 59: 1, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 1, # 'İ'
- 6: 0, # 'ı'
- 40: 2, # 'Ş'
- 19: 1, # 'ş'
- },
- 56: { # 'Z'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 2, # 'Z'
- 1: 2, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 2, # 'i'
- 24: 1, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 1, # 'r'
- 8: 1, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 1: { # 'a'
- 23: 3, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 1, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 3, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 2, # 'Z'
- 1: 2, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 2, # 'e'
- 18: 3, # 'f'
- 27: 3, # 'g'
- 25: 3, # 'h'
- 3: 3, # 'i'
- 24: 3, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 3, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 3, # 'v'
- 57: 2, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 1, # 'î'
- 34: 1, # 'ö'
- 17: 3, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 1, # 'ş'
- },
- 21: { # 'b'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 3, # 'g'
- 25: 1, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 3, # 'p'
- 7: 1, # 'r'
- 8: 2, # 's'
- 9: 2, # 't'
- 14: 2, # 'u'
- 32: 1, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 28: { # 'c'
- 23: 0, # 'A'
- 37: 1, # 'B'
- 47: 1, # 'C'
- 39: 1, # 'D'
- 29: 2, # 'E'
- 52: 0, # 'F'
- 36: 2, # 'G'
- 45: 2, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 2, # 'T'
- 51: 2, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 3, # 'Y'
- 56: 0, # 'Z'
- 1: 1, # 'a'
- 21: 1, # 'b'
- 28: 2, # 'c'
- 12: 2, # 'd'
- 2: 1, # 'e'
- 18: 1, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 3, # 'i'
- 24: 1, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 2, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 1, # 'u'
- 32: 0, # 'v'
- 57: 1, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 1, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 1, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 1, # 'î'
- 34: 2, # 'ö'
- 17: 2, # 'ü'
- 30: 2, # 'ğ'
- 41: 1, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 2, # 'ş'
- },
- 12: { # 'd'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 2, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 1, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 1, # 'f'
- 27: 3, # 'g'
- 25: 3, # 'h'
- 3: 2, # 'i'
- 24: 3, # 'j'
- 10: 2, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 2, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 1, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 3, # 'y'
- 22: 1, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 2: { # 'e'
- 23: 2, # 'A'
- 37: 0, # 'B'
- 47: 2, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 1, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 1, # 'R'
- 35: 0, # 'S'
- 31: 3, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 2, # 'e'
- 18: 3, # 'f'
- 27: 3, # 'g'
- 25: 3, # 'h'
- 3: 3, # 'i'
- 24: 3, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 3, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 3, # 'v'
- 57: 2, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 1, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 3, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 18: { # 'f'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 2, # 'f'
- 27: 1, # 'g'
- 25: 1, # 'h'
- 3: 1, # 'i'
- 24: 1, # 'j'
- 10: 1, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 1, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 1, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 27: { # 'g'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 1, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 1, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 1, # 'h'
- 3: 2, # 'i'
- 24: 3, # 'j'
- 10: 2, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 2, # 'r'
- 8: 2, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 1, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 25: { # 'h'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 2, # 'h'
- 3: 2, # 'i'
- 24: 3, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 1, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 1, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 3: { # 'i'
- 23: 2, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 0, # 'N'
- 42: 1, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 1, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 2, # 'f'
- 27: 3, # 'g'
- 25: 1, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 3, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 1, # 'w'
- 58: 1, # 'x'
- 11: 3, # 'y'
- 22: 1, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 1, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 3, # 'ü'
- 30: 0, # 'ğ'
- 41: 1, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 24: { # 'j'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 1, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 2, # 'f'
- 27: 1, # 'g'
- 25: 1, # 'h'
- 3: 2, # 'i'
- 24: 1, # 'j'
- 10: 2, # 'k'
- 5: 2, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 2, # 'r'
- 8: 3, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 2, # 'x'
- 11: 1, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 10: { # 'k'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 3, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 3, # 'e'
- 18: 1, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 2, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 3, # 'p'
- 7: 2, # 'r'
- 8: 2, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 3, # 'ü'
- 30: 1, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 1, # 'ş'
- },
- 5: { # 'l'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 1, # 'e'
- 18: 3, # 'f'
- 27: 3, # 'g'
- 25: 2, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 1, # 'l'
- 13: 1, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 2, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 13: { # 'm'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 3, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 2, # 'e'
- 18: 3, # 'f'
- 27: 3, # 'g'
- 25: 3, # 'h'
- 3: 3, # 'i'
- 24: 3, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 2, # 'u'
- 32: 2, # 'v'
- 57: 1, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 3, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 1, # 'ş'
- },
- 4: { # 'n'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 2, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 1, # 'f'
- 27: 2, # 'g'
- 25: 3, # 'h'
- 3: 2, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 3, # 'p'
- 7: 2, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 2, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 15: { # 'o'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 2, # 'L'
- 20: 0, # 'M'
- 46: 2, # 'N'
- 42: 1, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 1, # 'i'
- 24: 2, # 'j'
- 10: 1, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 2, # 'o'
- 26: 0, # 'p'
- 7: 1, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 2, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 2, # 'ğ'
- 41: 2, # 'İ'
- 6: 3, # 'ı'
- 40: 2, # 'Ş'
- 19: 2, # 'ş'
- },
- 26: { # 'p'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 1, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 1, # 'h'
- 3: 2, # 'i'
- 24: 3, # 'j'
- 10: 1, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 2, # 'r'
- 8: 1, # 's'
- 9: 1, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 1, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 7: { # 'r'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 2, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 1, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 3, # 'h'
- 3: 2, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 3, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 8: { # 's'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 2, # 'i'
- 24: 3, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 3, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 2, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 1, # 'ş'
- },
- 9: { # 't'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 2, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 2, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 3, # 'v'
- 57: 0, # 'w'
- 58: 2, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 14: { # 'u'
- 23: 3, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 2, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 3, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 2, # 'Z'
- 1: 2, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 2, # 'e'
- 18: 2, # 'f'
- 27: 3, # 'g'
- 25: 3, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 3, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 2, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 3, # 'ü'
- 30: 1, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 32: { # 'v'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 1, # 'j'
- 10: 1, # 'k'
- 5: 3, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 1, # 'r'
- 8: 2, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 1, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 57: { # 'w'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 1, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 1, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 1, # 's'
- 9: 0, # 't'
- 14: 1, # 'u'
- 32: 0, # 'v'
- 57: 2, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 58: { # 'x'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 1, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 1, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 2, # 'i'
- 24: 2, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 2, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 1, # 'r'
- 8: 2, # 's'
- 9: 1, # 't'
- 14: 0, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 11: { # 'y'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 2, # 'i'
- 24: 1, # 'j'
- 10: 2, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 2, # 'r'
- 8: 1, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 22: { # 'z'
- 23: 2, # 'A'
- 37: 2, # 'B'
- 47: 1, # 'C'
- 39: 2, # 'D'
- 29: 3, # 'E'
- 52: 1, # 'F'
- 36: 2, # 'G'
- 45: 2, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 2, # 'N'
- 42: 2, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 3, # 'T'
- 51: 2, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 1, # 'Z'
- 1: 1, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 2, # 'd'
- 2: 2, # 'e'
- 18: 3, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 2, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 0, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 2, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 2, # 'Ü'
- 59: 1, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 2, # 'ü'
- 30: 2, # 'ğ'
- 41: 1, # 'İ'
- 6: 3, # 'ı'
- 40: 1, # 'Ş'
- 19: 2, # 'ş'
- },
- 63: { # '·'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 0, # 'd'
- 2: 1, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 54: { # 'Ç'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 1, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 1, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 1, # 'd'
- 2: 0, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 0, # 'h'
- 3: 3, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 2, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 2, # 'r'
- 8: 0, # 's'
- 9: 1, # 't'
- 14: 0, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 2, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 1, # 'ş'
- },
- 50: { # 'Ö'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 1, # 'D'
- 29: 2, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 2, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 1, # 'N'
- 42: 2, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 2, # 'd'
- 2: 0, # 'e'
- 18: 1, # 'f'
- 27: 1, # 'g'
- 25: 1, # 'h'
- 3: 2, # 'i'
- 24: 0, # 'j'
- 10: 2, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 3, # 'n'
- 15: 2, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 1, # 's'
- 9: 2, # 't'
- 14: 0, # 'u'
- 32: 1, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 2, # 'ü'
- 30: 1, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 1, # 'ş'
- },
- 55: { # 'Ü'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 1, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 1, # 'İ'
- 6: 0, # 'ı'
- 40: 0, # 'Ş'
- 19: 1, # 'ş'
- },
- 59: { # 'â'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 1, # 'Ş'
- 19: 0, # 'ş'
- },
- 33: { # 'ç'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 0, # 'e'
- 18: 2, # 'f'
- 27: 1, # 'g'
- 25: 3, # 'h'
- 3: 3, # 'i'
- 24: 0, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 3, # 'r'
- 8: 2, # 's'
- 9: 3, # 't'
- 14: 0, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 61: { # 'î'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 1, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 1, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 1, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 34: { # 'ö'
- 23: 0, # 'A'
- 37: 1, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 1, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 1, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 2, # 'c'
- 12: 1, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 1, # 'i'
- 24: 2, # 'j'
- 10: 1, # 'k'
- 5: 2, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 2, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 3, # 's'
- 9: 1, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 0, # 'ü'
- 30: 2, # 'ğ'
- 41: 1, # 'İ'
- 6: 1, # 'ı'
- 40: 2, # 'Ş'
- 19: 1, # 'ş'
- },
- 17: { # 'ü'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 1, # 'd'
- 2: 3, # 'e'
- 18: 1, # 'f'
- 27: 2, # 'g'
- 25: 0, # 'h'
- 3: 1, # 'i'
- 24: 1, # 'j'
- 10: 2, # 'k'
- 5: 3, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 2, # 'r'
- 8: 3, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 1, # 'v'
- 57: 1, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 30: { # 'ğ'
- 23: 0, # 'A'
- 37: 2, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 2, # 'N'
- 42: 2, # 'O'
- 48: 1, # 'P'
- 44: 1, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 3, # 'j'
- 10: 1, # 'k'
- 5: 2, # 'l'
- 13: 3, # 'm'
- 4: 0, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 1, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 2, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 2, # 'İ'
- 6: 2, # 'ı'
- 40: 2, # 'Ş'
- 19: 1, # 'ş'
- },
- 41: { # 'İ'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 1, # 'D'
- 29: 1, # 'E'
- 52: 0, # 'F'
- 36: 2, # 'G'
- 45: 2, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 2, # 'P'
- 44: 0, # 'R'
- 35: 1, # 'S'
- 31: 1, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 0, # 'Z'
- 1: 1, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 2, # 'd'
- 2: 1, # 'e'
- 18: 0, # 'f'
- 27: 3, # 'g'
- 25: 2, # 'h'
- 3: 2, # 'i'
- 24: 2, # 'j'
- 10: 2, # 'k'
- 5: 0, # 'l'
- 13: 1, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 1, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 2, # 't'
- 14: 0, # 'u'
- 32: 0, # 'v'
- 57: 1, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 1, # 'Ü'
- 59: 1, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 1, # 'ü'
- 30: 2, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 1, # 'ş'
- },
- 6: { # 'ı'
- 23: 2, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 2, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 1, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 3, # 'f'
- 27: 3, # 'g'
- 25: 2, # 'h'
- 3: 3, # 'i'
- 24: 3, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 3, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 3, # 'v'
- 57: 1, # 'w'
- 58: 1, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 3, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 40: { # 'Ş'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 1, # 'D'
- 29: 1, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 2, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 2, # 'P'
- 44: 2, # 'R'
- 35: 1, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 1, # 'Z'
- 1: 0, # 'a'
- 21: 2, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 0, # 'e'
- 18: 3, # 'f'
- 27: 0, # 'g'
- 25: 2, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 1, # 'm'
- 4: 3, # 'n'
- 15: 2, # 'o'
- 26: 0, # 'p'
- 7: 3, # 'r'
- 8: 2, # 's'
- 9: 2, # 't'
- 14: 1, # 'u'
- 32: 3, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 1, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 1, # 'ü'
- 30: 2, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 1, # 'Ş'
- 19: 2, # 'ş'
- },
- 19: { # 'ş'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 2, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 1, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 1, # 'h'
- 3: 1, # 'i'
- 24: 0, # 'j'
- 10: 2, # 'k'
- 5: 2, # 'l'
- 13: 3, # 'm'
- 4: 0, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 3, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 1, # 'î'
- 34: 2, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 1, # 'İ'
- 6: 1, # 'ı'
- 40: 1, # 'Ş'
- 19: 1, # 'ş'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-ISO_8859_9_TURKISH_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 255, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 255, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 255, # ' '
- 33: 255, # '!'
- 34: 255, # '"'
- 35: 255, # '#'
- 36: 255, # '$'
- 37: 255, # '%'
- 38: 255, # '&'
- 39: 255, # "'"
- 40: 255, # '('
- 41: 255, # ')'
- 42: 255, # '*'
- 43: 255, # '+'
- 44: 255, # ','
- 45: 255, # '-'
- 46: 255, # '.'
- 47: 255, # '/'
- 48: 255, # '0'
- 49: 255, # '1'
- 50: 255, # '2'
- 51: 255, # '3'
- 52: 255, # '4'
- 53: 255, # '5'
- 54: 255, # '6'
- 55: 255, # '7'
- 56: 255, # '8'
- 57: 255, # '9'
- 58: 255, # ':'
- 59: 255, # ';'
- 60: 255, # '<'
- 61: 255, # '='
- 62: 255, # '>'
- 63: 255, # '?'
- 64: 255, # '@'
- 65: 23, # 'A'
- 66: 37, # 'B'
- 67: 47, # 'C'
- 68: 39, # 'D'
- 69: 29, # 'E'
- 70: 52, # 'F'
- 71: 36, # 'G'
- 72: 45, # 'H'
- 73: 53, # 'I'
- 74: 60, # 'J'
- 75: 16, # 'K'
- 76: 49, # 'L'
- 77: 20, # 'M'
- 78: 46, # 'N'
- 79: 42, # 'O'
- 80: 48, # 'P'
- 81: 69, # 'Q'
- 82: 44, # 'R'
- 83: 35, # 'S'
- 84: 31, # 'T'
- 85: 51, # 'U'
- 86: 38, # 'V'
- 87: 62, # 'W'
- 88: 65, # 'X'
- 89: 43, # 'Y'
- 90: 56, # 'Z'
- 91: 255, # '['
- 92: 255, # '\\'
- 93: 255, # ']'
- 94: 255, # '^'
- 95: 255, # '_'
- 96: 255, # '`'
- 97: 1, # 'a'
- 98: 21, # 'b'
- 99: 28, # 'c'
- 100: 12, # 'd'
- 101: 2, # 'e'
- 102: 18, # 'f'
- 103: 27, # 'g'
- 104: 25, # 'h'
- 105: 3, # 'i'
- 106: 24, # 'j'
- 107: 10, # 'k'
- 108: 5, # 'l'
- 109: 13, # 'm'
- 110: 4, # 'n'
- 111: 15, # 'o'
- 112: 26, # 'p'
- 113: 64, # 'q'
- 114: 7, # 'r'
- 115: 8, # 's'
- 116: 9, # 't'
- 117: 14, # 'u'
- 118: 32, # 'v'
- 119: 57, # 'w'
- 120: 58, # 'x'
- 121: 11, # 'y'
- 122: 22, # 'z'
- 123: 255, # '{'
- 124: 255, # '|'
- 125: 255, # '}'
- 126: 255, # '~'
- 127: 255, # '\x7f'
- 128: 180, # '\x80'
- 129: 179, # '\x81'
- 130: 178, # '\x82'
- 131: 177, # '\x83'
- 132: 176, # '\x84'
- 133: 175, # '\x85'
- 134: 174, # '\x86'
- 135: 173, # '\x87'
- 136: 172, # '\x88'
- 137: 171, # '\x89'
- 138: 170, # '\x8a'
- 139: 169, # '\x8b'
- 140: 168, # '\x8c'
- 141: 167, # '\x8d'
- 142: 166, # '\x8e'
- 143: 165, # '\x8f'
- 144: 164, # '\x90'
- 145: 163, # '\x91'
- 146: 162, # '\x92'
- 147: 161, # '\x93'
- 148: 160, # '\x94'
- 149: 159, # '\x95'
- 150: 101, # '\x96'
- 151: 158, # '\x97'
- 152: 157, # '\x98'
- 153: 156, # '\x99'
- 154: 155, # '\x9a'
- 155: 154, # '\x9b'
- 156: 153, # '\x9c'
- 157: 152, # '\x9d'
- 158: 151, # '\x9e'
- 159: 106, # '\x9f'
- 160: 150, # '\xa0'
- 161: 149, # '¡'
- 162: 148, # '¢'
- 163: 147, # '£'
- 164: 146, # '¤'
- 165: 145, # '¥'
- 166: 144, # '¦'
- 167: 100, # '§'
- 168: 143, # '¨'
- 169: 142, # '©'
- 170: 141, # 'ª'
- 171: 140, # '«'
- 172: 139, # '¬'
- 173: 138, # '\xad'
- 174: 137, # '®'
- 175: 136, # '¯'
- 176: 94, # '°'
- 177: 80, # '±'
- 178: 93, # '²'
- 179: 135, # '³'
- 180: 105, # '´'
- 181: 134, # 'µ'
- 182: 133, # '¶'
- 183: 63, # '·'
- 184: 132, # '¸'
- 185: 131, # '¹'
- 186: 130, # 'º'
- 187: 129, # '»'
- 188: 128, # '¼'
- 189: 127, # '½'
- 190: 126, # '¾'
- 191: 125, # '¿'
- 192: 124, # 'À'
- 193: 104, # 'Á'
- 194: 73, # 'Â'
- 195: 99, # 'Ã'
- 196: 79, # 'Ä'
- 197: 85, # 'Å'
- 198: 123, # 'Æ'
- 199: 54, # 'Ç'
- 200: 122, # 'È'
- 201: 98, # 'É'
- 202: 92, # 'Ê'
- 203: 121, # 'Ë'
- 204: 120, # 'Ì'
- 205: 91, # 'Í'
- 206: 103, # 'Î'
- 207: 119, # 'Ï'
- 208: 68, # 'Ğ'
- 209: 118, # 'Ñ'
- 210: 117, # 'Ò'
- 211: 97, # 'Ó'
- 212: 116, # 'Ô'
- 213: 115, # 'Õ'
- 214: 50, # 'Ö'
- 215: 90, # '×'
- 216: 114, # 'Ø'
- 217: 113, # 'Ù'
- 218: 112, # 'Ú'
- 219: 111, # 'Û'
- 220: 55, # 'Ü'
- 221: 41, # 'İ'
- 222: 40, # 'Ş'
- 223: 86, # 'ß'
- 224: 89, # 'à'
- 225: 70, # 'á'
- 226: 59, # 'â'
- 227: 78, # 'ã'
- 228: 71, # 'ä'
- 229: 82, # 'å'
- 230: 88, # 'æ'
- 231: 33, # 'ç'
- 232: 77, # 'è'
- 233: 66, # 'é'
- 234: 84, # 'ê'
- 235: 83, # 'ë'
- 236: 110, # 'ì'
- 237: 75, # 'í'
- 238: 61, # 'î'
- 239: 96, # 'ï'
- 240: 30, # 'ğ'
- 241: 67, # 'ñ'
- 242: 109, # 'ò'
- 243: 74, # 'ó'
- 244: 87, # 'ô'
- 245: 102, # 'õ'
- 246: 34, # 'ö'
- 247: 95, # '÷'
- 248: 81, # 'ø'
- 249: 108, # 'ù'
- 250: 76, # 'ú'
- 251: 72, # 'û'
- 252: 17, # 'ü'
- 253: 6, # 'ı'
- 254: 19, # 'ş'
- 255: 107, # 'ÿ'
-}
-
-ISO_8859_9_TURKISH_MODEL = SingleByteCharSetModel(
- charset_name="ISO-8859-9",
- language="Turkish",
- char_to_order_map=ISO_8859_9_TURKISH_CHAR_TO_ORDER,
- language_model=TURKISH_LANG_MODEL,
- typical_positive_ratio=0.97029,
- keep_ascii_letters=True,
- alphabet="ABCDEFGHIJKLMNOPRSTUVYZabcdefghijklmnoprstuvyzÂÇÎÖÛÜâçîöûüĞğİıŞş",
-)
diff --git a/contrib/python/pip/pip/_vendor/chardet/latin1prober.py b/contrib/python/pip/pip/_vendor/chardet/latin1prober.py
deleted file mode 100644
index 59a01d91b8..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/latin1prober.py
+++ /dev/null
@@ -1,147 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import List, Union
-
-from .charsetprober import CharSetProber
-from .enums import ProbingState
-
-FREQ_CAT_NUM = 4
-
-UDF = 0 # undefined
-OTH = 1 # other
-ASC = 2 # ascii capital letter
-ASS = 3 # ascii small letter
-ACV = 4 # accent capital vowel
-ACO = 5 # accent capital other
-ASV = 6 # accent small vowel
-ASO = 7 # accent small other
-CLASS_NUM = 8 # total classes
-
-# fmt: off
-Latin1_CharToClass = (
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F
- OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47
- ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F
- ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57
- ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F
- OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67
- ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F
- ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77
- ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F
- OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87
- OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F
- UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97
- OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF
- ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7
- ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF
- ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7
- ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF
- ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7
- ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF
- ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7
- ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF
-)
-
-# 0 : illegal
-# 1 : very unlikely
-# 2 : normal
-# 3 : very likely
-Latin1ClassModel = (
-# UDF OTH ASC ASS ACV ACO ASV ASO
- 0, 0, 0, 0, 0, 0, 0, 0, # UDF
- 0, 3, 3, 3, 3, 3, 3, 3, # OTH
- 0, 3, 3, 3, 3, 3, 3, 3, # ASC
- 0, 3, 3, 3, 1, 1, 3, 3, # ASS
- 0, 3, 3, 3, 1, 2, 1, 2, # ACV
- 0, 3, 3, 3, 3, 3, 3, 3, # ACO
- 0, 3, 1, 3, 1, 1, 1, 3, # ASV
- 0, 3, 1, 3, 1, 1, 3, 3, # ASO
-)
-# fmt: on
-
-
-class Latin1Prober(CharSetProber):
- def __init__(self) -> None:
- super().__init__()
- self._last_char_class = OTH
- self._freq_counter: List[int] = []
- self.reset()
-
- def reset(self) -> None:
- self._last_char_class = OTH
- self._freq_counter = [0] * FREQ_CAT_NUM
- super().reset()
-
- @property
- def charset_name(self) -> str:
- return "ISO-8859-1"
-
- @property
- def language(self) -> str:
- return ""
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- byte_str = self.remove_xml_tags(byte_str)
- for c in byte_str:
- char_class = Latin1_CharToClass[c]
- freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + char_class]
- if freq == 0:
- self._state = ProbingState.NOT_ME
- break
- self._freq_counter[freq] += 1
- self._last_char_class = char_class
-
- return self.state
-
- def get_confidence(self) -> float:
- if self.state == ProbingState.NOT_ME:
- return 0.01
-
- total = sum(self._freq_counter)
- confidence = (
- 0.0
- if total < 0.01
- else (self._freq_counter[3] - self._freq_counter[1] * 20.0) / total
- )
- confidence = max(confidence, 0.0)
- # lower the confidence of latin1 so that other more accurate
- # detector can take priority.
- confidence *= 0.73
- return confidence
diff --git a/contrib/python/pip/pip/_vendor/chardet/macromanprober.py b/contrib/python/pip/pip/_vendor/chardet/macromanprober.py
deleted file mode 100644
index 1425d10eca..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/macromanprober.py
+++ /dev/null
@@ -1,162 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# This code was modified from latin1prober.py by Rob Speer <rob@lumino.so>.
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Rob Speer - adapt to MacRoman encoding
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import List, Union
-
-from .charsetprober import CharSetProber
-from .enums import ProbingState
-
-FREQ_CAT_NUM = 4
-
-UDF = 0 # undefined
-OTH = 1 # other
-ASC = 2 # ascii capital letter
-ASS = 3 # ascii small letter
-ACV = 4 # accent capital vowel
-ACO = 5 # accent capital other
-ASV = 6 # accent small vowel
-ASO = 7 # accent small other
-ODD = 8 # character that is unlikely to appear
-CLASS_NUM = 9 # total classes
-
-# The change from Latin1 is that we explicitly look for extended characters
-# that are infrequently-occurring symbols, and consider them to always be
-# improbable. This should let MacRoman get out of the way of more likely
-# encodings in most situations.
-
-# fmt: off
-MacRoman_CharToClass = (
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F
- OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47
- ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F
- ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57
- ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F
- OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67
- ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F
- ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77
- ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F
- ACV, ACV, ACO, ACV, ACO, ACV, ACV, ASV, # 80 - 87
- ASV, ASV, ASV, ASV, ASV, ASO, ASV, ASV, # 88 - 8F
- ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASV, # 90 - 97
- ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # 98 - 9F
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, ASO, # A0 - A7
- OTH, OTH, ODD, ODD, OTH, OTH, ACV, ACV, # A8 - AF
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7
- OTH, OTH, OTH, OTH, OTH, OTH, ASV, ASV, # B8 - BF
- OTH, OTH, ODD, OTH, ODD, OTH, OTH, OTH, # C0 - C7
- OTH, OTH, OTH, ACV, ACV, ACV, ACV, ASV, # C8 - CF
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, ODD, # D0 - D7
- ASV, ACV, ODD, OTH, OTH, OTH, OTH, OTH, # D8 - DF
- OTH, OTH, OTH, OTH, OTH, ACV, ACV, ACV, # E0 - E7
- ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # E8 - EF
- ODD, ACV, ACV, ACV, ACV, ASV, ODD, ODD, # F0 - F7
- ODD, ODD, ODD, ODD, ODD, ODD, ODD, ODD, # F8 - FF
-)
-
-# 0 : illegal
-# 1 : very unlikely
-# 2 : normal
-# 3 : very likely
-MacRomanClassModel = (
-# UDF OTH ASC ASS ACV ACO ASV ASO ODD
- 0, 0, 0, 0, 0, 0, 0, 0, 0, # UDF
- 0, 3, 3, 3, 3, 3, 3, 3, 1, # OTH
- 0, 3, 3, 3, 3, 3, 3, 3, 1, # ASC
- 0, 3, 3, 3, 1, 1, 3, 3, 1, # ASS
- 0, 3, 3, 3, 1, 2, 1, 2, 1, # ACV
- 0, 3, 3, 3, 3, 3, 3, 3, 1, # ACO
- 0, 3, 1, 3, 1, 1, 1, 3, 1, # ASV
- 0, 3, 1, 3, 1, 1, 3, 3, 1, # ASO
- 0, 1, 1, 1, 1, 1, 1, 1, 1, # ODD
-)
-# fmt: on
-
-
-class MacRomanProber(CharSetProber):
- def __init__(self) -> None:
- super().__init__()
- self._last_char_class = OTH
- self._freq_counter: List[int] = []
- self.reset()
-
- def reset(self) -> None:
- self._last_char_class = OTH
- self._freq_counter = [0] * FREQ_CAT_NUM
-
- # express the prior that MacRoman is a somewhat rare encoding;
- # this can be done by starting out in a slightly improbable state
- # that must be overcome
- self._freq_counter[2] = 10
-
- super().reset()
-
- @property
- def charset_name(self) -> str:
- return "MacRoman"
-
- @property
- def language(self) -> str:
- return ""
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- byte_str = self.remove_xml_tags(byte_str)
- for c in byte_str:
- char_class = MacRoman_CharToClass[c]
- freq = MacRomanClassModel[(self._last_char_class * CLASS_NUM) + char_class]
- if freq == 0:
- self._state = ProbingState.NOT_ME
- break
- self._freq_counter[freq] += 1
- self._last_char_class = char_class
-
- return self.state
-
- def get_confidence(self) -> float:
- if self.state == ProbingState.NOT_ME:
- return 0.01
-
- total = sum(self._freq_counter)
- confidence = (
- 0.0
- if total < 0.01
- else (self._freq_counter[3] - self._freq_counter[1] * 20.0) / total
- )
- confidence = max(confidence, 0.0)
- # lower the confidence of MacRoman so that other more accurate
- # detector can take priority.
- confidence *= 0.73
- return confidence
diff --git a/contrib/python/pip/pip/_vendor/chardet/mbcharsetprober.py b/contrib/python/pip/pip/_vendor/chardet/mbcharsetprober.py
deleted file mode 100644
index 666307e8fe..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/mbcharsetprober.py
+++ /dev/null
@@ -1,95 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-# Proofpoint, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import Optional, Union
-
-from .chardistribution import CharDistributionAnalysis
-from .charsetprober import CharSetProber
-from .codingstatemachine import CodingStateMachine
-from .enums import LanguageFilter, MachineState, ProbingState
-
-
-class MultiByteCharSetProber(CharSetProber):
- """
- MultiByteCharSetProber
- """
-
- def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None:
- super().__init__(lang_filter=lang_filter)
- self.distribution_analyzer: Optional[CharDistributionAnalysis] = None
- self.coding_sm: Optional[CodingStateMachine] = None
- self._last_char = bytearray(b"\0\0")
-
- def reset(self) -> None:
- super().reset()
- if self.coding_sm:
- self.coding_sm.reset()
- if self.distribution_analyzer:
- self.distribution_analyzer.reset()
- self._last_char = bytearray(b"\0\0")
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- assert self.coding_sm is not None
- assert self.distribution_analyzer is not None
-
- for i, byte in enumerate(byte_str):
- coding_state = self.coding_sm.next_state(byte)
- if coding_state == MachineState.ERROR:
- self.logger.debug(
- "%s %s prober hit error at byte %s",
- self.charset_name,
- self.language,
- i,
- )
- self._state = ProbingState.NOT_ME
- break
- if coding_state == MachineState.ITS_ME:
- self._state = ProbingState.FOUND_IT
- break
- if coding_state == MachineState.START:
- char_len = self.coding_sm.get_current_charlen()
- if i == 0:
- self._last_char[1] = byte
- self.distribution_analyzer.feed(self._last_char, char_len)
- else:
- self.distribution_analyzer.feed(byte_str[i - 1 : i + 1], char_len)
-
- self._last_char[0] = byte_str[-1]
-
- if self.state == ProbingState.DETECTING:
- if self.distribution_analyzer.got_enough_data() and (
- self.get_confidence() > self.SHORTCUT_THRESHOLD
- ):
- self._state = ProbingState.FOUND_IT
-
- return self.state
-
- def get_confidence(self) -> float:
- assert self.distribution_analyzer is not None
- return self.distribution_analyzer.get_confidence()
diff --git a/contrib/python/pip/pip/_vendor/chardet/mbcsgroupprober.py b/contrib/python/pip/pip/_vendor/chardet/mbcsgroupprober.py
deleted file mode 100644
index 6cb9cc7b3b..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/mbcsgroupprober.py
+++ /dev/null
@@ -1,57 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-# Proofpoint, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .big5prober import Big5Prober
-from .charsetgroupprober import CharSetGroupProber
-from .cp949prober import CP949Prober
-from .enums import LanguageFilter
-from .eucjpprober import EUCJPProber
-from .euckrprober import EUCKRProber
-from .euctwprober import EUCTWProber
-from .gb2312prober import GB2312Prober
-from .johabprober import JOHABProber
-from .sjisprober import SJISProber
-from .utf8prober import UTF8Prober
-
-
-class MBCSGroupProber(CharSetGroupProber):
- def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None:
- super().__init__(lang_filter=lang_filter)
- self.probers = [
- UTF8Prober(),
- SJISProber(),
- EUCJPProber(),
- GB2312Prober(),
- EUCKRProber(),
- CP949Prober(),
- Big5Prober(),
- EUCTWProber(),
- JOHABProber(),
- ]
- self.reset()
diff --git a/contrib/python/pip/pip/_vendor/chardet/mbcssm.py b/contrib/python/pip/pip/_vendor/chardet/mbcssm.py
deleted file mode 100644
index 7bbe97e666..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/mbcssm.py
+++ /dev/null
@@ -1,661 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .codingstatemachinedict import CodingStateMachineDict
-from .enums import MachineState
-
-# BIG5
-
-# fmt: off
-BIG5_CLS = (
- 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 #allow 0x00 as legal value
- 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f
- 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17
- 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f
- 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27
- 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f
- 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37
- 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f
- 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47
- 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f
- 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57
- 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f
- 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67
- 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f
- 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77
- 2, 2, 2, 2, 2, 2, 2, 1, # 78 - 7f
- 4, 4, 4, 4, 4, 4, 4, 4, # 80 - 87
- 4, 4, 4, 4, 4, 4, 4, 4, # 88 - 8f
- 4, 4, 4, 4, 4, 4, 4, 4, # 90 - 97
- 4, 4, 4, 4, 4, 4, 4, 4, # 98 - 9f
- 4, 3, 3, 3, 3, 3, 3, 3, # a0 - a7
- 3, 3, 3, 3, 3, 3, 3, 3, # a8 - af
- 3, 3, 3, 3, 3, 3, 3, 3, # b0 - b7
- 3, 3, 3, 3, 3, 3, 3, 3, # b8 - bf
- 3, 3, 3, 3, 3, 3, 3, 3, # c0 - c7
- 3, 3, 3, 3, 3, 3, 3, 3, # c8 - cf
- 3, 3, 3, 3, 3, 3, 3, 3, # d0 - d7
- 3, 3, 3, 3, 3, 3, 3, 3, # d8 - df
- 3, 3, 3, 3, 3, 3, 3, 3, # e0 - e7
- 3, 3, 3, 3, 3, 3, 3, 3, # e8 - ef
- 3, 3, 3, 3, 3, 3, 3, 3, # f0 - f7
- 3, 3, 3, 3, 3, 3, 3, 0 # f8 - ff
-)
-
-BIG5_ST = (
- MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f
- MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17
-)
-# fmt: on
-
-BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0)
-
-BIG5_SM_MODEL: CodingStateMachineDict = {
- "class_table": BIG5_CLS,
- "class_factor": 5,
- "state_table": BIG5_ST,
- "char_len_table": BIG5_CHAR_LEN_TABLE,
- "name": "Big5",
-}
-
-# CP949
-# fmt: off
-CP949_CLS = (
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, # 00 - 0f
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, # 10 - 1f
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 2f
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 3f
- 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, # 40 - 4f
- 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, # 50 - 5f
- 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, # 60 - 6f
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, # 70 - 7f
- 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, # 80 - 8f
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, # 90 - 9f
- 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, # a0 - af
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, # b0 - bf
- 7, 7, 7, 7, 7, 7, 9, 2, 2, 3, 2, 2, 2, 2, 2, 2, # c0 - cf
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, # d0 - df
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, # e0 - ef
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, # f0 - ff
-)
-
-CP949_ST = (
-#cls= 0 1 2 3 4 5 6 7 8 9 # previous state =
- MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME
- MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3
- MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4
- MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5
- MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6
-)
-# fmt: on
-
-CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2)
-
-CP949_SM_MODEL: CodingStateMachineDict = {
- "class_table": CP949_CLS,
- "class_factor": 10,
- "state_table": CP949_ST,
- "char_len_table": CP949_CHAR_LEN_TABLE,
- "name": "CP949",
-}
-
-# EUC-JP
-# fmt: off
-EUCJP_CLS = (
- 4, 4, 4, 4, 4, 4, 4, 4, # 00 - 07
- 4, 4, 4, 4, 4, 4, 5, 5, # 08 - 0f
- 4, 4, 4, 4, 4, 4, 4, 4, # 10 - 17
- 4, 4, 4, 5, 4, 4, 4, 4, # 18 - 1f
- 4, 4, 4, 4, 4, 4, 4, 4, # 20 - 27
- 4, 4, 4, 4, 4, 4, 4, 4, # 28 - 2f
- 4, 4, 4, 4, 4, 4, 4, 4, # 30 - 37
- 4, 4, 4, 4, 4, 4, 4, 4, # 38 - 3f
- 4, 4, 4, 4, 4, 4, 4, 4, # 40 - 47
- 4, 4, 4, 4, 4, 4, 4, 4, # 48 - 4f
- 4, 4, 4, 4, 4, 4, 4, 4, # 50 - 57
- 4, 4, 4, 4, 4, 4, 4, 4, # 58 - 5f
- 4, 4, 4, 4, 4, 4, 4, 4, # 60 - 67
- 4, 4, 4, 4, 4, 4, 4, 4, # 68 - 6f
- 4, 4, 4, 4, 4, 4, 4, 4, # 70 - 77
- 4, 4, 4, 4, 4, 4, 4, 4, # 78 - 7f
- 5, 5, 5, 5, 5, 5, 5, 5, # 80 - 87
- 5, 5, 5, 5, 5, 5, 1, 3, # 88 - 8f
- 5, 5, 5, 5, 5, 5, 5, 5, # 90 - 97
- 5, 5, 5, 5, 5, 5, 5, 5, # 98 - 9f
- 5, 2, 2, 2, 2, 2, 2, 2, # a0 - a7
- 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af
- 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7
- 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf
- 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7
- 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf
- 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7
- 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df
- 0, 0, 0, 0, 0, 0, 0, 0, # e0 - e7
- 0, 0, 0, 0, 0, 0, 0, 0, # e8 - ef
- 0, 0, 0, 0, 0, 0, 0, 0, # f0 - f7
- 0, 0, 0, 0, 0, 0, 0, 5 # f8 - ff
-)
-
-EUCJP_ST = (
- 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17
- MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f
- 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27
-)
-# fmt: on
-
-EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0)
-
-EUCJP_SM_MODEL: CodingStateMachineDict = {
- "class_table": EUCJP_CLS,
- "class_factor": 6,
- "state_table": EUCJP_ST,
- "char_len_table": EUCJP_CHAR_LEN_TABLE,
- "name": "EUC-JP",
-}
-
-# EUC-KR
-# fmt: off
-EUCKR_CLS = (
- 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07
- 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f
- 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17
- 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f
- 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27
- 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f
- 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37
- 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f
- 1, 1, 1, 1, 1, 1, 1, 1, # 40 - 47
- 1, 1, 1, 1, 1, 1, 1, 1, # 48 - 4f
- 1, 1, 1, 1, 1, 1, 1, 1, # 50 - 57
- 1, 1, 1, 1, 1, 1, 1, 1, # 58 - 5f
- 1, 1, 1, 1, 1, 1, 1, 1, # 60 - 67
- 1, 1, 1, 1, 1, 1, 1, 1, # 68 - 6f
- 1, 1, 1, 1, 1, 1, 1, 1, # 70 - 77
- 1, 1, 1, 1, 1, 1, 1, 1, # 78 - 7f
- 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87
- 0, 0, 0, 0, 0, 0, 0, 0, # 88 - 8f
- 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97
- 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f
- 0, 2, 2, 2, 2, 2, 2, 2, # a0 - a7
- 2, 2, 2, 2, 2, 3, 3, 3, # a8 - af
- 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7
- 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf
- 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7
- 2, 3, 2, 2, 2, 2, 2, 2, # c8 - cf
- 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7
- 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df
- 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7
- 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef
- 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7
- 2, 2, 2, 2, 2, 2, 2, 0 # f8 - ff
-)
-
-EUCKR_ST = (
- MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f
-)
-# fmt: on
-
-EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0)
-
-EUCKR_SM_MODEL: CodingStateMachineDict = {
- "class_table": EUCKR_CLS,
- "class_factor": 4,
- "state_table": EUCKR_ST,
- "char_len_table": EUCKR_CHAR_LEN_TABLE,
- "name": "EUC-KR",
-}
-
-# JOHAB
-# fmt: off
-JOHAB_CLS = (
- 4,4,4,4,4,4,4,4, # 00 - 07
- 4,4,4,4,4,4,0,0, # 08 - 0f
- 4,4,4,4,4,4,4,4, # 10 - 17
- 4,4,4,0,4,4,4,4, # 18 - 1f
- 4,4,4,4,4,4,4,4, # 20 - 27
- 4,4,4,4,4,4,4,4, # 28 - 2f
- 4,3,3,3,3,3,3,3, # 30 - 37
- 3,3,3,3,3,3,3,3, # 38 - 3f
- 3,1,1,1,1,1,1,1, # 40 - 47
- 1,1,1,1,1,1,1,1, # 48 - 4f
- 1,1,1,1,1,1,1,1, # 50 - 57
- 1,1,1,1,1,1,1,1, # 58 - 5f
- 1,1,1,1,1,1,1,1, # 60 - 67
- 1,1,1,1,1,1,1,1, # 68 - 6f
- 1,1,1,1,1,1,1,1, # 70 - 77
- 1,1,1,1,1,1,1,2, # 78 - 7f
- 6,6,6,6,8,8,8,8, # 80 - 87
- 8,8,8,8,8,8,8,8, # 88 - 8f
- 8,7,7,7,7,7,7,7, # 90 - 97
- 7,7,7,7,7,7,7,7, # 98 - 9f
- 7,7,7,7,7,7,7,7, # a0 - a7
- 7,7,7,7,7,7,7,7, # a8 - af
- 7,7,7,7,7,7,7,7, # b0 - b7
- 7,7,7,7,7,7,7,7, # b8 - bf
- 7,7,7,7,7,7,7,7, # c0 - c7
- 7,7,7,7,7,7,7,7, # c8 - cf
- 7,7,7,7,5,5,5,5, # d0 - d7
- 5,9,9,9,9,9,9,5, # d8 - df
- 9,9,9,9,9,9,9,9, # e0 - e7
- 9,9,9,9,9,9,9,9, # e8 - ef
- 9,9,9,9,9,9,9,9, # f0 - f7
- 9,9,5,5,5,5,5,0 # f8 - ff
-)
-
-JOHAB_ST = (
-# cls = 0 1 2 3 4 5 6 7 8 9
- MachineState.ERROR ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.ERROR ,MachineState.ERROR ,3 ,3 ,4 , # MachineState.START
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME
- MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR , # MachineState.ERROR
- MachineState.ERROR ,MachineState.START ,MachineState.START ,MachineState.ERROR ,MachineState.ERROR ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.START , # 3
- MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START , # 4
-)
-# fmt: on
-
-JOHAB_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 0, 0, 2, 2, 2)
-
-JOHAB_SM_MODEL: CodingStateMachineDict = {
- "class_table": JOHAB_CLS,
- "class_factor": 10,
- "state_table": JOHAB_ST,
- "char_len_table": JOHAB_CHAR_LEN_TABLE,
- "name": "Johab",
-}
-
-# EUC-TW
-# fmt: off
-EUCTW_CLS = (
- 2, 2, 2, 2, 2, 2, 2, 2, # 00 - 07
- 2, 2, 2, 2, 2, 2, 0, 0, # 08 - 0f
- 2, 2, 2, 2, 2, 2, 2, 2, # 10 - 17
- 2, 2, 2, 0, 2, 2, 2, 2, # 18 - 1f
- 2, 2, 2, 2, 2, 2, 2, 2, # 20 - 27
- 2, 2, 2, 2, 2, 2, 2, 2, # 28 - 2f
- 2, 2, 2, 2, 2, 2, 2, 2, # 30 - 37
- 2, 2, 2, 2, 2, 2, 2, 2, # 38 - 3f
- 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47
- 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f
- 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57
- 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f
- 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67
- 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f
- 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77
- 2, 2, 2, 2, 2, 2, 2, 2, # 78 - 7f
- 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87
- 0, 0, 0, 0, 0, 0, 6, 0, # 88 - 8f
- 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97
- 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f
- 0, 3, 4, 4, 4, 4, 4, 4, # a0 - a7
- 5, 5, 1, 1, 1, 1, 1, 1, # a8 - af
- 1, 1, 1, 1, 1, 1, 1, 1, # b0 - b7
- 1, 1, 1, 1, 1, 1, 1, 1, # b8 - bf
- 1, 1, 3, 1, 3, 3, 3, 3, # c0 - c7
- 3, 3, 3, 3, 3, 3, 3, 3, # c8 - cf
- 3, 3, 3, 3, 3, 3, 3, 3, # d0 - d7
- 3, 3, 3, 3, 3, 3, 3, 3, # d8 - df
- 3, 3, 3, 3, 3, 3, 3, 3, # e0 - e7
- 3, 3, 3, 3, 3, 3, 3, 3, # e8 - ef
- 3, 3, 3, 3, 3, 3, 3, 3, # f0 - f7
- 3, 3, 3, 3, 3, 3, 3, 0 # f8 - ff
-)
-
-EUCTW_ST = (
- MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17
- MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f
- 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27
- MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f
-)
-# fmt: on
-
-EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3)
-
-EUCTW_SM_MODEL: CodingStateMachineDict = {
- "class_table": EUCTW_CLS,
- "class_factor": 7,
- "state_table": EUCTW_ST,
- "char_len_table": EUCTW_CHAR_LEN_TABLE,
- "name": "x-euc-tw",
-}
-
-# GB2312
-# fmt: off
-GB2312_CLS = (
- 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07
- 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f
- 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17
- 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f
- 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27
- 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f
- 3, 3, 3, 3, 3, 3, 3, 3, # 30 - 37
- 3, 3, 1, 1, 1, 1, 1, 1, # 38 - 3f
- 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47
- 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f
- 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57
- 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f
- 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67
- 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f
- 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77
- 2, 2, 2, 2, 2, 2, 2, 4, # 78 - 7f
- 5, 6, 6, 6, 6, 6, 6, 6, # 80 - 87
- 6, 6, 6, 6, 6, 6, 6, 6, # 88 - 8f
- 6, 6, 6, 6, 6, 6, 6, 6, # 90 - 97
- 6, 6, 6, 6, 6, 6, 6, 6, # 98 - 9f
- 6, 6, 6, 6, 6, 6, 6, 6, # a0 - a7
- 6, 6, 6, 6, 6, 6, 6, 6, # a8 - af
- 6, 6, 6, 6, 6, 6, 6, 6, # b0 - b7
- 6, 6, 6, 6, 6, 6, 6, 6, # b8 - bf
- 6, 6, 6, 6, 6, 6, 6, 6, # c0 - c7
- 6, 6, 6, 6, 6, 6, 6, 6, # c8 - cf
- 6, 6, 6, 6, 6, 6, 6, 6, # d0 - d7
- 6, 6, 6, 6, 6, 6, 6, 6, # d8 - df
- 6, 6, 6, 6, 6, 6, 6, 6, # e0 - e7
- 6, 6, 6, 6, 6, 6, 6, 6, # e8 - ef
- 6, 6, 6, 6, 6, 6, 6, 6, # f0 - f7
- 6, 6, 6, 6, 6, 6, 6, 0 # f8 - ff
-)
-
-GB2312_ST = (
- MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17
- 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f
- MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27
- MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f
-)
-# fmt: on
-
-# To be accurate, the length of class 6 can be either 2 or 4.
-# But it is not necessary to discriminate between the two since
-# it is used for frequency analysis only, and we are validating
-# each code range there as well. So it is safe to set it to be
-# 2 here.
-GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2)
-
-GB2312_SM_MODEL: CodingStateMachineDict = {
- "class_table": GB2312_CLS,
- "class_factor": 7,
- "state_table": GB2312_ST,
- "char_len_table": GB2312_CHAR_LEN_TABLE,
- "name": "GB2312",
-}
-
-# Shift_JIS
-# fmt: off
-SJIS_CLS = (
- 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07
- 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f
- 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17
- 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f
- 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27
- 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f
- 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37
- 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f
- 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47
- 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f
- 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57
- 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f
- 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67
- 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f
- 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77
- 2, 2, 2, 2, 2, 2, 2, 1, # 78 - 7f
- 3, 3, 3, 3, 3, 2, 2, 3, # 80 - 87
- 3, 3, 3, 3, 3, 3, 3, 3, # 88 - 8f
- 3, 3, 3, 3, 3, 3, 3, 3, # 90 - 97
- 3, 3, 3, 3, 3, 3, 3, 3, # 98 - 9f
- #0xa0 is illegal in sjis encoding, but some pages does
- #contain such byte. We need to be more error forgiven.
- 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7
- 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af
- 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7
- 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf
- 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7
- 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf
- 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7
- 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df
- 3, 3, 3, 3, 3, 3, 3, 3, # e0 - e7
- 3, 3, 3, 3, 3, 4, 4, 4, # e8 - ef
- 3, 3, 3, 3, 3, 3, 3, 3, # f0 - f7
- 3, 3, 3, 3, 3, 0, 0, 0, # f8 - ff
-)
-
-SJIS_ST = (
- MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17
-)
-# fmt: on
-
-SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0)
-
-SJIS_SM_MODEL: CodingStateMachineDict = {
- "class_table": SJIS_CLS,
- "class_factor": 6,
- "state_table": SJIS_ST,
- "char_len_table": SJIS_CHAR_LEN_TABLE,
- "name": "Shift_JIS",
-}
-
-# UCS2-BE
-# fmt: off
-UCS2BE_CLS = (
- 0, 0, 0, 0, 0, 0, 0, 0, # 00 - 07
- 0, 0, 1, 0, 0, 2, 0, 0, # 08 - 0f
- 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17
- 0, 0, 0, 3, 0, 0, 0, 0, # 18 - 1f
- 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27
- 0, 3, 3, 3, 3, 3, 0, 0, # 28 - 2f
- 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37
- 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f
- 0, 0, 0, 0, 0, 0, 0, 0, # 40 - 47
- 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f
- 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57
- 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f
- 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67
- 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f
- 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77
- 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f
- 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87
- 0, 0, 0, 0, 0, 0, 0, 0, # 88 - 8f
- 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97
- 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f
- 0, 0, 0, 0, 0, 0, 0, 0, # a0 - a7
- 0, 0, 0, 0, 0, 0, 0, 0, # a8 - af
- 0, 0, 0, 0, 0, 0, 0, 0, # b0 - b7
- 0, 0, 0, 0, 0, 0, 0, 0, # b8 - bf
- 0, 0, 0, 0, 0, 0, 0, 0, # c0 - c7
- 0, 0, 0, 0, 0, 0, 0, 0, # c8 - cf
- 0, 0, 0, 0, 0, 0, 0, 0, # d0 - d7
- 0, 0, 0, 0, 0, 0, 0, 0, # d8 - df
- 0, 0, 0, 0, 0, 0, 0, 0, # e0 - e7
- 0, 0, 0, 0, 0, 0, 0, 0, # e8 - ef
- 0, 0, 0, 0, 0, 0, 0, 0, # f0 - f7
- 0, 0, 0, 0, 0, 0, 4, 5 # f8 - ff
-)
-
-UCS2BE_ST = (
- 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
- MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17
- 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f
- 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27
- 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f
- 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37
-)
-# fmt: on
-
-UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2)
-
-UCS2BE_SM_MODEL: CodingStateMachineDict = {
- "class_table": UCS2BE_CLS,
- "class_factor": 6,
- "state_table": UCS2BE_ST,
- "char_len_table": UCS2BE_CHAR_LEN_TABLE,
- "name": "UTF-16BE",
-}
-
-# UCS2-LE
-# fmt: off
-UCS2LE_CLS = (
- 0, 0, 0, 0, 0, 0, 0, 0, # 00 - 07
- 0, 0, 1, 0, 0, 2, 0, 0, # 08 - 0f
- 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17
- 0, 0, 0, 3, 0, 0, 0, 0, # 18 - 1f
- 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27
- 0, 3, 3, 3, 3, 3, 0, 0, # 28 - 2f
- 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37
- 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f
- 0, 0, 0, 0, 0, 0, 0, 0, # 40 - 47
- 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f
- 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57
- 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f
- 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67
- 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f
- 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77
- 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f
- 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87
- 0, 0, 0, 0, 0, 0, 0, 0, # 88 - 8f
- 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97
- 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f
- 0, 0, 0, 0, 0, 0, 0, 0, # a0 - a7
- 0, 0, 0, 0, 0, 0, 0, 0, # a8 - af
- 0, 0, 0, 0, 0, 0, 0, 0, # b0 - b7
- 0, 0, 0, 0, 0, 0, 0, 0, # b8 - bf
- 0, 0, 0, 0, 0, 0, 0, 0, # c0 - c7
- 0, 0, 0, 0, 0, 0, 0, 0, # c8 - cf
- 0, 0, 0, 0, 0, 0, 0, 0, # d0 - d7
- 0, 0, 0, 0, 0, 0, 0, 0, # d8 - df
- 0, 0, 0, 0, 0, 0, 0, 0, # e0 - e7
- 0, 0, 0, 0, 0, 0, 0, 0, # e8 - ef
- 0, 0, 0, 0, 0, 0, 0, 0, # f0 - f7
- 0, 0, 0, 0, 0, 0, 4, 5 # f8 - ff
-)
-
-UCS2LE_ST = (
- 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
- MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17
- 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f
- 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27
- 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f
- 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37
-)
-# fmt: on
-
-UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2)
-
-UCS2LE_SM_MODEL: CodingStateMachineDict = {
- "class_table": UCS2LE_CLS,
- "class_factor": 6,
- "state_table": UCS2LE_ST,
- "char_len_table": UCS2LE_CHAR_LEN_TABLE,
- "name": "UTF-16LE",
-}
-
-# UTF-8
-# fmt: off
-UTF8_CLS = (
- 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 #allow 0x00 as a legal value
- 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f
- 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17
- 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f
- 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27
- 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f
- 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37
- 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f
- 1, 1, 1, 1, 1, 1, 1, 1, # 40 - 47
- 1, 1, 1, 1, 1, 1, 1, 1, # 48 - 4f
- 1, 1, 1, 1, 1, 1, 1, 1, # 50 - 57
- 1, 1, 1, 1, 1, 1, 1, 1, # 58 - 5f
- 1, 1, 1, 1, 1, 1, 1, 1, # 60 - 67
- 1, 1, 1, 1, 1, 1, 1, 1, # 68 - 6f
- 1, 1, 1, 1, 1, 1, 1, 1, # 70 - 77
- 1, 1, 1, 1, 1, 1, 1, 1, # 78 - 7f
- 2, 2, 2, 2, 3, 3, 3, 3, # 80 - 87
- 4, 4, 4, 4, 4, 4, 4, 4, # 88 - 8f
- 4, 4, 4, 4, 4, 4, 4, 4, # 90 - 97
- 4, 4, 4, 4, 4, 4, 4, 4, # 98 - 9f
- 5, 5, 5, 5, 5, 5, 5, 5, # a0 - a7
- 5, 5, 5, 5, 5, 5, 5, 5, # a8 - af
- 5, 5, 5, 5, 5, 5, 5, 5, # b0 - b7
- 5, 5, 5, 5, 5, 5, 5, 5, # b8 - bf
- 0, 0, 6, 6, 6, 6, 6, 6, # c0 - c7
- 6, 6, 6, 6, 6, 6, 6, 6, # c8 - cf
- 6, 6, 6, 6, 6, 6, 6, 6, # d0 - d7
- 6, 6, 6, 6, 6, 6, 6, 6, # d8 - df
- 7, 8, 8, 8, 8, 8, 8, 8, # e0 - e7
- 8, 8, 8, 8, 8, 9, 8, 8, # e8 - ef
- 10, 11, 11, 11, 11, 11, 11, 11, # f0 - f7
- 12, 13, 13, 13, 14, 15, 0, 0 # f8 - ff
-)
-
-UTF8_ST = (
- MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07
- 9, 11, 8, 7, 6, 5, 4, 3,#08-0f
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f
- MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f
- MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f
- MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f
- MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af
- MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf
- MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf
-)
-# fmt: on
-
-UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6)
-
-UTF8_SM_MODEL: CodingStateMachineDict = {
- "class_table": UTF8_CLS,
- "class_factor": 16,
- "state_table": UTF8_ST,
- "char_len_table": UTF8_CHAR_LEN_TABLE,
- "name": "UTF-8",
-}
diff --git a/contrib/python/pip/pip/_vendor/chardet/metadata/__init__.py b/contrib/python/pip/pip/_vendor/chardet/metadata/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/metadata/__init__.py
+++ /dev/null
diff --git a/contrib/python/pip/pip/_vendor/chardet/metadata/languages.py b/contrib/python/pip/pip/_vendor/chardet/metadata/languages.py
deleted file mode 100644
index eb40c5f0c8..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/metadata/languages.py
+++ /dev/null
@@ -1,352 +0,0 @@
-"""
-Metadata about languages used by our model training code for our
-SingleByteCharSetProbers. Could be used for other things in the future.
-
-This code is based on the language metadata from the uchardet project.
-"""
-
-from string import ascii_letters
-from typing import List, Optional
-
-# TODO: Add Ukrainian (KOI8-U)
-
-
-class Language:
- """Metadata about a language useful for training models
-
- :ivar name: The human name for the language, in English.
- :type name: str
- :ivar iso_code: 2-letter ISO 639-1 if possible, 3-letter ISO code otherwise,
- or use another catalog as a last resort.
- :type iso_code: str
- :ivar use_ascii: Whether or not ASCII letters should be included in trained
- models.
- :type use_ascii: bool
- :ivar charsets: The charsets we want to support and create data for.
- :type charsets: list of str
- :ivar alphabet: The characters in the language's alphabet. If `use_ascii` is
- `True`, you only need to add those not in the ASCII set.
- :type alphabet: str
- :ivar wiki_start_pages: The Wikipedia pages to start from if we're crawling
- Wikipedia for training data.
- :type wiki_start_pages: list of str
- """
-
- def __init__(
- self,
- name: Optional[str] = None,
- iso_code: Optional[str] = None,
- use_ascii: bool = True,
- charsets: Optional[List[str]] = None,
- alphabet: Optional[str] = None,
- wiki_start_pages: Optional[List[str]] = None,
- ) -> None:
- super().__init__()
- self.name = name
- self.iso_code = iso_code
- self.use_ascii = use_ascii
- self.charsets = charsets
- if self.use_ascii:
- if alphabet:
- alphabet += ascii_letters
- else:
- alphabet = ascii_letters
- elif not alphabet:
- raise ValueError("Must supply alphabet if use_ascii is False")
- self.alphabet = "".join(sorted(set(alphabet))) if alphabet else None
- self.wiki_start_pages = wiki_start_pages
-
- def __repr__(self) -> str:
- param_str = ", ".join(
- f"{k}={v!r}" for k, v in self.__dict__.items() if not k.startswith("_")
- )
- return f"{self.__class__.__name__}({param_str})"
-
-
-LANGUAGES = {
- "Arabic": Language(
- name="Arabic",
- iso_code="ar",
- use_ascii=False,
- # We only support encodings that use isolated
- # forms, because the current recommendation is
- # that the rendering system handles presentation
- # forms. This means we purposefully skip IBM864.
- charsets=["ISO-8859-6", "WINDOWS-1256", "CP720", "CP864"],
- alphabet="ءآأؤإئابةتثجحخدذرزسشصضطظعغػؼؽؾؿـفقكلمنهوىيًٌٍَُِّ",
- wiki_start_pages=["الصفحة_الرئيسية"],
- ),
- "Belarusian": Language(
- name="Belarusian",
- iso_code="be",
- use_ascii=False,
- charsets=["ISO-8859-5", "WINDOWS-1251", "IBM866", "MacCyrillic"],
- alphabet="АБВГДЕЁЖЗІЙКЛМНОПРСТУЎФХЦЧШЫЬЭЮЯабвгдеёжзійклмнопрстуўфхцчшыьэюяʼ",
- wiki_start_pages=["Галоўная_старонка"],
- ),
- "Bulgarian": Language(
- name="Bulgarian",
- iso_code="bg",
- use_ascii=False,
- charsets=["ISO-8859-5", "WINDOWS-1251", "IBM855"],
- alphabet="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцчшщъьюя",
- wiki_start_pages=["Начална_страница"],
- ),
- "Czech": Language(
- name="Czech",
- iso_code="cz",
- use_ascii=True,
- charsets=["ISO-8859-2", "WINDOWS-1250"],
- alphabet="áčďéěíňóřšťúůýžÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ",
- wiki_start_pages=["Hlavní_strana"],
- ),
- "Danish": Language(
- name="Danish",
- iso_code="da",
- use_ascii=True,
- charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"],
- alphabet="æøåÆØÅ",
- wiki_start_pages=["Forside"],
- ),
- "German": Language(
- name="German",
- iso_code="de",
- use_ascii=True,
- charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"],
- alphabet="äöüßẞÄÖÜ",
- wiki_start_pages=["Wikipedia:Hauptseite"],
- ),
- "Greek": Language(
- name="Greek",
- iso_code="el",
- use_ascii=False,
- charsets=["ISO-8859-7", "WINDOWS-1253"],
- alphabet="αβγδεζηθικλμνξοπρσςτυφχψωάέήίόύώΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΣΤΥΦΧΨΩΆΈΉΊΌΎΏ",
- wiki_start_pages=["Πύλη:Κύρια"],
- ),
- "English": Language(
- name="English",
- iso_code="en",
- use_ascii=True,
- charsets=["ISO-8859-1", "WINDOWS-1252", "MacRoman"],
- wiki_start_pages=["Main_Page"],
- ),
- "Esperanto": Language(
- name="Esperanto",
- iso_code="eo",
- # Q, W, X, and Y not used at all
- use_ascii=False,
- charsets=["ISO-8859-3"],
- alphabet="abcĉdefgĝhĥijĵklmnoprsŝtuŭvzABCĈDEFGĜHĤIJĴKLMNOPRSŜTUŬVZ",
- wiki_start_pages=["Vikipedio:Ĉefpaĝo"],
- ),
- "Spanish": Language(
- name="Spanish",
- iso_code="es",
- use_ascii=True,
- charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"],
- alphabet="ñáéíóúüÑÁÉÍÓÚÜ",
- wiki_start_pages=["Wikipedia:Portada"],
- ),
- "Estonian": Language(
- name="Estonian",
- iso_code="et",
- use_ascii=False,
- charsets=["ISO-8859-4", "ISO-8859-13", "WINDOWS-1257"],
- # C, F, Š, Q, W, X, Y, Z, Ž are only for
- # loanwords
- alphabet="ABDEGHIJKLMNOPRSTUVÕÄÖÜabdeghijklmnoprstuvõäöü",
- wiki_start_pages=["Esileht"],
- ),
- "Finnish": Language(
- name="Finnish",
- iso_code="fi",
- use_ascii=True,
- charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"],
- alphabet="ÅÄÖŠŽåäöšž",
- wiki_start_pages=["Wikipedia:Etusivu"],
- ),
- "French": Language(
- name="French",
- iso_code="fr",
- use_ascii=True,
- charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"],
- alphabet="œàâçèéîïùûêŒÀÂÇÈÉÎÏÙÛÊ",
- wiki_start_pages=["Wikipédia:Accueil_principal", "Bœuf (animal)"],
- ),
- "Hebrew": Language(
- name="Hebrew",
- iso_code="he",
- use_ascii=False,
- charsets=["ISO-8859-8", "WINDOWS-1255"],
- alphabet="אבגדהוזחטיךכלםמןנסעףפץצקרשתװױײ",
- wiki_start_pages=["עמוד_ראשי"],
- ),
- "Croatian": Language(
- name="Croatian",
- iso_code="hr",
- # Q, W, X, Y are only used for foreign words.
- use_ascii=False,
- charsets=["ISO-8859-2", "WINDOWS-1250"],
- alphabet="abcčćdđefghijklmnoprsštuvzžABCČĆDĐEFGHIJKLMNOPRSŠTUVZŽ",
- wiki_start_pages=["Glavna_stranica"],
- ),
- "Hungarian": Language(
- name="Hungarian",
- iso_code="hu",
- # Q, W, X, Y are only used for foreign words.
- use_ascii=False,
- charsets=["ISO-8859-2", "WINDOWS-1250"],
- alphabet="abcdefghijklmnoprstuvzáéíóöőúüűABCDEFGHIJKLMNOPRSTUVZÁÉÍÓÖŐÚÜŰ",
- wiki_start_pages=["Kezdőlap"],
- ),
- "Italian": Language(
- name="Italian",
- iso_code="it",
- use_ascii=True,
- charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"],
- alphabet="ÀÈÉÌÒÓÙàèéìòóù",
- wiki_start_pages=["Pagina_principale"],
- ),
- "Lithuanian": Language(
- name="Lithuanian",
- iso_code="lt",
- use_ascii=False,
- charsets=["ISO-8859-13", "WINDOWS-1257", "ISO-8859-4"],
- # Q, W, and X not used at all
- alphabet="AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽaąbcčdeęėfghiįyjklmnoprsštuųūvzž",
- wiki_start_pages=["Pagrindinis_puslapis"],
- ),
- "Latvian": Language(
- name="Latvian",
- iso_code="lv",
- use_ascii=False,
- charsets=["ISO-8859-13", "WINDOWS-1257", "ISO-8859-4"],
- # Q, W, X, Y are only for loanwords
- alphabet="AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽaābcčdeēfgģhiījkķlļmnņoprsštuūvzž",
- wiki_start_pages=["Sākumlapa"],
- ),
- "Macedonian": Language(
- name="Macedonian",
- iso_code="mk",
- use_ascii=False,
- charsets=["ISO-8859-5", "WINDOWS-1251", "MacCyrillic", "IBM855"],
- alphabet="АБВГДЃЕЖЗЅИЈКЛЉМНЊОПРСТЌУФХЦЧЏШабвгдѓежзѕијклљмнњопрстќуфхцчџш",
- wiki_start_pages=["Главна_страница"],
- ),
- "Dutch": Language(
- name="Dutch",
- iso_code="nl",
- use_ascii=True,
- charsets=["ISO-8859-1", "WINDOWS-1252", "MacRoman"],
- wiki_start_pages=["Hoofdpagina"],
- ),
- "Polish": Language(
- name="Polish",
- iso_code="pl",
- # Q and X are only used for foreign words.
- use_ascii=False,
- charsets=["ISO-8859-2", "WINDOWS-1250"],
- alphabet="AĄBCĆDEĘFGHIJKLŁMNŃOÓPRSŚTUWYZŹŻaąbcćdeęfghijklłmnńoóprsśtuwyzźż",
- wiki_start_pages=["Wikipedia:Strona_główna"],
- ),
- "Portuguese": Language(
- name="Portuguese",
- iso_code="pt",
- use_ascii=True,
- charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"],
- alphabet="ÁÂÃÀÇÉÊÍÓÔÕÚáâãàçéêíóôõú",
- wiki_start_pages=["Wikipédia:Página_principal"],
- ),
- "Romanian": Language(
- name="Romanian",
- iso_code="ro",
- use_ascii=True,
- charsets=["ISO-8859-2", "WINDOWS-1250"],
- alphabet="ăâîșțĂÂÎȘȚ",
- wiki_start_pages=["Pagina_principală"],
- ),
- "Russian": Language(
- name="Russian",
- iso_code="ru",
- use_ascii=False,
- charsets=[
- "ISO-8859-5",
- "WINDOWS-1251",
- "KOI8-R",
- "MacCyrillic",
- "IBM866",
- "IBM855",
- ],
- alphabet="абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ",
- wiki_start_pages=["Заглавная_страница"],
- ),
- "Slovak": Language(
- name="Slovak",
- iso_code="sk",
- use_ascii=True,
- charsets=["ISO-8859-2", "WINDOWS-1250"],
- alphabet="áäčďéíĺľňóôŕšťúýžÁÄČĎÉÍĹĽŇÓÔŔŠŤÚÝŽ",
- wiki_start_pages=["Hlavná_stránka"],
- ),
- "Slovene": Language(
- name="Slovene",
- iso_code="sl",
- # Q, W, X, Y are only used for foreign words.
- use_ascii=False,
- charsets=["ISO-8859-2", "WINDOWS-1250"],
- alphabet="abcčdefghijklmnoprsštuvzžABCČDEFGHIJKLMNOPRSŠTUVZŽ",
- wiki_start_pages=["Glavna_stran"],
- ),
- # Serbian can be written in both Latin and Cyrillic, but there's no
- # simple way to get the Latin alphabet pages from Wikipedia through
- # the API, so for now we just support Cyrillic.
- "Serbian": Language(
- name="Serbian",
- iso_code="sr",
- alphabet="АБВГДЂЕЖЗИЈКЛЉМНЊОПРСТЋУФХЦЧЏШабвгдђежзијклљмнњопрстћуфхцчџш",
- charsets=["ISO-8859-5", "WINDOWS-1251", "MacCyrillic", "IBM855"],
- wiki_start_pages=["Главна_страна"],
- ),
- "Thai": Language(
- name="Thai",
- iso_code="th",
- use_ascii=False,
- charsets=["ISO-8859-11", "TIS-620", "CP874"],
- alphabet="กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛",
- wiki_start_pages=["หน้าหลัก"],
- ),
- "Turkish": Language(
- name="Turkish",
- iso_code="tr",
- # Q, W, and X are not used by Turkish
- use_ascii=False,
- charsets=["ISO-8859-3", "ISO-8859-9", "WINDOWS-1254"],
- alphabet="abcçdefgğhıijklmnoöprsştuüvyzâîûABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZÂÎÛ",
- wiki_start_pages=["Ana_Sayfa"],
- ),
- "Vietnamese": Language(
- name="Vietnamese",
- iso_code="vi",
- use_ascii=False,
- # Windows-1258 is the only common 8-bit
- # Vietnamese encoding supported by Python.
- # From Wikipedia:
- # For systems that lack support for Unicode,
- # dozens of 8-bit Vietnamese code pages are
- # available.[1] The most common are VISCII
- # (TCVN 5712:1993), VPS, and Windows-1258.[3]
- # Where ASCII is required, such as when
- # ensuring readability in plain text e-mail,
- # Vietnamese letters are often encoded
- # according to Vietnamese Quoted-Readable
- # (VIQR) or VSCII Mnemonic (VSCII-MNEM),[4]
- # though usage of either variable-width
- # scheme has declined dramatically following
- # the adoption of Unicode on the World Wide
- # Web.
- charsets=["WINDOWS-1258"],
- alphabet="aăâbcdđeêghiklmnoôơpqrstuưvxyAĂÂBCDĐEÊGHIKLMNOÔƠPQRSTUƯVXY",
- wiki_start_pages=["Chữ_Quốc_ngữ"],
- ),
-}
diff --git a/contrib/python/pip/pip/_vendor/chardet/py.typed b/contrib/python/pip/pip/_vendor/chardet/py.typed
deleted file mode 100644
index e69de29bb2..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/py.typed
+++ /dev/null
diff --git a/contrib/python/pip/pip/_vendor/chardet/resultdict.py b/contrib/python/pip/pip/_vendor/chardet/resultdict.py
deleted file mode 100644
index 7d36e64c46..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/resultdict.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from typing import TYPE_CHECKING, Optional
-
-if TYPE_CHECKING:
- # TypedDict was introduced in Python 3.8.
- #
- # TODO: Remove the else block and TYPE_CHECKING check when dropping support
- # for Python 3.7.
- from typing import TypedDict
-
- class ResultDict(TypedDict):
- encoding: Optional[str]
- confidence: float
- language: Optional[str]
-
-else:
- ResultDict = dict
diff --git a/contrib/python/pip/pip/_vendor/chardet/sbcharsetprober.py b/contrib/python/pip/pip/_vendor/chardet/sbcharsetprober.py
deleted file mode 100644
index 0ffbcdd2c3..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/sbcharsetprober.py
+++ /dev/null
@@ -1,162 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import Dict, List, NamedTuple, Optional, Union
-
-from .charsetprober import CharSetProber
-from .enums import CharacterCategory, ProbingState, SequenceLikelihood
-
-
-class SingleByteCharSetModel(NamedTuple):
- charset_name: str
- language: str
- char_to_order_map: Dict[int, int]
- language_model: Dict[int, Dict[int, int]]
- typical_positive_ratio: float
- keep_ascii_letters: bool
- alphabet: str
-
-
-class SingleByteCharSetProber(CharSetProber):
- SAMPLE_SIZE = 64
- SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2
- POSITIVE_SHORTCUT_THRESHOLD = 0.95
- NEGATIVE_SHORTCUT_THRESHOLD = 0.05
-
- def __init__(
- self,
- model: SingleByteCharSetModel,
- is_reversed: bool = False,
- name_prober: Optional[CharSetProber] = None,
- ) -> None:
- super().__init__()
- self._model = model
- # TRUE if we need to reverse every pair in the model lookup
- self._reversed = is_reversed
- # Optional auxiliary prober for name decision
- self._name_prober = name_prober
- self._last_order = 255
- self._seq_counters: List[int] = []
- self._total_seqs = 0
- self._total_char = 0
- self._control_char = 0
- self._freq_char = 0
- self.reset()
-
- def reset(self) -> None:
- super().reset()
- # char order of last character
- self._last_order = 255
- self._seq_counters = [0] * SequenceLikelihood.get_num_categories()
- self._total_seqs = 0
- self._total_char = 0
- self._control_char = 0
- # characters that fall in our sampling range
- self._freq_char = 0
-
- @property
- def charset_name(self) -> Optional[str]:
- if self._name_prober:
- return self._name_prober.charset_name
- return self._model.charset_name
-
- @property
- def language(self) -> Optional[str]:
- if self._name_prober:
- return self._name_prober.language
- return self._model.language
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- # TODO: Make filter_international_words keep things in self.alphabet
- if not self._model.keep_ascii_letters:
- byte_str = self.filter_international_words(byte_str)
- else:
- byte_str = self.remove_xml_tags(byte_str)
- if not byte_str:
- return self.state
- char_to_order_map = self._model.char_to_order_map
- language_model = self._model.language_model
- for char in byte_str:
- order = char_to_order_map.get(char, CharacterCategory.UNDEFINED)
- # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but
- # CharacterCategory.SYMBOL is actually 253, so we use CONTROL
- # to make it closer to the original intent. The only difference
- # is whether or not we count digits and control characters for
- # _total_char purposes.
- if order < CharacterCategory.CONTROL:
- self._total_char += 1
- if order < self.SAMPLE_SIZE:
- self._freq_char += 1
- if self._last_order < self.SAMPLE_SIZE:
- self._total_seqs += 1
- if not self._reversed:
- lm_cat = language_model[self._last_order][order]
- else:
- lm_cat = language_model[order][self._last_order]
- self._seq_counters[lm_cat] += 1
- self._last_order = order
-
- charset_name = self._model.charset_name
- if self.state == ProbingState.DETECTING:
- if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD:
- confidence = self.get_confidence()
- if confidence > self.POSITIVE_SHORTCUT_THRESHOLD:
- self.logger.debug(
- "%s confidence = %s, we have a winner", charset_name, confidence
- )
- self._state = ProbingState.FOUND_IT
- elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD:
- self.logger.debug(
- "%s confidence = %s, below negative shortcut threshold %s",
- charset_name,
- confidence,
- self.NEGATIVE_SHORTCUT_THRESHOLD,
- )
- self._state = ProbingState.NOT_ME
-
- return self.state
-
- def get_confidence(self) -> float:
- r = 0.01
- if self._total_seqs > 0:
- r = (
- (
- self._seq_counters[SequenceLikelihood.POSITIVE]
- + 0.25 * self._seq_counters[SequenceLikelihood.LIKELY]
- )
- / self._total_seqs
- / self._model.typical_positive_ratio
- )
- # The more control characters (proportionnaly to the size
- # of the text), the less confident we become in the current
- # charset.
- r = r * (self._total_char - self._control_char) / self._total_char
- r = r * self._freq_char / self._total_char
- if r >= 1.0:
- r = 0.99
- return r
diff --git a/contrib/python/pip/pip/_vendor/chardet/sbcsgroupprober.py b/contrib/python/pip/pip/_vendor/chardet/sbcsgroupprober.py
deleted file mode 100644
index 890ae8465c..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/sbcsgroupprober.py
+++ /dev/null
@@ -1,88 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .charsetgroupprober import CharSetGroupProber
-from .hebrewprober import HebrewProber
-from .langbulgarianmodel import ISO_8859_5_BULGARIAN_MODEL, WINDOWS_1251_BULGARIAN_MODEL
-from .langgreekmodel import ISO_8859_7_GREEK_MODEL, WINDOWS_1253_GREEK_MODEL
-from .langhebrewmodel import WINDOWS_1255_HEBREW_MODEL
-
-# from .langhungarianmodel import (ISO_8859_2_HUNGARIAN_MODEL,
-# WINDOWS_1250_HUNGARIAN_MODEL)
-from .langrussianmodel import (
- IBM855_RUSSIAN_MODEL,
- IBM866_RUSSIAN_MODEL,
- ISO_8859_5_RUSSIAN_MODEL,
- KOI8_R_RUSSIAN_MODEL,
- MACCYRILLIC_RUSSIAN_MODEL,
- WINDOWS_1251_RUSSIAN_MODEL,
-)
-from .langthaimodel import TIS_620_THAI_MODEL
-from .langturkishmodel import ISO_8859_9_TURKISH_MODEL
-from .sbcharsetprober import SingleByteCharSetProber
-
-
-class SBCSGroupProber(CharSetGroupProber):
- def __init__(self) -> None:
- super().__init__()
- hebrew_prober = HebrewProber()
- logical_hebrew_prober = SingleByteCharSetProber(
- WINDOWS_1255_HEBREW_MODEL, is_reversed=False, name_prober=hebrew_prober
- )
- # TODO: See if using ISO-8859-8 Hebrew model works better here, since
- # it's actually the visual one
- visual_hebrew_prober = SingleByteCharSetProber(
- WINDOWS_1255_HEBREW_MODEL, is_reversed=True, name_prober=hebrew_prober
- )
- hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober)
- # TODO: ORDER MATTERS HERE. I changed the order vs what was in master
- # and several tests failed that did not before. Some thought
- # should be put into the ordering, and we should consider making
- # order not matter here, because that is very counter-intuitive.
- self.probers = [
- SingleByteCharSetProber(WINDOWS_1251_RUSSIAN_MODEL),
- SingleByteCharSetProber(KOI8_R_RUSSIAN_MODEL),
- SingleByteCharSetProber(ISO_8859_5_RUSSIAN_MODEL),
- SingleByteCharSetProber(MACCYRILLIC_RUSSIAN_MODEL),
- SingleByteCharSetProber(IBM866_RUSSIAN_MODEL),
- SingleByteCharSetProber(IBM855_RUSSIAN_MODEL),
- SingleByteCharSetProber(ISO_8859_7_GREEK_MODEL),
- SingleByteCharSetProber(WINDOWS_1253_GREEK_MODEL),
- SingleByteCharSetProber(ISO_8859_5_BULGARIAN_MODEL),
- SingleByteCharSetProber(WINDOWS_1251_BULGARIAN_MODEL),
- # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250)
- # after we retrain model.
- # SingleByteCharSetProber(ISO_8859_2_HUNGARIAN_MODEL),
- # SingleByteCharSetProber(WINDOWS_1250_HUNGARIAN_MODEL),
- SingleByteCharSetProber(TIS_620_THAI_MODEL),
- SingleByteCharSetProber(ISO_8859_9_TURKISH_MODEL),
- hebrew_prober,
- logical_hebrew_prober,
- visual_hebrew_prober,
- ]
- self.reset()
diff --git a/contrib/python/pip/pip/_vendor/chardet/sjisprober.py b/contrib/python/pip/pip/_vendor/chardet/sjisprober.py
deleted file mode 100644
index 91df077961..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/sjisprober.py
+++ /dev/null
@@ -1,105 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import Union
-
-from .chardistribution import SJISDistributionAnalysis
-from .codingstatemachine import CodingStateMachine
-from .enums import MachineState, ProbingState
-from .jpcntx import SJISContextAnalysis
-from .mbcharsetprober import MultiByteCharSetProber
-from .mbcssm import SJIS_SM_MODEL
-
-
-class SJISProber(MultiByteCharSetProber):
- def __init__(self) -> None:
- super().__init__()
- self.coding_sm = CodingStateMachine(SJIS_SM_MODEL)
- self.distribution_analyzer = SJISDistributionAnalysis()
- self.context_analyzer = SJISContextAnalysis()
- self.reset()
-
- def reset(self) -> None:
- super().reset()
- self.context_analyzer.reset()
-
- @property
- def charset_name(self) -> str:
- return self.context_analyzer.charset_name
-
- @property
- def language(self) -> str:
- return "Japanese"
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- assert self.coding_sm is not None
- assert self.distribution_analyzer is not None
-
- for i, byte in enumerate(byte_str):
- coding_state = self.coding_sm.next_state(byte)
- if coding_state == MachineState.ERROR:
- self.logger.debug(
- "%s %s prober hit error at byte %s",
- self.charset_name,
- self.language,
- i,
- )
- self._state = ProbingState.NOT_ME
- break
- if coding_state == MachineState.ITS_ME:
- self._state = ProbingState.FOUND_IT
- break
- if coding_state == MachineState.START:
- char_len = self.coding_sm.get_current_charlen()
- if i == 0:
- self._last_char[1] = byte
- self.context_analyzer.feed(
- self._last_char[2 - char_len :], char_len
- )
- self.distribution_analyzer.feed(self._last_char, char_len)
- else:
- self.context_analyzer.feed(
- byte_str[i + 1 - char_len : i + 3 - char_len], char_len
- )
- self.distribution_analyzer.feed(byte_str[i - 1 : i + 1], char_len)
-
- self._last_char[0] = byte_str[-1]
-
- if self.state == ProbingState.DETECTING:
- if self.context_analyzer.got_enough_data() and (
- self.get_confidence() > self.SHORTCUT_THRESHOLD
- ):
- self._state = ProbingState.FOUND_IT
-
- return self.state
-
- def get_confidence(self) -> float:
- assert self.distribution_analyzer is not None
-
- context_conf = self.context_analyzer.get_confidence()
- distrib_conf = self.distribution_analyzer.get_confidence()
- return max(context_conf, distrib_conf)
diff --git a/contrib/python/pip/pip/_vendor/chardet/universaldetector.py b/contrib/python/pip/pip/_vendor/chardet/universaldetector.py
deleted file mode 100644
index 30c441dc28..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/universaldetector.py
+++ /dev/null
@@ -1,362 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-"""
-Module containing the UniversalDetector detector class, which is the primary
-class a user of ``chardet`` should use.
-
-:author: Mark Pilgrim (initial port to Python)
-:author: Shy Shalom (original C code)
-:author: Dan Blanchard (major refactoring for 3.0)
-:author: Ian Cordasco
-"""
-
-
-import codecs
-import logging
-import re
-from typing import List, Optional, Union
-
-from .charsetgroupprober import CharSetGroupProber
-from .charsetprober import CharSetProber
-from .enums import InputState, LanguageFilter, ProbingState
-from .escprober import EscCharSetProber
-from .latin1prober import Latin1Prober
-from .macromanprober import MacRomanProber
-from .mbcsgroupprober import MBCSGroupProber
-from .resultdict import ResultDict
-from .sbcsgroupprober import SBCSGroupProber
-from .utf1632prober import UTF1632Prober
-
-
-class UniversalDetector:
- """
- The ``UniversalDetector`` class underlies the ``chardet.detect`` function
- and coordinates all of the different charset probers.
-
- To get a ``dict`` containing an encoding and its confidence, you can simply
- run:
-
- .. code::
-
- u = UniversalDetector()
- u.feed(some_bytes)
- u.close()
- detected = u.result
-
- """
-
- MINIMUM_THRESHOLD = 0.20
- HIGH_BYTE_DETECTOR = re.compile(b"[\x80-\xFF]")
- ESC_DETECTOR = re.compile(b"(\033|~{)")
- WIN_BYTE_DETECTOR = re.compile(b"[\x80-\x9F]")
- ISO_WIN_MAP = {
- "iso-8859-1": "Windows-1252",
- "iso-8859-2": "Windows-1250",
- "iso-8859-5": "Windows-1251",
- "iso-8859-6": "Windows-1256",
- "iso-8859-7": "Windows-1253",
- "iso-8859-8": "Windows-1255",
- "iso-8859-9": "Windows-1254",
- "iso-8859-13": "Windows-1257",
- }
- # Based on https://encoding.spec.whatwg.org/#names-and-labels
- # but altered to match Python names for encodings and remove mappings
- # that break tests.
- LEGACY_MAP = {
- "ascii": "Windows-1252",
- "iso-8859-1": "Windows-1252",
- "tis-620": "ISO-8859-11",
- "iso-8859-9": "Windows-1254",
- "gb2312": "GB18030",
- "euc-kr": "CP949",
- "utf-16le": "UTF-16",
- }
-
- def __init__(
- self,
- lang_filter: LanguageFilter = LanguageFilter.ALL,
- should_rename_legacy: bool = False,
- ) -> None:
- self._esc_charset_prober: Optional[EscCharSetProber] = None
- self._utf1632_prober: Optional[UTF1632Prober] = None
- self._charset_probers: List[CharSetProber] = []
- self.result: ResultDict = {
- "encoding": None,
- "confidence": 0.0,
- "language": None,
- }
- self.done = False
- self._got_data = False
- self._input_state = InputState.PURE_ASCII
- self._last_char = b""
- self.lang_filter = lang_filter
- self.logger = logging.getLogger(__name__)
- self._has_win_bytes = False
- self.should_rename_legacy = should_rename_legacy
- self.reset()
-
- @property
- def input_state(self) -> int:
- return self._input_state
-
- @property
- def has_win_bytes(self) -> bool:
- return self._has_win_bytes
-
- @property
- def charset_probers(self) -> List[CharSetProber]:
- return self._charset_probers
-
- def reset(self) -> None:
- """
- Reset the UniversalDetector and all of its probers back to their
- initial states. This is called by ``__init__``, so you only need to
- call this directly in between analyses of different documents.
- """
- self.result = {"encoding": None, "confidence": 0.0, "language": None}
- self.done = False
- self._got_data = False
- self._has_win_bytes = False
- self._input_state = InputState.PURE_ASCII
- self._last_char = b""
- if self._esc_charset_prober:
- self._esc_charset_prober.reset()
- if self._utf1632_prober:
- self._utf1632_prober.reset()
- for prober in self._charset_probers:
- prober.reset()
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> None:
- """
- Takes a chunk of a document and feeds it through all of the relevant
- charset probers.
-
- After calling ``feed``, you can check the value of the ``done``
- attribute to see if you need to continue feeding the
- ``UniversalDetector`` more data, or if it has made a prediction
- (in the ``result`` attribute).
-
- .. note::
- You should always call ``close`` when you're done feeding in your
- document if ``done`` is not already ``True``.
- """
- if self.done:
- return
-
- if not byte_str:
- return
-
- if not isinstance(byte_str, bytearray):
- byte_str = bytearray(byte_str)
-
- # First check for known BOMs, since these are guaranteed to be correct
- if not self._got_data:
- # If the data starts with BOM, we know it is UTF
- if byte_str.startswith(codecs.BOM_UTF8):
- # EF BB BF UTF-8 with BOM
- self.result = {
- "encoding": "UTF-8-SIG",
- "confidence": 1.0,
- "language": "",
- }
- elif byte_str.startswith((codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE)):
- # FF FE 00 00 UTF-32, little-endian BOM
- # 00 00 FE FF UTF-32, big-endian BOM
- self.result = {"encoding": "UTF-32", "confidence": 1.0, "language": ""}
- elif byte_str.startswith(b"\xFE\xFF\x00\x00"):
- # FE FF 00 00 UCS-4, unusual octet order BOM (3412)
- self.result = {
- # TODO: This encoding is not supported by Python. Should remove?
- "encoding": "X-ISO-10646-UCS-4-3412",
- "confidence": 1.0,
- "language": "",
- }
- elif byte_str.startswith(b"\x00\x00\xFF\xFE"):
- # 00 00 FF FE UCS-4, unusual octet order BOM (2143)
- self.result = {
- # TODO: This encoding is not supported by Python. Should remove?
- "encoding": "X-ISO-10646-UCS-4-2143",
- "confidence": 1.0,
- "language": "",
- }
- elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)):
- # FF FE UTF-16, little endian BOM
- # FE FF UTF-16, big endian BOM
- self.result = {"encoding": "UTF-16", "confidence": 1.0, "language": ""}
-
- self._got_data = True
- if self.result["encoding"] is not None:
- self.done = True
- return
-
- # If none of those matched and we've only see ASCII so far, check
- # for high bytes and escape sequences
- if self._input_state == InputState.PURE_ASCII:
- if self.HIGH_BYTE_DETECTOR.search(byte_str):
- self._input_state = InputState.HIGH_BYTE
- elif (
- self._input_state == InputState.PURE_ASCII
- and self.ESC_DETECTOR.search(self._last_char + byte_str)
- ):
- self._input_state = InputState.ESC_ASCII
-
- self._last_char = byte_str[-1:]
-
- # next we will look to see if it is appears to be either a UTF-16 or
- # UTF-32 encoding
- if not self._utf1632_prober:
- self._utf1632_prober = UTF1632Prober()
-
- if self._utf1632_prober.state == ProbingState.DETECTING:
- if self._utf1632_prober.feed(byte_str) == ProbingState.FOUND_IT:
- self.result = {
- "encoding": self._utf1632_prober.charset_name,
- "confidence": self._utf1632_prober.get_confidence(),
- "language": "",
- }
- self.done = True
- return
-
- # If we've seen escape sequences, use the EscCharSetProber, which
- # uses a simple state machine to check for known escape sequences in
- # HZ and ISO-2022 encodings, since those are the only encodings that
- # use such sequences.
- if self._input_state == InputState.ESC_ASCII:
- if not self._esc_charset_prober:
- self._esc_charset_prober = EscCharSetProber(self.lang_filter)
- if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT:
- self.result = {
- "encoding": self._esc_charset_prober.charset_name,
- "confidence": self._esc_charset_prober.get_confidence(),
- "language": self._esc_charset_prober.language,
- }
- self.done = True
- # If we've seen high bytes (i.e., those with values greater than 127),
- # we need to do more complicated checks using all our multi-byte and
- # single-byte probers that are left. The single-byte probers
- # use character bigram distributions to determine the encoding, whereas
- # the multi-byte probers use a combination of character unigram and
- # bigram distributions.
- elif self._input_state == InputState.HIGH_BYTE:
- if not self._charset_probers:
- self._charset_probers = [MBCSGroupProber(self.lang_filter)]
- # If we're checking non-CJK encodings, use single-byte prober
- if self.lang_filter & LanguageFilter.NON_CJK:
- self._charset_probers.append(SBCSGroupProber())
- self._charset_probers.append(Latin1Prober())
- self._charset_probers.append(MacRomanProber())
- for prober in self._charset_probers:
- if prober.feed(byte_str) == ProbingState.FOUND_IT:
- self.result = {
- "encoding": prober.charset_name,
- "confidence": prober.get_confidence(),
- "language": prober.language,
- }
- self.done = True
- break
- if self.WIN_BYTE_DETECTOR.search(byte_str):
- self._has_win_bytes = True
-
- def close(self) -> ResultDict:
- """
- Stop analyzing the current document and come up with a final
- prediction.
-
- :returns: The ``result`` attribute, a ``dict`` with the keys
- `encoding`, `confidence`, and `language`.
- """
- # Don't bother with checks if we're already done
- if self.done:
- return self.result
- self.done = True
-
- if not self._got_data:
- self.logger.debug("no data received!")
-
- # Default to ASCII if it is all we've seen so far
- elif self._input_state == InputState.PURE_ASCII:
- self.result = {"encoding": "ascii", "confidence": 1.0, "language": ""}
-
- # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD
- elif self._input_state == InputState.HIGH_BYTE:
- prober_confidence = None
- max_prober_confidence = 0.0
- max_prober = None
- for prober in self._charset_probers:
- if not prober:
- continue
- prober_confidence = prober.get_confidence()
- if prober_confidence > max_prober_confidence:
- max_prober_confidence = prober_confidence
- max_prober = prober
- if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD):
- charset_name = max_prober.charset_name
- assert charset_name is not None
- lower_charset_name = charset_name.lower()
- confidence = max_prober.get_confidence()
- # Use Windows encoding name instead of ISO-8859 if we saw any
- # extra Windows-specific bytes
- if lower_charset_name.startswith("iso-8859"):
- if self._has_win_bytes:
- charset_name = self.ISO_WIN_MAP.get(
- lower_charset_name, charset_name
- )
- # Rename legacy encodings with superset encodings if asked
- if self.should_rename_legacy:
- charset_name = self.LEGACY_MAP.get(
- (charset_name or "").lower(), charset_name
- )
- self.result = {
- "encoding": charset_name,
- "confidence": confidence,
- "language": max_prober.language,
- }
-
- # Log all prober confidences if none met MINIMUM_THRESHOLD
- if self.logger.getEffectiveLevel() <= logging.DEBUG:
- if self.result["encoding"] is None:
- self.logger.debug("no probers hit minimum threshold")
- for group_prober in self._charset_probers:
- if not group_prober:
- continue
- if isinstance(group_prober, CharSetGroupProber):
- for prober in group_prober.probers:
- self.logger.debug(
- "%s %s confidence = %s",
- prober.charset_name,
- prober.language,
- prober.get_confidence(),
- )
- else:
- self.logger.debug(
- "%s %s confidence = %s",
- group_prober.charset_name,
- group_prober.language,
- group_prober.get_confidence(),
- )
- return self.result
diff --git a/contrib/python/pip/pip/_vendor/chardet/utf1632prober.py b/contrib/python/pip/pip/_vendor/chardet/utf1632prober.py
deleted file mode 100644
index 6bdec63d68..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/utf1632prober.py
+++ /dev/null
@@ -1,225 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-#
-# Contributor(s):
-# Jason Zavaglia
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-from typing import List, Union
-
-from .charsetprober import CharSetProber
-from .enums import ProbingState
-
-
-class UTF1632Prober(CharSetProber):
- """
- This class simply looks for occurrences of zero bytes, and infers
- whether the file is UTF16 or UTF32 (low-endian or big-endian)
- For instance, files looking like ( \0 \0 \0 [nonzero] )+
- have a good probability to be UTF32BE. Files looking like ( \0 [nonzero] )+
- may be guessed to be UTF16BE, and inversely for little-endian varieties.
- """
-
- # how many logical characters to scan before feeling confident of prediction
- MIN_CHARS_FOR_DETECTION = 20
- # a fixed constant ratio of expected zeros or non-zeros in modulo-position.
- EXPECTED_RATIO = 0.94
-
- def __init__(self) -> None:
- super().__init__()
- self.position = 0
- self.zeros_at_mod = [0] * 4
- self.nonzeros_at_mod = [0] * 4
- self._state = ProbingState.DETECTING
- self.quad = [0, 0, 0, 0]
- self.invalid_utf16be = False
- self.invalid_utf16le = False
- self.invalid_utf32be = False
- self.invalid_utf32le = False
- self.first_half_surrogate_pair_detected_16be = False
- self.first_half_surrogate_pair_detected_16le = False
- self.reset()
-
- def reset(self) -> None:
- super().reset()
- self.position = 0
- self.zeros_at_mod = [0] * 4
- self.nonzeros_at_mod = [0] * 4
- self._state = ProbingState.DETECTING
- self.invalid_utf16be = False
- self.invalid_utf16le = False
- self.invalid_utf32be = False
- self.invalid_utf32le = False
- self.first_half_surrogate_pair_detected_16be = False
- self.first_half_surrogate_pair_detected_16le = False
- self.quad = [0, 0, 0, 0]
-
- @property
- def charset_name(self) -> str:
- if self.is_likely_utf32be():
- return "utf-32be"
- if self.is_likely_utf32le():
- return "utf-32le"
- if self.is_likely_utf16be():
- return "utf-16be"
- if self.is_likely_utf16le():
- return "utf-16le"
- # default to something valid
- return "utf-16"
-
- @property
- def language(self) -> str:
- return ""
-
- def approx_32bit_chars(self) -> float:
- return max(1.0, self.position / 4.0)
-
- def approx_16bit_chars(self) -> float:
- return max(1.0, self.position / 2.0)
-
- def is_likely_utf32be(self) -> bool:
- approx_chars = self.approx_32bit_chars()
- return approx_chars >= self.MIN_CHARS_FOR_DETECTION and (
- self.zeros_at_mod[0] / approx_chars > self.EXPECTED_RATIO
- and self.zeros_at_mod[1] / approx_chars > self.EXPECTED_RATIO
- and self.zeros_at_mod[2] / approx_chars > self.EXPECTED_RATIO
- and self.nonzeros_at_mod[3] / approx_chars > self.EXPECTED_RATIO
- and not self.invalid_utf32be
- )
-
- def is_likely_utf32le(self) -> bool:
- approx_chars = self.approx_32bit_chars()
- return approx_chars >= self.MIN_CHARS_FOR_DETECTION and (
- self.nonzeros_at_mod[0] / approx_chars > self.EXPECTED_RATIO
- and self.zeros_at_mod[1] / approx_chars > self.EXPECTED_RATIO
- and self.zeros_at_mod[2] / approx_chars > self.EXPECTED_RATIO
- and self.zeros_at_mod[3] / approx_chars > self.EXPECTED_RATIO
- and not self.invalid_utf32le
- )
-
- def is_likely_utf16be(self) -> bool:
- approx_chars = self.approx_16bit_chars()
- return approx_chars >= self.MIN_CHARS_FOR_DETECTION and (
- (self.nonzeros_at_mod[1] + self.nonzeros_at_mod[3]) / approx_chars
- > self.EXPECTED_RATIO
- and (self.zeros_at_mod[0] + self.zeros_at_mod[2]) / approx_chars
- > self.EXPECTED_RATIO
- and not self.invalid_utf16be
- )
-
- def is_likely_utf16le(self) -> bool:
- approx_chars = self.approx_16bit_chars()
- return approx_chars >= self.MIN_CHARS_FOR_DETECTION and (
- (self.nonzeros_at_mod[0] + self.nonzeros_at_mod[2]) / approx_chars
- > self.EXPECTED_RATIO
- and (self.zeros_at_mod[1] + self.zeros_at_mod[3]) / approx_chars
- > self.EXPECTED_RATIO
- and not self.invalid_utf16le
- )
-
- def validate_utf32_characters(self, quad: List[int]) -> None:
- """
- Validate if the quad of bytes is valid UTF-32.
-
- UTF-32 is valid in the range 0x00000000 - 0x0010FFFF
- excluding 0x0000D800 - 0x0000DFFF
-
- https://en.wikipedia.org/wiki/UTF-32
- """
- if (
- quad[0] != 0
- or quad[1] > 0x10
- or (quad[0] == 0 and quad[1] == 0 and 0xD8 <= quad[2] <= 0xDF)
- ):
- self.invalid_utf32be = True
- if (
- quad[3] != 0
- or quad[2] > 0x10
- or (quad[3] == 0 and quad[2] == 0 and 0xD8 <= quad[1] <= 0xDF)
- ):
- self.invalid_utf32le = True
-
- def validate_utf16_characters(self, pair: List[int]) -> None:
- """
- Validate if the pair of bytes is valid UTF-16.
-
- UTF-16 is valid in the range 0x0000 - 0xFFFF excluding 0xD800 - 0xFFFF
- with an exception for surrogate pairs, which must be in the range
- 0xD800-0xDBFF followed by 0xDC00-0xDFFF
-
- https://en.wikipedia.org/wiki/UTF-16
- """
- if not self.first_half_surrogate_pair_detected_16be:
- if 0xD8 <= pair[0] <= 0xDB:
- self.first_half_surrogate_pair_detected_16be = True
- elif 0xDC <= pair[0] <= 0xDF:
- self.invalid_utf16be = True
- else:
- if 0xDC <= pair[0] <= 0xDF:
- self.first_half_surrogate_pair_detected_16be = False
- else:
- self.invalid_utf16be = True
-
- if not self.first_half_surrogate_pair_detected_16le:
- if 0xD8 <= pair[1] <= 0xDB:
- self.first_half_surrogate_pair_detected_16le = True
- elif 0xDC <= pair[1] <= 0xDF:
- self.invalid_utf16le = True
- else:
- if 0xDC <= pair[1] <= 0xDF:
- self.first_half_surrogate_pair_detected_16le = False
- else:
- self.invalid_utf16le = True
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- for c in byte_str:
- mod4 = self.position % 4
- self.quad[mod4] = c
- if mod4 == 3:
- self.validate_utf32_characters(self.quad)
- self.validate_utf16_characters(self.quad[0:2])
- self.validate_utf16_characters(self.quad[2:4])
- if c == 0:
- self.zeros_at_mod[mod4] += 1
- else:
- self.nonzeros_at_mod[mod4] += 1
- self.position += 1
- return self.state
-
- @property
- def state(self) -> ProbingState:
- if self._state in {ProbingState.NOT_ME, ProbingState.FOUND_IT}:
- # terminal, decided states
- return self._state
- if self.get_confidence() > 0.80:
- self._state = ProbingState.FOUND_IT
- elif self.position > 4 * 1024:
- # if we get to 4kb into the file, and we can't conclude it's UTF,
- # let's give up
- self._state = ProbingState.NOT_ME
- return self._state
-
- def get_confidence(self) -> float:
- return (
- 0.85
- if (
- self.is_likely_utf16le()
- or self.is_likely_utf16be()
- or self.is_likely_utf32le()
- or self.is_likely_utf32be()
- )
- else 0.00
- )
diff --git a/contrib/python/pip/pip/_vendor/chardet/utf8prober.py b/contrib/python/pip/pip/_vendor/chardet/utf8prober.py
deleted file mode 100644
index d96354d97c..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/utf8prober.py
+++ /dev/null
@@ -1,82 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import Union
-
-from .charsetprober import CharSetProber
-from .codingstatemachine import CodingStateMachine
-from .enums import MachineState, ProbingState
-from .mbcssm import UTF8_SM_MODEL
-
-
-class UTF8Prober(CharSetProber):
- ONE_CHAR_PROB = 0.5
-
- def __init__(self) -> None:
- super().__init__()
- self.coding_sm = CodingStateMachine(UTF8_SM_MODEL)
- self._num_mb_chars = 0
- self.reset()
-
- def reset(self) -> None:
- super().reset()
- self.coding_sm.reset()
- self._num_mb_chars = 0
-
- @property
- def charset_name(self) -> str:
- return "utf-8"
-
- @property
- def language(self) -> str:
- return ""
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- for c in byte_str:
- coding_state = self.coding_sm.next_state(c)
- if coding_state == MachineState.ERROR:
- self._state = ProbingState.NOT_ME
- break
- if coding_state == MachineState.ITS_ME:
- self._state = ProbingState.FOUND_IT
- break
- if coding_state == MachineState.START:
- if self.coding_sm.get_current_charlen() >= 2:
- self._num_mb_chars += 1
-
- if self.state == ProbingState.DETECTING:
- if self.get_confidence() > self.SHORTCUT_THRESHOLD:
- self._state = ProbingState.FOUND_IT
-
- return self.state
-
- def get_confidence(self) -> float:
- unlike = 0.99
- if self._num_mb_chars < 6:
- unlike *= self.ONE_CHAR_PROB**self._num_mb_chars
- return 1.0 - unlike
- return unlike
diff --git a/contrib/python/pip/pip/_vendor/chardet/version.py b/contrib/python/pip/pip/_vendor/chardet/version.py
deleted file mode 100644
index c5e9d85cd7..0000000000
--- a/contrib/python/pip/pip/_vendor/chardet/version.py
+++ /dev/null
@@ -1,9 +0,0 @@
-"""
-This module exists only to simplify retrieving the version number of chardet
-from within setuptools and from chardet subpackages.
-
-:author: Dan Blanchard (dan.blanchard@gmail.com)
-"""
-
-__version__ = "5.1.0"
-VERSION = __version__.split(".")
diff --git a/contrib/python/pip/pip/_vendor/colorama/__init__.py b/contrib/python/pip/pip/_vendor/colorama/__init__.py
deleted file mode 100644
index 383101cdb3..0000000000
--- a/contrib/python/pip/pip/_vendor/colorama/__init__.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-from .initialise import init, deinit, reinit, colorama_text, just_fix_windows_console
-from .ansi import Fore, Back, Style, Cursor
-from .ansitowin32 import AnsiToWin32
-
-__version__ = '0.4.6'
-
diff --git a/contrib/python/pip/pip/_vendor/colorama/ansi.py b/contrib/python/pip/pip/_vendor/colorama/ansi.py
deleted file mode 100644
index 11ec695ff7..0000000000
--- a/contrib/python/pip/pip/_vendor/colorama/ansi.py
+++ /dev/null
@@ -1,102 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-'''
-This module generates ANSI character codes to printing colors to terminals.
-See: http://en.wikipedia.org/wiki/ANSI_escape_code
-'''
-
-CSI = '\033['
-OSC = '\033]'
-BEL = '\a'
-
-
-def code_to_chars(code):
- return CSI + str(code) + 'm'
-
-def set_title(title):
- return OSC + '2;' + title + BEL
-
-def clear_screen(mode=2):
- return CSI + str(mode) + 'J'
-
-def clear_line(mode=2):
- return CSI + str(mode) + 'K'
-
-
-class AnsiCodes(object):
- def __init__(self):
- # the subclasses declare class attributes which are numbers.
- # Upon instantiation we define instance attributes, which are the same
- # as the class attributes but wrapped with the ANSI escape sequence
- for name in dir(self):
- if not name.startswith('_'):
- value = getattr(self, name)
- setattr(self, name, code_to_chars(value))
-
-
-class AnsiCursor(object):
- def UP(self, n=1):
- return CSI + str(n) + 'A'
- def DOWN(self, n=1):
- return CSI + str(n) + 'B'
- def FORWARD(self, n=1):
- return CSI + str(n) + 'C'
- def BACK(self, n=1):
- return CSI + str(n) + 'D'
- def POS(self, x=1, y=1):
- return CSI + str(y) + ';' + str(x) + 'H'
-
-
-class AnsiFore(AnsiCodes):
- BLACK = 30
- RED = 31
- GREEN = 32
- YELLOW = 33
- BLUE = 34
- MAGENTA = 35
- CYAN = 36
- WHITE = 37
- RESET = 39
-
- # These are fairly well supported, but not part of the standard.
- LIGHTBLACK_EX = 90
- LIGHTRED_EX = 91
- LIGHTGREEN_EX = 92
- LIGHTYELLOW_EX = 93
- LIGHTBLUE_EX = 94
- LIGHTMAGENTA_EX = 95
- LIGHTCYAN_EX = 96
- LIGHTWHITE_EX = 97
-
-
-class AnsiBack(AnsiCodes):
- BLACK = 40
- RED = 41
- GREEN = 42
- YELLOW = 43
- BLUE = 44
- MAGENTA = 45
- CYAN = 46
- WHITE = 47
- RESET = 49
-
- # These are fairly well supported, but not part of the standard.
- LIGHTBLACK_EX = 100
- LIGHTRED_EX = 101
- LIGHTGREEN_EX = 102
- LIGHTYELLOW_EX = 103
- LIGHTBLUE_EX = 104
- LIGHTMAGENTA_EX = 105
- LIGHTCYAN_EX = 106
- LIGHTWHITE_EX = 107
-
-
-class AnsiStyle(AnsiCodes):
- BRIGHT = 1
- DIM = 2
- NORMAL = 22
- RESET_ALL = 0
-
-Fore = AnsiFore()
-Back = AnsiBack()
-Style = AnsiStyle()
-Cursor = AnsiCursor()
diff --git a/contrib/python/pip/pip/_vendor/colorama/ansitowin32.py b/contrib/python/pip/pip/_vendor/colorama/ansitowin32.py
deleted file mode 100644
index abf209e60c..0000000000
--- a/contrib/python/pip/pip/_vendor/colorama/ansitowin32.py
+++ /dev/null
@@ -1,277 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-import re
-import sys
-import os
-
-from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style, BEL
-from .winterm import enable_vt_processing, WinTerm, WinColor, WinStyle
-from .win32 import windll, winapi_test
-
-
-winterm = None
-if windll is not None:
- winterm = WinTerm()
-
-
-class StreamWrapper(object):
- '''
- Wraps a stream (such as stdout), acting as a transparent proxy for all
- attribute access apart from method 'write()', which is delegated to our
- Converter instance.
- '''
- def __init__(self, wrapped, converter):
- # double-underscore everything to prevent clashes with names of
- # attributes on the wrapped stream object.
- self.__wrapped = wrapped
- self.__convertor = converter
-
- def __getattr__(self, name):
- return getattr(self.__wrapped, name)
-
- def __enter__(self, *args, **kwargs):
- # special method lookup bypasses __getattr__/__getattribute__, see
- # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit
- # thus, contextlib magic methods are not proxied via __getattr__
- return self.__wrapped.__enter__(*args, **kwargs)
-
- def __exit__(self, *args, **kwargs):
- return self.__wrapped.__exit__(*args, **kwargs)
-
- def __setstate__(self, state):
- self.__dict__ = state
-
- def __getstate__(self):
- return self.__dict__
-
- def write(self, text):
- self.__convertor.write(text)
-
- def isatty(self):
- stream = self.__wrapped
- if 'PYCHARM_HOSTED' in os.environ:
- if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__):
- return True
- try:
- stream_isatty = stream.isatty
- except AttributeError:
- return False
- else:
- return stream_isatty()
-
- @property
- def closed(self):
- stream = self.__wrapped
- try:
- return stream.closed
- # AttributeError in the case that the stream doesn't support being closed
- # ValueError for the case that the stream has already been detached when atexit runs
- except (AttributeError, ValueError):
- return True
-
-
-class AnsiToWin32(object):
- '''
- Implements a 'write()' method which, on Windows, will strip ANSI character
- sequences from the text, and if outputting to a tty, will convert them into
- win32 function calls.
- '''
- ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer
- ANSI_OSC_RE = re.compile('\001?\033\\]([^\a]*)(\a)\002?') # Operating System Command
-
- def __init__(self, wrapped, convert=None, strip=None, autoreset=False):
- # The wrapped stream (normally sys.stdout or sys.stderr)
- self.wrapped = wrapped
-
- # should we reset colors to defaults after every .write()
- self.autoreset = autoreset
-
- # create the proxy wrapping our output stream
- self.stream = StreamWrapper(wrapped, self)
-
- on_windows = os.name == 'nt'
- # We test if the WinAPI works, because even if we are on Windows
- # we may be using a terminal that doesn't support the WinAPI
- # (e.g. Cygwin Terminal). In this case it's up to the terminal
- # to support the ANSI codes.
- conversion_supported = on_windows and winapi_test()
- try:
- fd = wrapped.fileno()
- except Exception:
- fd = -1
- system_has_native_ansi = not on_windows or enable_vt_processing(fd)
- have_tty = not self.stream.closed and self.stream.isatty()
- need_conversion = conversion_supported and not system_has_native_ansi
-
- # should we strip ANSI sequences from our output?
- if strip is None:
- strip = need_conversion or not have_tty
- self.strip = strip
-
- # should we should convert ANSI sequences into win32 calls?
- if convert is None:
- convert = need_conversion and have_tty
- self.convert = convert
-
- # dict of ansi codes to win32 functions and parameters
- self.win32_calls = self.get_win32_calls()
-
- # are we wrapping stderr?
- self.on_stderr = self.wrapped is sys.stderr
-
- def should_wrap(self):
- '''
- True if this class is actually needed. If false, then the output
- stream will not be affected, nor will win32 calls be issued, so
- wrapping stdout is not actually required. This will generally be
- False on non-Windows platforms, unless optional functionality like
- autoreset has been requested using kwargs to init()
- '''
- return self.convert or self.strip or self.autoreset
-
- def get_win32_calls(self):
- if self.convert and winterm:
- return {
- AnsiStyle.RESET_ALL: (winterm.reset_all, ),
- AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT),
- AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL),
- AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL),
- AnsiFore.BLACK: (winterm.fore, WinColor.BLACK),
- AnsiFore.RED: (winterm.fore, WinColor.RED),
- AnsiFore.GREEN: (winterm.fore, WinColor.GREEN),
- AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW),
- AnsiFore.BLUE: (winterm.fore, WinColor.BLUE),
- AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA),
- AnsiFore.CYAN: (winterm.fore, WinColor.CYAN),
- AnsiFore.WHITE: (winterm.fore, WinColor.GREY),
- AnsiFore.RESET: (winterm.fore, ),
- AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True),
- AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True),
- AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True),
- AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True),
- AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True),
- AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True),
- AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True),
- AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True),
- AnsiBack.BLACK: (winterm.back, WinColor.BLACK),
- AnsiBack.RED: (winterm.back, WinColor.RED),
- AnsiBack.GREEN: (winterm.back, WinColor.GREEN),
- AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW),
- AnsiBack.BLUE: (winterm.back, WinColor.BLUE),
- AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA),
- AnsiBack.CYAN: (winterm.back, WinColor.CYAN),
- AnsiBack.WHITE: (winterm.back, WinColor.GREY),
- AnsiBack.RESET: (winterm.back, ),
- AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True),
- AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True),
- AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True),
- AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True),
- AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True),
- AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True),
- AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True),
- AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True),
- }
- return dict()
-
- def write(self, text):
- if self.strip or self.convert:
- self.write_and_convert(text)
- else:
- self.wrapped.write(text)
- self.wrapped.flush()
- if self.autoreset:
- self.reset_all()
-
-
- def reset_all(self):
- if self.convert:
- self.call_win32('m', (0,))
- elif not self.strip and not self.stream.closed:
- self.wrapped.write(Style.RESET_ALL)
-
-
- def write_and_convert(self, text):
- '''
- Write the given text to our wrapped stream, stripping any ANSI
- sequences from the text, and optionally converting them into win32
- calls.
- '''
- cursor = 0
- text = self.convert_osc(text)
- for match in self.ANSI_CSI_RE.finditer(text):
- start, end = match.span()
- self.write_plain_text(text, cursor, start)
- self.convert_ansi(*match.groups())
- cursor = end
- self.write_plain_text(text, cursor, len(text))
-
-
- def write_plain_text(self, text, start, end):
- if start < end:
- self.wrapped.write(text[start:end])
- self.wrapped.flush()
-
-
- def convert_ansi(self, paramstring, command):
- if self.convert:
- params = self.extract_params(command, paramstring)
- self.call_win32(command, params)
-
-
- def extract_params(self, command, paramstring):
- if command in 'Hf':
- params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';'))
- while len(params) < 2:
- # defaults:
- params = params + (1,)
- else:
- params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0)
- if len(params) == 0:
- # defaults:
- if command in 'JKm':
- params = (0,)
- elif command in 'ABCD':
- params = (1,)
-
- return params
-
-
- def call_win32(self, command, params):
- if command == 'm':
- for param in params:
- if param in self.win32_calls:
- func_args = self.win32_calls[param]
- func = func_args[0]
- args = func_args[1:]
- kwargs = dict(on_stderr=self.on_stderr)
- func(*args, **kwargs)
- elif command in 'J':
- winterm.erase_screen(params[0], on_stderr=self.on_stderr)
- elif command in 'K':
- winterm.erase_line(params[0], on_stderr=self.on_stderr)
- elif command in 'Hf': # cursor position - absolute
- winterm.set_cursor_position(params, on_stderr=self.on_stderr)
- elif command in 'ABCD': # cursor position - relative
- n = params[0]
- # A - up, B - down, C - forward, D - back
- x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command]
- winterm.cursor_adjust(x, y, on_stderr=self.on_stderr)
-
-
- def convert_osc(self, text):
- for match in self.ANSI_OSC_RE.finditer(text):
- start, end = match.span()
- text = text[:start] + text[end:]
- paramstring, command = match.groups()
- if command == BEL:
- if paramstring.count(";") == 1:
- params = paramstring.split(";")
- # 0 - change title and icon (we will only change title)
- # 1 - change icon (we don't support this)
- # 2 - change title
- if params[0] in '02':
- winterm.set_title(params[1])
- return text
-
-
- def flush(self):
- self.wrapped.flush()
diff --git a/contrib/python/pip/pip/_vendor/colorama/initialise.py b/contrib/python/pip/pip/_vendor/colorama/initialise.py
deleted file mode 100644
index d5fd4b71fe..0000000000
--- a/contrib/python/pip/pip/_vendor/colorama/initialise.py
+++ /dev/null
@@ -1,121 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-import atexit
-import contextlib
-import sys
-
-from .ansitowin32 import AnsiToWin32
-
-
-def _wipe_internal_state_for_tests():
- global orig_stdout, orig_stderr
- orig_stdout = None
- orig_stderr = None
-
- global wrapped_stdout, wrapped_stderr
- wrapped_stdout = None
- wrapped_stderr = None
-
- global atexit_done
- atexit_done = False
-
- global fixed_windows_console
- fixed_windows_console = False
-
- try:
- # no-op if it wasn't registered
- atexit.unregister(reset_all)
- except AttributeError:
- # python 2: no atexit.unregister. Oh well, we did our best.
- pass
-
-
-def reset_all():
- if AnsiToWin32 is not None: # Issue #74: objects might become None at exit
- AnsiToWin32(orig_stdout).reset_all()
-
-
-def init(autoreset=False, convert=None, strip=None, wrap=True):
-
- if not wrap and any([autoreset, convert, strip]):
- raise ValueError('wrap=False conflicts with any other arg=True')
-
- global wrapped_stdout, wrapped_stderr
- global orig_stdout, orig_stderr
-
- orig_stdout = sys.stdout
- orig_stderr = sys.stderr
-
- if sys.stdout is None:
- wrapped_stdout = None
- else:
- sys.stdout = wrapped_stdout = \
- wrap_stream(orig_stdout, convert, strip, autoreset, wrap)
- if sys.stderr is None:
- wrapped_stderr = None
- else:
- sys.stderr = wrapped_stderr = \
- wrap_stream(orig_stderr, convert, strip, autoreset, wrap)
-
- global atexit_done
- if not atexit_done:
- atexit.register(reset_all)
- atexit_done = True
-
-
-def deinit():
- if orig_stdout is not None:
- sys.stdout = orig_stdout
- if orig_stderr is not None:
- sys.stderr = orig_stderr
-
-
-def just_fix_windows_console():
- global fixed_windows_console
-
- if sys.platform != "win32":
- return
- if fixed_windows_console:
- return
- if wrapped_stdout is not None or wrapped_stderr is not None:
- # Someone already ran init() and it did stuff, so we won't second-guess them
- return
-
- # On newer versions of Windows, AnsiToWin32.__init__ will implicitly enable the
- # native ANSI support in the console as a side-effect. We only need to actually
- # replace sys.stdout/stderr if we're in the old-style conversion mode.
- new_stdout = AnsiToWin32(sys.stdout, convert=None, strip=None, autoreset=False)
- if new_stdout.convert:
- sys.stdout = new_stdout
- new_stderr = AnsiToWin32(sys.stderr, convert=None, strip=None, autoreset=False)
- if new_stderr.convert:
- sys.stderr = new_stderr
-
- fixed_windows_console = True
-
-@contextlib.contextmanager
-def colorama_text(*args, **kwargs):
- init(*args, **kwargs)
- try:
- yield
- finally:
- deinit()
-
-
-def reinit():
- if wrapped_stdout is not None:
- sys.stdout = wrapped_stdout
- if wrapped_stderr is not None:
- sys.stderr = wrapped_stderr
-
-
-def wrap_stream(stream, convert, strip, autoreset, wrap):
- if wrap:
- wrapper = AnsiToWin32(stream,
- convert=convert, strip=strip, autoreset=autoreset)
- if wrapper.should_wrap():
- stream = wrapper.stream
- return stream
-
-
-# Use this for initial setup as well, to reduce code duplication
-_wipe_internal_state_for_tests()
diff --git a/contrib/python/pip/pip/_vendor/colorama/win32.py b/contrib/python/pip/pip/_vendor/colorama/win32.py
deleted file mode 100644
index 841b0e270a..0000000000
--- a/contrib/python/pip/pip/_vendor/colorama/win32.py
+++ /dev/null
@@ -1,180 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-
-# from winbase.h
-STDOUT = -11
-STDERR = -12
-
-ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004
-
-try:
- import ctypes
- from ctypes import LibraryLoader
- windll = LibraryLoader(ctypes.WinDLL)
- from ctypes import wintypes
-except (AttributeError, ImportError):
- windll = None
- SetConsoleTextAttribute = lambda *_: None
- winapi_test = lambda *_: None
-else:
- from ctypes import byref, Structure, c_char, POINTER
-
- COORD = wintypes._COORD
-
- class CONSOLE_SCREEN_BUFFER_INFO(Structure):
- """struct in wincon.h."""
- _fields_ = [
- ("dwSize", COORD),
- ("dwCursorPosition", COORD),
- ("wAttributes", wintypes.WORD),
- ("srWindow", wintypes.SMALL_RECT),
- ("dwMaximumWindowSize", COORD),
- ]
- def __str__(self):
- return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % (
- self.dwSize.Y, self.dwSize.X
- , self.dwCursorPosition.Y, self.dwCursorPosition.X
- , self.wAttributes
- , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right
- , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X
- )
-
- _GetStdHandle = windll.kernel32.GetStdHandle
- _GetStdHandle.argtypes = [
- wintypes.DWORD,
- ]
- _GetStdHandle.restype = wintypes.HANDLE
-
- _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo
- _GetConsoleScreenBufferInfo.argtypes = [
- wintypes.HANDLE,
- POINTER(CONSOLE_SCREEN_BUFFER_INFO),
- ]
- _GetConsoleScreenBufferInfo.restype = wintypes.BOOL
-
- _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute
- _SetConsoleTextAttribute.argtypes = [
- wintypes.HANDLE,
- wintypes.WORD,
- ]
- _SetConsoleTextAttribute.restype = wintypes.BOOL
-
- _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition
- _SetConsoleCursorPosition.argtypes = [
- wintypes.HANDLE,
- COORD,
- ]
- _SetConsoleCursorPosition.restype = wintypes.BOOL
-
- _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA
- _FillConsoleOutputCharacterA.argtypes = [
- wintypes.HANDLE,
- c_char,
- wintypes.DWORD,
- COORD,
- POINTER(wintypes.DWORD),
- ]
- _FillConsoleOutputCharacterA.restype = wintypes.BOOL
-
- _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute
- _FillConsoleOutputAttribute.argtypes = [
- wintypes.HANDLE,
- wintypes.WORD,
- wintypes.DWORD,
- COORD,
- POINTER(wintypes.DWORD),
- ]
- _FillConsoleOutputAttribute.restype = wintypes.BOOL
-
- _SetConsoleTitleW = windll.kernel32.SetConsoleTitleW
- _SetConsoleTitleW.argtypes = [
- wintypes.LPCWSTR
- ]
- _SetConsoleTitleW.restype = wintypes.BOOL
-
- _GetConsoleMode = windll.kernel32.GetConsoleMode
- _GetConsoleMode.argtypes = [
- wintypes.HANDLE,
- POINTER(wintypes.DWORD)
- ]
- _GetConsoleMode.restype = wintypes.BOOL
-
- _SetConsoleMode = windll.kernel32.SetConsoleMode
- _SetConsoleMode.argtypes = [
- wintypes.HANDLE,
- wintypes.DWORD
- ]
- _SetConsoleMode.restype = wintypes.BOOL
-
- def _winapi_test(handle):
- csbi = CONSOLE_SCREEN_BUFFER_INFO()
- success = _GetConsoleScreenBufferInfo(
- handle, byref(csbi))
- return bool(success)
-
- def winapi_test():
- return any(_winapi_test(h) for h in
- (_GetStdHandle(STDOUT), _GetStdHandle(STDERR)))
-
- def GetConsoleScreenBufferInfo(stream_id=STDOUT):
- handle = _GetStdHandle(stream_id)
- csbi = CONSOLE_SCREEN_BUFFER_INFO()
- success = _GetConsoleScreenBufferInfo(
- handle, byref(csbi))
- return csbi
-
- def SetConsoleTextAttribute(stream_id, attrs):
- handle = _GetStdHandle(stream_id)
- return _SetConsoleTextAttribute(handle, attrs)
-
- def SetConsoleCursorPosition(stream_id, position, adjust=True):
- position = COORD(*position)
- # If the position is out of range, do nothing.
- if position.Y <= 0 or position.X <= 0:
- return
- # Adjust for Windows' SetConsoleCursorPosition:
- # 1. being 0-based, while ANSI is 1-based.
- # 2. expecting (x,y), while ANSI uses (y,x).
- adjusted_position = COORD(position.Y - 1, position.X - 1)
- if adjust:
- # Adjust for viewport's scroll position
- sr = GetConsoleScreenBufferInfo(STDOUT).srWindow
- adjusted_position.Y += sr.Top
- adjusted_position.X += sr.Left
- # Resume normal processing
- handle = _GetStdHandle(stream_id)
- return _SetConsoleCursorPosition(handle, adjusted_position)
-
- def FillConsoleOutputCharacter(stream_id, char, length, start):
- handle = _GetStdHandle(stream_id)
- char = c_char(char.encode())
- length = wintypes.DWORD(length)
- num_written = wintypes.DWORD(0)
- # Note that this is hard-coded for ANSI (vs wide) bytes.
- success = _FillConsoleOutputCharacterA(
- handle, char, length, start, byref(num_written))
- return num_written.value
-
- def FillConsoleOutputAttribute(stream_id, attr, length, start):
- ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )'''
- handle = _GetStdHandle(stream_id)
- attribute = wintypes.WORD(attr)
- length = wintypes.DWORD(length)
- num_written = wintypes.DWORD(0)
- # Note that this is hard-coded for ANSI (vs wide) bytes.
- return _FillConsoleOutputAttribute(
- handle, attribute, length, start, byref(num_written))
-
- def SetConsoleTitle(title):
- return _SetConsoleTitleW(title)
-
- def GetConsoleMode(handle):
- mode = wintypes.DWORD()
- success = _GetConsoleMode(handle, byref(mode))
- if not success:
- raise ctypes.WinError()
- return mode.value
-
- def SetConsoleMode(handle, mode):
- success = _SetConsoleMode(handle, mode)
- if not success:
- raise ctypes.WinError()
diff --git a/contrib/python/pip/pip/_vendor/colorama/winterm.py b/contrib/python/pip/pip/_vendor/colorama/winterm.py
deleted file mode 100644
index aad867e8c8..0000000000
--- a/contrib/python/pip/pip/_vendor/colorama/winterm.py
+++ /dev/null
@@ -1,195 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-try:
- from msvcrt import get_osfhandle
-except ImportError:
- def get_osfhandle(_):
- raise OSError("This isn't windows!")
-
-
-from . import win32
-
-# from wincon.h
-class WinColor(object):
- BLACK = 0
- BLUE = 1
- GREEN = 2
- CYAN = 3
- RED = 4
- MAGENTA = 5
- YELLOW = 6
- GREY = 7
-
-# from wincon.h
-class WinStyle(object):
- NORMAL = 0x00 # dim text, dim background
- BRIGHT = 0x08 # bright text, dim background
- BRIGHT_BACKGROUND = 0x80 # dim text, bright background
-
-class WinTerm(object):
-
- def __init__(self):
- self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes
- self.set_attrs(self._default)
- self._default_fore = self._fore
- self._default_back = self._back
- self._default_style = self._style
- # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style.
- # So that LIGHT_EX colors and BRIGHT style do not clobber each other,
- # we track them separately, since LIGHT_EX is overwritten by Fore/Back
- # and BRIGHT is overwritten by Style codes.
- self._light = 0
-
- def get_attrs(self):
- return self._fore + self._back * 16 + (self._style | self._light)
-
- def set_attrs(self, value):
- self._fore = value & 7
- self._back = (value >> 4) & 7
- self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND)
-
- def reset_all(self, on_stderr=None):
- self.set_attrs(self._default)
- self.set_console(attrs=self._default)
- self._light = 0
-
- def fore(self, fore=None, light=False, on_stderr=False):
- if fore is None:
- fore = self._default_fore
- self._fore = fore
- # Emulate LIGHT_EX with BRIGHT Style
- if light:
- self._light |= WinStyle.BRIGHT
- else:
- self._light &= ~WinStyle.BRIGHT
- self.set_console(on_stderr=on_stderr)
-
- def back(self, back=None, light=False, on_stderr=False):
- if back is None:
- back = self._default_back
- self._back = back
- # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style
- if light:
- self._light |= WinStyle.BRIGHT_BACKGROUND
- else:
- self._light &= ~WinStyle.BRIGHT_BACKGROUND
- self.set_console(on_stderr=on_stderr)
-
- def style(self, style=None, on_stderr=False):
- if style is None:
- style = self._default_style
- self._style = style
- self.set_console(on_stderr=on_stderr)
-
- def set_console(self, attrs=None, on_stderr=False):
- if attrs is None:
- attrs = self.get_attrs()
- handle = win32.STDOUT
- if on_stderr:
- handle = win32.STDERR
- win32.SetConsoleTextAttribute(handle, attrs)
-
- def get_position(self, handle):
- position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition
- # Because Windows coordinates are 0-based,
- # and win32.SetConsoleCursorPosition expects 1-based.
- position.X += 1
- position.Y += 1
- return position
-
- def set_cursor_position(self, position=None, on_stderr=False):
- if position is None:
- # I'm not currently tracking the position, so there is no default.
- # position = self.get_position()
- return
- handle = win32.STDOUT
- if on_stderr:
- handle = win32.STDERR
- win32.SetConsoleCursorPosition(handle, position)
-
- def cursor_adjust(self, x, y, on_stderr=False):
- handle = win32.STDOUT
- if on_stderr:
- handle = win32.STDERR
- position = self.get_position(handle)
- adjusted_position = (position.Y + y, position.X + x)
- win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False)
-
- def erase_screen(self, mode=0, on_stderr=False):
- # 0 should clear from the cursor to the end of the screen.
- # 1 should clear from the cursor to the beginning of the screen.
- # 2 should clear the entire screen, and move cursor to (1,1)
- handle = win32.STDOUT
- if on_stderr:
- handle = win32.STDERR
- csbi = win32.GetConsoleScreenBufferInfo(handle)
- # get the number of character cells in the current buffer
- cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y
- # get number of character cells before current cursor position
- cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X
- if mode == 0:
- from_coord = csbi.dwCursorPosition
- cells_to_erase = cells_in_screen - cells_before_cursor
- elif mode == 1:
- from_coord = win32.COORD(0, 0)
- cells_to_erase = cells_before_cursor
- elif mode == 2:
- from_coord = win32.COORD(0, 0)
- cells_to_erase = cells_in_screen
- else:
- # invalid mode
- return
- # fill the entire screen with blanks
- win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord)
- # now set the buffer's attributes accordingly
- win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord)
- if mode == 2:
- # put the cursor where needed
- win32.SetConsoleCursorPosition(handle, (1, 1))
-
- def erase_line(self, mode=0, on_stderr=False):
- # 0 should clear from the cursor to the end of the line.
- # 1 should clear from the cursor to the beginning of the line.
- # 2 should clear the entire line.
- handle = win32.STDOUT
- if on_stderr:
- handle = win32.STDERR
- csbi = win32.GetConsoleScreenBufferInfo(handle)
- if mode == 0:
- from_coord = csbi.dwCursorPosition
- cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X
- elif mode == 1:
- from_coord = win32.COORD(0, csbi.dwCursorPosition.Y)
- cells_to_erase = csbi.dwCursorPosition.X
- elif mode == 2:
- from_coord = win32.COORD(0, csbi.dwCursorPosition.Y)
- cells_to_erase = csbi.dwSize.X
- else:
- # invalid mode
- return
- # fill the entire screen with blanks
- win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord)
- # now set the buffer's attributes accordingly
- win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord)
-
- def set_title(self, title):
- win32.SetConsoleTitle(title)
-
-
-def enable_vt_processing(fd):
- if win32.windll is None or not win32.winapi_test():
- return False
-
- try:
- handle = get_osfhandle(fd)
- mode = win32.GetConsoleMode(handle)
- win32.SetConsoleMode(
- handle,
- mode | win32.ENABLE_VIRTUAL_TERMINAL_PROCESSING,
- )
-
- mode = win32.GetConsoleMode(handle)
- if mode & win32.ENABLE_VIRTUAL_TERMINAL_PROCESSING:
- return True
- # Can get TypeError in testsuite where 'fd' is a Mock()
- except (OSError, TypeError):
- return False
diff --git a/contrib/python/pip/pip/_vendor/distlib/scripts.py b/contrib/python/pip/pip/_vendor/distlib/scripts.py
index cfa45d2af1..e16292b833 100644
--- a/contrib/python/pip/pip/_vendor/distlib/scripts.py
+++ b/contrib/python/pip/pip/_vendor/distlib/scripts.py
@@ -49,6 +49,24 @@ if __name__ == '__main__':
sys.exit(%(func)s())
'''
+# Pre-fetch the contents of all executable wrapper stubs.
+# This is to address https://github.com/pypa/pip/issues/12666.
+# When updating pip, we rename the old pip in place before installing the
+# new version. If we try to fetch a wrapper *after* that rename, the finder
+# machinery will be confused as the package is no longer available at the
+# location where it was imported from. So we load everything into memory in
+# advance.
+
+# Issue 31: don't hardcode an absolute package name, but
+# determine it relative to the current package
+distlib_package = __name__.rsplit('.', 1)[0]
+
+WRAPPERS = {
+ r.name: r.bytes
+ for r in finder(distlib_package).iterator("")
+ if r.name.endswith(".exe")
+}
+
def enquote_executable(executable):
if ' ' in executable:
@@ -409,15 +427,11 @@ class ScriptMaker(object):
bits = '32'
platform_suffix = '-arm' if get_platform() == 'win-arm64' else ''
name = '%s%s%s.exe' % (kind, bits, platform_suffix)
- # Issue 31: don't hardcode an absolute package name, but
- # determine it relative to the current package
- distlib_package = __name__.rsplit('.', 1)[0]
- resource = finder(distlib_package).find(name)
- if not resource:
+ if name not in WRAPPERS:
msg = ('Unable to find resource %s in package %s' %
(name, distlib_package))
raise ValueError(msg)
- return resource.bytes
+ return WRAPPERS[name]
# Public API follows
diff --git a/contrib/python/pip/pip/_vendor/distro/distro.py b/contrib/python/pip/pip/_vendor/distro/distro.py
index 89e1868047..78ccdfa402 100644
--- a/contrib/python/pip/pip/_vendor/distro/distro.py
+++ b/contrib/python/pip/pip/_vendor/distro/distro.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python
-# Copyright 2015,2016,2017 Nir Cohen
+# Copyright 2015-2021 Nir Cohen
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -55,7 +55,7 @@ except ImportError:
# Python 3.7
TypedDict = dict
-__version__ = "1.8.0"
+__version__ = "1.9.0"
class VersionDict(TypedDict):
@@ -125,6 +125,7 @@ _DISTRO_RELEASE_BASENAME_PATTERN = re.compile(r"(\w+)[-_](release|version)$")
# Base file names to be looked up for if _UNIXCONFDIR is not readable.
_DISTRO_RELEASE_BASENAMES = [
"SuSE-release",
+ "altlinux-release",
"arch-release",
"base-release",
"centos-release",
@@ -151,6 +152,8 @@ _DISTRO_RELEASE_IGNORE_BASENAMES = (
"system-release",
"plesk-release",
"iredmail-release",
+ "board-release",
+ "ec2_version",
)
@@ -243,6 +246,7 @@ def id() -> str:
"rocky" Rocky Linux
"aix" AIX
"guix" Guix System
+ "altlinux" ALT Linux
============== =========================================
If you have a need to get distros for reliable IDs added into this set,
@@ -991,10 +995,10 @@ class LinuxDistribution:
For details, see :func:`distro.info`.
"""
- return dict(
+ return InfoDict(
id=self.id(),
version=self.version(pretty, best),
- version_parts=dict(
+ version_parts=VersionDict(
major=self.major_version(best),
minor=self.minor_version(best),
build_number=self.build_number(best),
diff --git a/contrib/python/pip/pip/_vendor/idna/codec.py b/contrib/python/pip/pip/_vendor/idna/codec.py
index 1ca9ba62c2..c855a4de6d 100644
--- a/contrib/python/pip/pip/_vendor/idna/codec.py
+++ b/contrib/python/pip/pip/_vendor/idna/codec.py
@@ -1,7 +1,7 @@
from .core import encode, decode, alabel, ulabel, IDNAError
import codecs
import re
-from typing import Tuple, Optional
+from typing import Any, Tuple, Optional
_unicode_dots_re = re.compile('[\u002e\u3002\uff0e\uff61]')
@@ -26,24 +26,24 @@ class Codec(codecs.Codec):
return decode(data), len(data)
class IncrementalEncoder(codecs.BufferedIncrementalEncoder):
- def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[str, int]: # type: ignore
+ def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[bytes, int]:
if errors != 'strict':
raise IDNAError('Unsupported error handling \"{}\"'.format(errors))
if not data:
- return "", 0
+ return b'', 0
labels = _unicode_dots_re.split(data)
- trailing_dot = ''
+ trailing_dot = b''
if labels:
if not labels[-1]:
- trailing_dot = '.'
+ trailing_dot = b'.'
del labels[-1]
elif not final:
# Keep potentially unfinished label until the next call
del labels[-1]
if labels:
- trailing_dot = '.'
+ trailing_dot = b'.'
result = []
size = 0
@@ -54,18 +54,21 @@ class IncrementalEncoder(codecs.BufferedIncrementalEncoder):
size += len(label)
# Join with U+002E
- result_str = '.'.join(result) + trailing_dot # type: ignore
+ result_bytes = b'.'.join(result) + trailing_dot
size += len(trailing_dot)
- return result_str, size
+ return result_bytes, size
class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
- def _buffer_decode(self, data: str, errors: str, final: bool) -> Tuple[str, int]: # type: ignore
+ def _buffer_decode(self, data: Any, errors: str, final: bool) -> Tuple[str, int]:
if errors != 'strict':
raise IDNAError('Unsupported error handling \"{}\"'.format(errors))
if not data:
return ('', 0)
+ if not isinstance(data, str):
+ data = str(data, 'ascii')
+
labels = _unicode_dots_re.split(data)
trailing_dot = ''
if labels:
@@ -99,14 +102,17 @@ class StreamReader(Codec, codecs.StreamReader):
pass
-def getregentry() -> codecs.CodecInfo:
- # Compatibility as a search_function for codecs.register()
+def search_function(name: str) -> Optional[codecs.CodecInfo]:
+ if name != 'idna2008':
+ return None
return codecs.CodecInfo(
- name='idna',
- encode=Codec().encode, # type: ignore
- decode=Codec().decode, # type: ignore
+ name=name,
+ encode=Codec().encode,
+ decode=Codec().decode,
incrementalencoder=IncrementalEncoder,
incrementaldecoder=IncrementalDecoder,
streamwriter=StreamWriter,
streamreader=StreamReader,
)
+
+codecs.register(search_function)
diff --git a/contrib/python/pip/pip/_vendor/idna/core.py b/contrib/python/pip/pip/_vendor/idna/core.py
index 4f30037110..0dae61acdb 100644
--- a/contrib/python/pip/pip/_vendor/idna/core.py
+++ b/contrib/python/pip/pip/_vendor/idna/core.py
@@ -150,9 +150,11 @@ def valid_contextj(label: str, pos: int) -> bool:
joining_type = idnadata.joining_types.get(ord(label[i]))
if joining_type == ord('T'):
continue
- if joining_type in [ord('L'), ord('D')]:
+ elif joining_type in [ord('L'), ord('D')]:
ok = True
break
+ else:
+ break
if not ok:
return False
@@ -162,9 +164,11 @@ def valid_contextj(label: str, pos: int) -> bool:
joining_type = idnadata.joining_types.get(ord(label[i]))
if joining_type == ord('T'):
continue
- if joining_type in [ord('R'), ord('D')]:
+ elif joining_type in [ord('R'), ord('D')]:
ok = True
break
+ else:
+ break
return ok
if cp_value == 0x200d:
@@ -236,12 +240,8 @@ def check_label(label: Union[str, bytes, bytearray]) -> None:
if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']):
continue
elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']):
- try:
- if not valid_contextj(label, pos):
- raise InvalidCodepointContext('Joiner {} not allowed at position {} in {}'.format(
- _unot(cp_value), pos+1, repr(label)))
- except ValueError:
- raise IDNAError('Unknown codepoint adjacent to joiner {} at position {} in {}'.format(
+ if not valid_contextj(label, pos):
+ raise InvalidCodepointContext('Joiner {} not allowed at position {} in {}'.format(
_unot(cp_value), pos+1, repr(label)))
elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']):
if not valid_contexto(label, pos):
@@ -262,13 +262,8 @@ def alabel(label: str) -> bytes:
except UnicodeEncodeError:
pass
- if not label:
- raise IDNAError('No Input')
-
- label = str(label)
check_label(label)
- label_bytes = _punycode(label)
- label_bytes = _alabel_prefix + label_bytes
+ label_bytes = _alabel_prefix + _punycode(label)
if not valid_label_length(label_bytes):
raise IDNAError('Label too long')
@@ -318,7 +313,7 @@ def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False
status = uts46row[1]
replacement = None # type: Optional[str]
if len(uts46row) == 3:
- replacement = uts46row[2] # type: ignore
+ replacement = uts46row[2]
if (status == 'V' or
(status == 'D' and not transitional) or
(status == '3' and not std3_rules and replacement is None)):
@@ -338,9 +333,9 @@ def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False
def encode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False, transitional: bool = False) -> bytes:
- if isinstance(s, (bytes, bytearray)):
+ if not isinstance(s, str):
try:
- s = s.decode('ascii')
+ s = str(s, 'ascii')
except UnicodeDecodeError:
raise IDNAError('should pass a unicode string to the function rather than a byte string.')
if uts46:
@@ -372,8 +367,8 @@ def encode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool =
def decode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False) -> str:
try:
- if isinstance(s, (bytes, bytearray)):
- s = s.decode('ascii')
+ if not isinstance(s, str):
+ s = str(s, 'ascii')
except UnicodeDecodeError:
raise IDNAError('Invalid ASCII in A-label')
if uts46:
diff --git a/contrib/python/pip/pip/_vendor/idna/idnadata.py b/contrib/python/pip/pip/_vendor/idna/idnadata.py
index 67db462582..c61dcf977e 100644
--- a/contrib/python/pip/pip/_vendor/idna/idnadata.py
+++ b/contrib/python/pip/pip/_vendor/idna/idnadata.py
@@ -1,6 +1,6 @@
# This file is automatically generated by tools/idna-data
-__version__ = '15.0.0'
+__version__ = '15.1.0'
scripts = {
'Greek': (
0x37000000374,
@@ -59,6 +59,7 @@ scripts = {
0x2b7400002b81e,
0x2b8200002cea2,
0x2ceb00002ebe1,
+ 0x2ebf00002ee5e,
0x2f8000002fa1e,
0x300000003134b,
0x31350000323b0,
@@ -100,16 +101,190 @@ scripts = {
),
}
joining_types = {
- 0x600: 85,
- 0x601: 85,
- 0x602: 85,
- 0x603: 85,
- 0x604: 85,
- 0x605: 85,
- 0x608: 85,
- 0x60b: 85,
+ 0xad: 84,
+ 0x300: 84,
+ 0x301: 84,
+ 0x302: 84,
+ 0x303: 84,
+ 0x304: 84,
+ 0x305: 84,
+ 0x306: 84,
+ 0x307: 84,
+ 0x308: 84,
+ 0x309: 84,
+ 0x30a: 84,
+ 0x30b: 84,
+ 0x30c: 84,
+ 0x30d: 84,
+ 0x30e: 84,
+ 0x30f: 84,
+ 0x310: 84,
+ 0x311: 84,
+ 0x312: 84,
+ 0x313: 84,
+ 0x314: 84,
+ 0x315: 84,
+ 0x316: 84,
+ 0x317: 84,
+ 0x318: 84,
+ 0x319: 84,
+ 0x31a: 84,
+ 0x31b: 84,
+ 0x31c: 84,
+ 0x31d: 84,
+ 0x31e: 84,
+ 0x31f: 84,
+ 0x320: 84,
+ 0x321: 84,
+ 0x322: 84,
+ 0x323: 84,
+ 0x324: 84,
+ 0x325: 84,
+ 0x326: 84,
+ 0x327: 84,
+ 0x328: 84,
+ 0x329: 84,
+ 0x32a: 84,
+ 0x32b: 84,
+ 0x32c: 84,
+ 0x32d: 84,
+ 0x32e: 84,
+ 0x32f: 84,
+ 0x330: 84,
+ 0x331: 84,
+ 0x332: 84,
+ 0x333: 84,
+ 0x334: 84,
+ 0x335: 84,
+ 0x336: 84,
+ 0x337: 84,
+ 0x338: 84,
+ 0x339: 84,
+ 0x33a: 84,
+ 0x33b: 84,
+ 0x33c: 84,
+ 0x33d: 84,
+ 0x33e: 84,
+ 0x33f: 84,
+ 0x340: 84,
+ 0x341: 84,
+ 0x342: 84,
+ 0x343: 84,
+ 0x344: 84,
+ 0x345: 84,
+ 0x346: 84,
+ 0x347: 84,
+ 0x348: 84,
+ 0x349: 84,
+ 0x34a: 84,
+ 0x34b: 84,
+ 0x34c: 84,
+ 0x34d: 84,
+ 0x34e: 84,
+ 0x34f: 84,
+ 0x350: 84,
+ 0x351: 84,
+ 0x352: 84,
+ 0x353: 84,
+ 0x354: 84,
+ 0x355: 84,
+ 0x356: 84,
+ 0x357: 84,
+ 0x358: 84,
+ 0x359: 84,
+ 0x35a: 84,
+ 0x35b: 84,
+ 0x35c: 84,
+ 0x35d: 84,
+ 0x35e: 84,
+ 0x35f: 84,
+ 0x360: 84,
+ 0x361: 84,
+ 0x362: 84,
+ 0x363: 84,
+ 0x364: 84,
+ 0x365: 84,
+ 0x366: 84,
+ 0x367: 84,
+ 0x368: 84,
+ 0x369: 84,
+ 0x36a: 84,
+ 0x36b: 84,
+ 0x36c: 84,
+ 0x36d: 84,
+ 0x36e: 84,
+ 0x36f: 84,
+ 0x483: 84,
+ 0x484: 84,
+ 0x485: 84,
+ 0x486: 84,
+ 0x487: 84,
+ 0x488: 84,
+ 0x489: 84,
+ 0x591: 84,
+ 0x592: 84,
+ 0x593: 84,
+ 0x594: 84,
+ 0x595: 84,
+ 0x596: 84,
+ 0x597: 84,
+ 0x598: 84,
+ 0x599: 84,
+ 0x59a: 84,
+ 0x59b: 84,
+ 0x59c: 84,
+ 0x59d: 84,
+ 0x59e: 84,
+ 0x59f: 84,
+ 0x5a0: 84,
+ 0x5a1: 84,
+ 0x5a2: 84,
+ 0x5a3: 84,
+ 0x5a4: 84,
+ 0x5a5: 84,
+ 0x5a6: 84,
+ 0x5a7: 84,
+ 0x5a8: 84,
+ 0x5a9: 84,
+ 0x5aa: 84,
+ 0x5ab: 84,
+ 0x5ac: 84,
+ 0x5ad: 84,
+ 0x5ae: 84,
+ 0x5af: 84,
+ 0x5b0: 84,
+ 0x5b1: 84,
+ 0x5b2: 84,
+ 0x5b3: 84,
+ 0x5b4: 84,
+ 0x5b5: 84,
+ 0x5b6: 84,
+ 0x5b7: 84,
+ 0x5b8: 84,
+ 0x5b9: 84,
+ 0x5ba: 84,
+ 0x5bb: 84,
+ 0x5bc: 84,
+ 0x5bd: 84,
+ 0x5bf: 84,
+ 0x5c1: 84,
+ 0x5c2: 84,
+ 0x5c4: 84,
+ 0x5c5: 84,
+ 0x5c7: 84,
+ 0x610: 84,
+ 0x611: 84,
+ 0x612: 84,
+ 0x613: 84,
+ 0x614: 84,
+ 0x615: 84,
+ 0x616: 84,
+ 0x617: 84,
+ 0x618: 84,
+ 0x619: 84,
+ 0x61a: 84,
+ 0x61c: 84,
0x620: 68,
- 0x621: 85,
0x622: 82,
0x623: 82,
0x624: 82,
@@ -151,12 +326,33 @@ joining_types = {
0x648: 82,
0x649: 68,
0x64a: 68,
+ 0x64b: 84,
+ 0x64c: 84,
+ 0x64d: 84,
+ 0x64e: 84,
+ 0x64f: 84,
+ 0x650: 84,
+ 0x651: 84,
+ 0x652: 84,
+ 0x653: 84,
+ 0x654: 84,
+ 0x655: 84,
+ 0x656: 84,
+ 0x657: 84,
+ 0x658: 84,
+ 0x659: 84,
+ 0x65a: 84,
+ 0x65b: 84,
+ 0x65c: 84,
+ 0x65d: 84,
+ 0x65e: 84,
+ 0x65f: 84,
0x66e: 68,
0x66f: 68,
+ 0x670: 84,
0x671: 82,
0x672: 82,
0x673: 82,
- 0x674: 85,
0x675: 82,
0x676: 82,
0x677: 82,
@@ -253,7 +449,25 @@ joining_types = {
0x6d2: 82,
0x6d3: 82,
0x6d5: 82,
- 0x6dd: 85,
+ 0x6d6: 84,
+ 0x6d7: 84,
+ 0x6d8: 84,
+ 0x6d9: 84,
+ 0x6da: 84,
+ 0x6db: 84,
+ 0x6dc: 84,
+ 0x6df: 84,
+ 0x6e0: 84,
+ 0x6e1: 84,
+ 0x6e2: 84,
+ 0x6e3: 84,
+ 0x6e4: 84,
+ 0x6e7: 84,
+ 0x6e8: 84,
+ 0x6ea: 84,
+ 0x6eb: 84,
+ 0x6ec: 84,
+ 0x6ed: 84,
0x6ee: 82,
0x6ef: 82,
0x6fa: 68,
@@ -262,6 +476,7 @@ joining_types = {
0x6ff: 68,
0x70f: 84,
0x710: 82,
+ 0x711: 84,
0x712: 68,
0x713: 68,
0x714: 68,
@@ -292,6 +507,33 @@ joining_types = {
0x72d: 68,
0x72e: 68,
0x72f: 82,
+ 0x730: 84,
+ 0x731: 84,
+ 0x732: 84,
+ 0x733: 84,
+ 0x734: 84,
+ 0x735: 84,
+ 0x736: 84,
+ 0x737: 84,
+ 0x738: 84,
+ 0x739: 84,
+ 0x73a: 84,
+ 0x73b: 84,
+ 0x73c: 84,
+ 0x73d: 84,
+ 0x73e: 84,
+ 0x73f: 84,
+ 0x740: 84,
+ 0x741: 84,
+ 0x742: 84,
+ 0x743: 84,
+ 0x744: 84,
+ 0x745: 84,
+ 0x746: 84,
+ 0x747: 84,
+ 0x748: 84,
+ 0x749: 84,
+ 0x74a: 84,
0x74d: 82,
0x74e: 68,
0x74f: 68,
@@ -343,6 +585,17 @@ joining_types = {
0x77d: 68,
0x77e: 68,
0x77f: 68,
+ 0x7a6: 84,
+ 0x7a7: 84,
+ 0x7a8: 84,
+ 0x7a9: 84,
+ 0x7aa: 84,
+ 0x7ab: 84,
+ 0x7ac: 84,
+ 0x7ad: 84,
+ 0x7ae: 84,
+ 0x7af: 84,
+ 0x7b0: 84,
0x7ca: 68,
0x7cb: 68,
0x7cc: 68,
@@ -376,7 +629,38 @@ joining_types = {
0x7e8: 68,
0x7e9: 68,
0x7ea: 68,
+ 0x7eb: 84,
+ 0x7ec: 84,
+ 0x7ed: 84,
+ 0x7ee: 84,
+ 0x7ef: 84,
+ 0x7f0: 84,
+ 0x7f1: 84,
+ 0x7f2: 84,
+ 0x7f3: 84,
0x7fa: 67,
+ 0x7fd: 84,
+ 0x816: 84,
+ 0x817: 84,
+ 0x818: 84,
+ 0x819: 84,
+ 0x81b: 84,
+ 0x81c: 84,
+ 0x81d: 84,
+ 0x81e: 84,
+ 0x81f: 84,
+ 0x820: 84,
+ 0x821: 84,
+ 0x822: 84,
+ 0x823: 84,
+ 0x825: 84,
+ 0x826: 84,
+ 0x827: 84,
+ 0x829: 84,
+ 0x82a: 84,
+ 0x82b: 84,
+ 0x82c: 84,
+ 0x82d: 84,
0x840: 82,
0x841: 68,
0x842: 68,
@@ -402,13 +686,14 @@ joining_types = {
0x856: 82,
0x857: 82,
0x858: 82,
+ 0x859: 84,
+ 0x85a: 84,
+ 0x85b: 84,
0x860: 68,
- 0x861: 85,
0x862: 68,
0x863: 68,
0x864: 68,
0x865: 68,
- 0x866: 85,
0x867: 82,
0x868: 68,
0x869: 82,
@@ -436,16 +721,20 @@ joining_types = {
0x884: 67,
0x885: 67,
0x886: 68,
- 0x887: 85,
- 0x888: 85,
0x889: 68,
0x88a: 68,
0x88b: 68,
0x88c: 68,
0x88d: 68,
0x88e: 82,
- 0x890: 85,
- 0x891: 85,
+ 0x898: 84,
+ 0x899: 84,
+ 0x89a: 84,
+ 0x89b: 84,
+ 0x89c: 84,
+ 0x89d: 84,
+ 0x89e: 84,
+ 0x89f: 84,
0x8a0: 68,
0x8a1: 68,
0x8a2: 68,
@@ -459,7 +748,6 @@ joining_types = {
0x8aa: 82,
0x8ab: 82,
0x8ac: 82,
- 0x8ad: 85,
0x8ae: 82,
0x8af: 68,
0x8b0: 68,
@@ -487,11 +775,357 @@ joining_types = {
0x8c6: 68,
0x8c7: 68,
0x8c8: 68,
- 0x8e2: 85,
- 0x1806: 85,
+ 0x8ca: 84,
+ 0x8cb: 84,
+ 0x8cc: 84,
+ 0x8cd: 84,
+ 0x8ce: 84,
+ 0x8cf: 84,
+ 0x8d0: 84,
+ 0x8d1: 84,
+ 0x8d2: 84,
+ 0x8d3: 84,
+ 0x8d4: 84,
+ 0x8d5: 84,
+ 0x8d6: 84,
+ 0x8d7: 84,
+ 0x8d8: 84,
+ 0x8d9: 84,
+ 0x8da: 84,
+ 0x8db: 84,
+ 0x8dc: 84,
+ 0x8dd: 84,
+ 0x8de: 84,
+ 0x8df: 84,
+ 0x8e0: 84,
+ 0x8e1: 84,
+ 0x8e3: 84,
+ 0x8e4: 84,
+ 0x8e5: 84,
+ 0x8e6: 84,
+ 0x8e7: 84,
+ 0x8e8: 84,
+ 0x8e9: 84,
+ 0x8ea: 84,
+ 0x8eb: 84,
+ 0x8ec: 84,
+ 0x8ed: 84,
+ 0x8ee: 84,
+ 0x8ef: 84,
+ 0x8f0: 84,
+ 0x8f1: 84,
+ 0x8f2: 84,
+ 0x8f3: 84,
+ 0x8f4: 84,
+ 0x8f5: 84,
+ 0x8f6: 84,
+ 0x8f7: 84,
+ 0x8f8: 84,
+ 0x8f9: 84,
+ 0x8fa: 84,
+ 0x8fb: 84,
+ 0x8fc: 84,
+ 0x8fd: 84,
+ 0x8fe: 84,
+ 0x8ff: 84,
+ 0x900: 84,
+ 0x901: 84,
+ 0x902: 84,
+ 0x93a: 84,
+ 0x93c: 84,
+ 0x941: 84,
+ 0x942: 84,
+ 0x943: 84,
+ 0x944: 84,
+ 0x945: 84,
+ 0x946: 84,
+ 0x947: 84,
+ 0x948: 84,
+ 0x94d: 84,
+ 0x951: 84,
+ 0x952: 84,
+ 0x953: 84,
+ 0x954: 84,
+ 0x955: 84,
+ 0x956: 84,
+ 0x957: 84,
+ 0x962: 84,
+ 0x963: 84,
+ 0x981: 84,
+ 0x9bc: 84,
+ 0x9c1: 84,
+ 0x9c2: 84,
+ 0x9c3: 84,
+ 0x9c4: 84,
+ 0x9cd: 84,
+ 0x9e2: 84,
+ 0x9e3: 84,
+ 0x9fe: 84,
+ 0xa01: 84,
+ 0xa02: 84,
+ 0xa3c: 84,
+ 0xa41: 84,
+ 0xa42: 84,
+ 0xa47: 84,
+ 0xa48: 84,
+ 0xa4b: 84,
+ 0xa4c: 84,
+ 0xa4d: 84,
+ 0xa51: 84,
+ 0xa70: 84,
+ 0xa71: 84,
+ 0xa75: 84,
+ 0xa81: 84,
+ 0xa82: 84,
+ 0xabc: 84,
+ 0xac1: 84,
+ 0xac2: 84,
+ 0xac3: 84,
+ 0xac4: 84,
+ 0xac5: 84,
+ 0xac7: 84,
+ 0xac8: 84,
+ 0xacd: 84,
+ 0xae2: 84,
+ 0xae3: 84,
+ 0xafa: 84,
+ 0xafb: 84,
+ 0xafc: 84,
+ 0xafd: 84,
+ 0xafe: 84,
+ 0xaff: 84,
+ 0xb01: 84,
+ 0xb3c: 84,
+ 0xb3f: 84,
+ 0xb41: 84,
+ 0xb42: 84,
+ 0xb43: 84,
+ 0xb44: 84,
+ 0xb4d: 84,
+ 0xb55: 84,
+ 0xb56: 84,
+ 0xb62: 84,
+ 0xb63: 84,
+ 0xb82: 84,
+ 0xbc0: 84,
+ 0xbcd: 84,
+ 0xc00: 84,
+ 0xc04: 84,
+ 0xc3c: 84,
+ 0xc3e: 84,
+ 0xc3f: 84,
+ 0xc40: 84,
+ 0xc46: 84,
+ 0xc47: 84,
+ 0xc48: 84,
+ 0xc4a: 84,
+ 0xc4b: 84,
+ 0xc4c: 84,
+ 0xc4d: 84,
+ 0xc55: 84,
+ 0xc56: 84,
+ 0xc62: 84,
+ 0xc63: 84,
+ 0xc81: 84,
+ 0xcbc: 84,
+ 0xcbf: 84,
+ 0xcc6: 84,
+ 0xccc: 84,
+ 0xccd: 84,
+ 0xce2: 84,
+ 0xce3: 84,
+ 0xd00: 84,
+ 0xd01: 84,
+ 0xd3b: 84,
+ 0xd3c: 84,
+ 0xd41: 84,
+ 0xd42: 84,
+ 0xd43: 84,
+ 0xd44: 84,
+ 0xd4d: 84,
+ 0xd62: 84,
+ 0xd63: 84,
+ 0xd81: 84,
+ 0xdca: 84,
+ 0xdd2: 84,
+ 0xdd3: 84,
+ 0xdd4: 84,
+ 0xdd6: 84,
+ 0xe31: 84,
+ 0xe34: 84,
+ 0xe35: 84,
+ 0xe36: 84,
+ 0xe37: 84,
+ 0xe38: 84,
+ 0xe39: 84,
+ 0xe3a: 84,
+ 0xe47: 84,
+ 0xe48: 84,
+ 0xe49: 84,
+ 0xe4a: 84,
+ 0xe4b: 84,
+ 0xe4c: 84,
+ 0xe4d: 84,
+ 0xe4e: 84,
+ 0xeb1: 84,
+ 0xeb4: 84,
+ 0xeb5: 84,
+ 0xeb6: 84,
+ 0xeb7: 84,
+ 0xeb8: 84,
+ 0xeb9: 84,
+ 0xeba: 84,
+ 0xebb: 84,
+ 0xebc: 84,
+ 0xec8: 84,
+ 0xec9: 84,
+ 0xeca: 84,
+ 0xecb: 84,
+ 0xecc: 84,
+ 0xecd: 84,
+ 0xece: 84,
+ 0xf18: 84,
+ 0xf19: 84,
+ 0xf35: 84,
+ 0xf37: 84,
+ 0xf39: 84,
+ 0xf71: 84,
+ 0xf72: 84,
+ 0xf73: 84,
+ 0xf74: 84,
+ 0xf75: 84,
+ 0xf76: 84,
+ 0xf77: 84,
+ 0xf78: 84,
+ 0xf79: 84,
+ 0xf7a: 84,
+ 0xf7b: 84,
+ 0xf7c: 84,
+ 0xf7d: 84,
+ 0xf7e: 84,
+ 0xf80: 84,
+ 0xf81: 84,
+ 0xf82: 84,
+ 0xf83: 84,
+ 0xf84: 84,
+ 0xf86: 84,
+ 0xf87: 84,
+ 0xf8d: 84,
+ 0xf8e: 84,
+ 0xf8f: 84,
+ 0xf90: 84,
+ 0xf91: 84,
+ 0xf92: 84,
+ 0xf93: 84,
+ 0xf94: 84,
+ 0xf95: 84,
+ 0xf96: 84,
+ 0xf97: 84,
+ 0xf99: 84,
+ 0xf9a: 84,
+ 0xf9b: 84,
+ 0xf9c: 84,
+ 0xf9d: 84,
+ 0xf9e: 84,
+ 0xf9f: 84,
+ 0xfa0: 84,
+ 0xfa1: 84,
+ 0xfa2: 84,
+ 0xfa3: 84,
+ 0xfa4: 84,
+ 0xfa5: 84,
+ 0xfa6: 84,
+ 0xfa7: 84,
+ 0xfa8: 84,
+ 0xfa9: 84,
+ 0xfaa: 84,
+ 0xfab: 84,
+ 0xfac: 84,
+ 0xfad: 84,
+ 0xfae: 84,
+ 0xfaf: 84,
+ 0xfb0: 84,
+ 0xfb1: 84,
+ 0xfb2: 84,
+ 0xfb3: 84,
+ 0xfb4: 84,
+ 0xfb5: 84,
+ 0xfb6: 84,
+ 0xfb7: 84,
+ 0xfb8: 84,
+ 0xfb9: 84,
+ 0xfba: 84,
+ 0xfbb: 84,
+ 0xfbc: 84,
+ 0xfc6: 84,
+ 0x102d: 84,
+ 0x102e: 84,
+ 0x102f: 84,
+ 0x1030: 84,
+ 0x1032: 84,
+ 0x1033: 84,
+ 0x1034: 84,
+ 0x1035: 84,
+ 0x1036: 84,
+ 0x1037: 84,
+ 0x1039: 84,
+ 0x103a: 84,
+ 0x103d: 84,
+ 0x103e: 84,
+ 0x1058: 84,
+ 0x1059: 84,
+ 0x105e: 84,
+ 0x105f: 84,
+ 0x1060: 84,
+ 0x1071: 84,
+ 0x1072: 84,
+ 0x1073: 84,
+ 0x1074: 84,
+ 0x1082: 84,
+ 0x1085: 84,
+ 0x1086: 84,
+ 0x108d: 84,
+ 0x109d: 84,
+ 0x135d: 84,
+ 0x135e: 84,
+ 0x135f: 84,
+ 0x1712: 84,
+ 0x1713: 84,
+ 0x1714: 84,
+ 0x1732: 84,
+ 0x1733: 84,
+ 0x1752: 84,
+ 0x1753: 84,
+ 0x1772: 84,
+ 0x1773: 84,
+ 0x17b4: 84,
+ 0x17b5: 84,
+ 0x17b7: 84,
+ 0x17b8: 84,
+ 0x17b9: 84,
+ 0x17ba: 84,
+ 0x17bb: 84,
+ 0x17bc: 84,
+ 0x17bd: 84,
+ 0x17c6: 84,
+ 0x17c9: 84,
+ 0x17ca: 84,
+ 0x17cb: 84,
+ 0x17cc: 84,
+ 0x17cd: 84,
+ 0x17ce: 84,
+ 0x17cf: 84,
+ 0x17d0: 84,
+ 0x17d1: 84,
+ 0x17d2: 84,
+ 0x17d3: 84,
+ 0x17dd: 84,
0x1807: 68,
0x180a: 67,
- 0x180e: 85,
+ 0x180b: 84,
+ 0x180c: 84,
+ 0x180d: 84,
+ 0x180f: 84,
0x1820: 68,
0x1821: 68,
0x1822: 68,
@@ -581,11 +1215,6 @@ joining_types = {
0x1876: 68,
0x1877: 68,
0x1878: 68,
- 0x1880: 85,
- 0x1881: 85,
- 0x1882: 85,
- 0x1883: 85,
- 0x1884: 85,
0x1885: 84,
0x1886: 84,
0x1887: 68,
@@ -622,14 +1251,339 @@ joining_types = {
0x18a6: 68,
0x18a7: 68,
0x18a8: 68,
+ 0x18a9: 84,
0x18aa: 68,
- 0x200c: 85,
+ 0x1920: 84,
+ 0x1921: 84,
+ 0x1922: 84,
+ 0x1927: 84,
+ 0x1928: 84,
+ 0x1932: 84,
+ 0x1939: 84,
+ 0x193a: 84,
+ 0x193b: 84,
+ 0x1a17: 84,
+ 0x1a18: 84,
+ 0x1a1b: 84,
+ 0x1a56: 84,
+ 0x1a58: 84,
+ 0x1a59: 84,
+ 0x1a5a: 84,
+ 0x1a5b: 84,
+ 0x1a5c: 84,
+ 0x1a5d: 84,
+ 0x1a5e: 84,
+ 0x1a60: 84,
+ 0x1a62: 84,
+ 0x1a65: 84,
+ 0x1a66: 84,
+ 0x1a67: 84,
+ 0x1a68: 84,
+ 0x1a69: 84,
+ 0x1a6a: 84,
+ 0x1a6b: 84,
+ 0x1a6c: 84,
+ 0x1a73: 84,
+ 0x1a74: 84,
+ 0x1a75: 84,
+ 0x1a76: 84,
+ 0x1a77: 84,
+ 0x1a78: 84,
+ 0x1a79: 84,
+ 0x1a7a: 84,
+ 0x1a7b: 84,
+ 0x1a7c: 84,
+ 0x1a7f: 84,
+ 0x1ab0: 84,
+ 0x1ab1: 84,
+ 0x1ab2: 84,
+ 0x1ab3: 84,
+ 0x1ab4: 84,
+ 0x1ab5: 84,
+ 0x1ab6: 84,
+ 0x1ab7: 84,
+ 0x1ab8: 84,
+ 0x1ab9: 84,
+ 0x1aba: 84,
+ 0x1abb: 84,
+ 0x1abc: 84,
+ 0x1abd: 84,
+ 0x1abe: 84,
+ 0x1abf: 84,
+ 0x1ac0: 84,
+ 0x1ac1: 84,
+ 0x1ac2: 84,
+ 0x1ac3: 84,
+ 0x1ac4: 84,
+ 0x1ac5: 84,
+ 0x1ac6: 84,
+ 0x1ac7: 84,
+ 0x1ac8: 84,
+ 0x1ac9: 84,
+ 0x1aca: 84,
+ 0x1acb: 84,
+ 0x1acc: 84,
+ 0x1acd: 84,
+ 0x1ace: 84,
+ 0x1b00: 84,
+ 0x1b01: 84,
+ 0x1b02: 84,
+ 0x1b03: 84,
+ 0x1b34: 84,
+ 0x1b36: 84,
+ 0x1b37: 84,
+ 0x1b38: 84,
+ 0x1b39: 84,
+ 0x1b3a: 84,
+ 0x1b3c: 84,
+ 0x1b42: 84,
+ 0x1b6b: 84,
+ 0x1b6c: 84,
+ 0x1b6d: 84,
+ 0x1b6e: 84,
+ 0x1b6f: 84,
+ 0x1b70: 84,
+ 0x1b71: 84,
+ 0x1b72: 84,
+ 0x1b73: 84,
+ 0x1b80: 84,
+ 0x1b81: 84,
+ 0x1ba2: 84,
+ 0x1ba3: 84,
+ 0x1ba4: 84,
+ 0x1ba5: 84,
+ 0x1ba8: 84,
+ 0x1ba9: 84,
+ 0x1bab: 84,
+ 0x1bac: 84,
+ 0x1bad: 84,
+ 0x1be6: 84,
+ 0x1be8: 84,
+ 0x1be9: 84,
+ 0x1bed: 84,
+ 0x1bef: 84,
+ 0x1bf0: 84,
+ 0x1bf1: 84,
+ 0x1c2c: 84,
+ 0x1c2d: 84,
+ 0x1c2e: 84,
+ 0x1c2f: 84,
+ 0x1c30: 84,
+ 0x1c31: 84,
+ 0x1c32: 84,
+ 0x1c33: 84,
+ 0x1c36: 84,
+ 0x1c37: 84,
+ 0x1cd0: 84,
+ 0x1cd1: 84,
+ 0x1cd2: 84,
+ 0x1cd4: 84,
+ 0x1cd5: 84,
+ 0x1cd6: 84,
+ 0x1cd7: 84,
+ 0x1cd8: 84,
+ 0x1cd9: 84,
+ 0x1cda: 84,
+ 0x1cdb: 84,
+ 0x1cdc: 84,
+ 0x1cdd: 84,
+ 0x1cde: 84,
+ 0x1cdf: 84,
+ 0x1ce0: 84,
+ 0x1ce2: 84,
+ 0x1ce3: 84,
+ 0x1ce4: 84,
+ 0x1ce5: 84,
+ 0x1ce6: 84,
+ 0x1ce7: 84,
+ 0x1ce8: 84,
+ 0x1ced: 84,
+ 0x1cf4: 84,
+ 0x1cf8: 84,
+ 0x1cf9: 84,
+ 0x1dc0: 84,
+ 0x1dc1: 84,
+ 0x1dc2: 84,
+ 0x1dc3: 84,
+ 0x1dc4: 84,
+ 0x1dc5: 84,
+ 0x1dc6: 84,
+ 0x1dc7: 84,
+ 0x1dc8: 84,
+ 0x1dc9: 84,
+ 0x1dca: 84,
+ 0x1dcb: 84,
+ 0x1dcc: 84,
+ 0x1dcd: 84,
+ 0x1dce: 84,
+ 0x1dcf: 84,
+ 0x1dd0: 84,
+ 0x1dd1: 84,
+ 0x1dd2: 84,
+ 0x1dd3: 84,
+ 0x1dd4: 84,
+ 0x1dd5: 84,
+ 0x1dd6: 84,
+ 0x1dd7: 84,
+ 0x1dd8: 84,
+ 0x1dd9: 84,
+ 0x1dda: 84,
+ 0x1ddb: 84,
+ 0x1ddc: 84,
+ 0x1ddd: 84,
+ 0x1dde: 84,
+ 0x1ddf: 84,
+ 0x1de0: 84,
+ 0x1de1: 84,
+ 0x1de2: 84,
+ 0x1de3: 84,
+ 0x1de4: 84,
+ 0x1de5: 84,
+ 0x1de6: 84,
+ 0x1de7: 84,
+ 0x1de8: 84,
+ 0x1de9: 84,
+ 0x1dea: 84,
+ 0x1deb: 84,
+ 0x1dec: 84,
+ 0x1ded: 84,
+ 0x1dee: 84,
+ 0x1def: 84,
+ 0x1df0: 84,
+ 0x1df1: 84,
+ 0x1df2: 84,
+ 0x1df3: 84,
+ 0x1df4: 84,
+ 0x1df5: 84,
+ 0x1df6: 84,
+ 0x1df7: 84,
+ 0x1df8: 84,
+ 0x1df9: 84,
+ 0x1dfa: 84,
+ 0x1dfb: 84,
+ 0x1dfc: 84,
+ 0x1dfd: 84,
+ 0x1dfe: 84,
+ 0x1dff: 84,
+ 0x200b: 84,
0x200d: 67,
- 0x202f: 85,
- 0x2066: 85,
- 0x2067: 85,
- 0x2068: 85,
- 0x2069: 85,
+ 0x200e: 84,
+ 0x200f: 84,
+ 0x202a: 84,
+ 0x202b: 84,
+ 0x202c: 84,
+ 0x202d: 84,
+ 0x202e: 84,
+ 0x2060: 84,
+ 0x2061: 84,
+ 0x2062: 84,
+ 0x2063: 84,
+ 0x2064: 84,
+ 0x206a: 84,
+ 0x206b: 84,
+ 0x206c: 84,
+ 0x206d: 84,
+ 0x206e: 84,
+ 0x206f: 84,
+ 0x20d0: 84,
+ 0x20d1: 84,
+ 0x20d2: 84,
+ 0x20d3: 84,
+ 0x20d4: 84,
+ 0x20d5: 84,
+ 0x20d6: 84,
+ 0x20d7: 84,
+ 0x20d8: 84,
+ 0x20d9: 84,
+ 0x20da: 84,
+ 0x20db: 84,
+ 0x20dc: 84,
+ 0x20dd: 84,
+ 0x20de: 84,
+ 0x20df: 84,
+ 0x20e0: 84,
+ 0x20e1: 84,
+ 0x20e2: 84,
+ 0x20e3: 84,
+ 0x20e4: 84,
+ 0x20e5: 84,
+ 0x20e6: 84,
+ 0x20e7: 84,
+ 0x20e8: 84,
+ 0x20e9: 84,
+ 0x20ea: 84,
+ 0x20eb: 84,
+ 0x20ec: 84,
+ 0x20ed: 84,
+ 0x20ee: 84,
+ 0x20ef: 84,
+ 0x20f0: 84,
+ 0x2cef: 84,
+ 0x2cf0: 84,
+ 0x2cf1: 84,
+ 0x2d7f: 84,
+ 0x2de0: 84,
+ 0x2de1: 84,
+ 0x2de2: 84,
+ 0x2de3: 84,
+ 0x2de4: 84,
+ 0x2de5: 84,
+ 0x2de6: 84,
+ 0x2de7: 84,
+ 0x2de8: 84,
+ 0x2de9: 84,
+ 0x2dea: 84,
+ 0x2deb: 84,
+ 0x2dec: 84,
+ 0x2ded: 84,
+ 0x2dee: 84,
+ 0x2def: 84,
+ 0x2df0: 84,
+ 0x2df1: 84,
+ 0x2df2: 84,
+ 0x2df3: 84,
+ 0x2df4: 84,
+ 0x2df5: 84,
+ 0x2df6: 84,
+ 0x2df7: 84,
+ 0x2df8: 84,
+ 0x2df9: 84,
+ 0x2dfa: 84,
+ 0x2dfb: 84,
+ 0x2dfc: 84,
+ 0x2dfd: 84,
+ 0x2dfe: 84,
+ 0x2dff: 84,
+ 0x302a: 84,
+ 0x302b: 84,
+ 0x302c: 84,
+ 0x302d: 84,
+ 0x3099: 84,
+ 0x309a: 84,
+ 0xa66f: 84,
+ 0xa670: 84,
+ 0xa671: 84,
+ 0xa672: 84,
+ 0xa674: 84,
+ 0xa675: 84,
+ 0xa676: 84,
+ 0xa677: 84,
+ 0xa678: 84,
+ 0xa679: 84,
+ 0xa67a: 84,
+ 0xa67b: 84,
+ 0xa67c: 84,
+ 0xa67d: 84,
+ 0xa69e: 84,
+ 0xa69f: 84,
+ 0xa6f0: 84,
+ 0xa6f1: 84,
+ 0xa802: 84,
+ 0xa806: 84,
+ 0xa80b: 84,
+ 0xa825: 84,
+ 0xa826: 84,
+ 0xa82c: 84,
0xa840: 68,
0xa841: 68,
0xa842: 68,
@@ -681,20 +1635,151 @@ joining_types = {
0xa870: 68,
0xa871: 68,
0xa872: 76,
- 0xa873: 85,
+ 0xa8c4: 84,
+ 0xa8c5: 84,
+ 0xa8e0: 84,
+ 0xa8e1: 84,
+ 0xa8e2: 84,
+ 0xa8e3: 84,
+ 0xa8e4: 84,
+ 0xa8e5: 84,
+ 0xa8e6: 84,
+ 0xa8e7: 84,
+ 0xa8e8: 84,
+ 0xa8e9: 84,
+ 0xa8ea: 84,
+ 0xa8eb: 84,
+ 0xa8ec: 84,
+ 0xa8ed: 84,
+ 0xa8ee: 84,
+ 0xa8ef: 84,
+ 0xa8f0: 84,
+ 0xa8f1: 84,
+ 0xa8ff: 84,
+ 0xa926: 84,
+ 0xa927: 84,
+ 0xa928: 84,
+ 0xa929: 84,
+ 0xa92a: 84,
+ 0xa92b: 84,
+ 0xa92c: 84,
+ 0xa92d: 84,
+ 0xa947: 84,
+ 0xa948: 84,
+ 0xa949: 84,
+ 0xa94a: 84,
+ 0xa94b: 84,
+ 0xa94c: 84,
+ 0xa94d: 84,
+ 0xa94e: 84,
+ 0xa94f: 84,
+ 0xa950: 84,
+ 0xa951: 84,
+ 0xa980: 84,
+ 0xa981: 84,
+ 0xa982: 84,
+ 0xa9b3: 84,
+ 0xa9b6: 84,
+ 0xa9b7: 84,
+ 0xa9b8: 84,
+ 0xa9b9: 84,
+ 0xa9bc: 84,
+ 0xa9bd: 84,
+ 0xa9e5: 84,
+ 0xaa29: 84,
+ 0xaa2a: 84,
+ 0xaa2b: 84,
+ 0xaa2c: 84,
+ 0xaa2d: 84,
+ 0xaa2e: 84,
+ 0xaa31: 84,
+ 0xaa32: 84,
+ 0xaa35: 84,
+ 0xaa36: 84,
+ 0xaa43: 84,
+ 0xaa4c: 84,
+ 0xaa7c: 84,
+ 0xaab0: 84,
+ 0xaab2: 84,
+ 0xaab3: 84,
+ 0xaab4: 84,
+ 0xaab7: 84,
+ 0xaab8: 84,
+ 0xaabe: 84,
+ 0xaabf: 84,
+ 0xaac1: 84,
+ 0xaaec: 84,
+ 0xaaed: 84,
+ 0xaaf6: 84,
+ 0xabe5: 84,
+ 0xabe8: 84,
+ 0xabed: 84,
+ 0xfb1e: 84,
+ 0xfe00: 84,
+ 0xfe01: 84,
+ 0xfe02: 84,
+ 0xfe03: 84,
+ 0xfe04: 84,
+ 0xfe05: 84,
+ 0xfe06: 84,
+ 0xfe07: 84,
+ 0xfe08: 84,
+ 0xfe09: 84,
+ 0xfe0a: 84,
+ 0xfe0b: 84,
+ 0xfe0c: 84,
+ 0xfe0d: 84,
+ 0xfe0e: 84,
+ 0xfe0f: 84,
+ 0xfe20: 84,
+ 0xfe21: 84,
+ 0xfe22: 84,
+ 0xfe23: 84,
+ 0xfe24: 84,
+ 0xfe25: 84,
+ 0xfe26: 84,
+ 0xfe27: 84,
+ 0xfe28: 84,
+ 0xfe29: 84,
+ 0xfe2a: 84,
+ 0xfe2b: 84,
+ 0xfe2c: 84,
+ 0xfe2d: 84,
+ 0xfe2e: 84,
+ 0xfe2f: 84,
+ 0xfeff: 84,
+ 0xfff9: 84,
+ 0xfffa: 84,
+ 0xfffb: 84,
+ 0x101fd: 84,
+ 0x102e0: 84,
+ 0x10376: 84,
+ 0x10377: 84,
+ 0x10378: 84,
+ 0x10379: 84,
+ 0x1037a: 84,
+ 0x10a01: 84,
+ 0x10a02: 84,
+ 0x10a03: 84,
+ 0x10a05: 84,
+ 0x10a06: 84,
+ 0x10a0c: 84,
+ 0x10a0d: 84,
+ 0x10a0e: 84,
+ 0x10a0f: 84,
+ 0x10a38: 84,
+ 0x10a39: 84,
+ 0x10a3a: 84,
+ 0x10a3f: 84,
0x10ac0: 68,
0x10ac1: 68,
0x10ac2: 68,
0x10ac3: 68,
0x10ac4: 68,
0x10ac5: 82,
- 0x10ac6: 85,
0x10ac7: 82,
- 0x10ac8: 85,
0x10ac9: 82,
0x10aca: 82,
- 0x10acb: 85,
- 0x10acc: 85,
0x10acd: 76,
0x10ace: 82,
0x10acf: 82,
@@ -716,9 +1801,9 @@ joining_types = {
0x10adf: 68,
0x10ae0: 68,
0x10ae1: 82,
- 0x10ae2: 85,
- 0x10ae3: 85,
0x10ae4: 82,
+ 0x10ae5: 84,
+ 0x10ae6: 84,
0x10aeb: 68,
0x10aec: 68,
0x10aed: 68,
@@ -748,7 +1833,6 @@ joining_types = {
0x10bac: 82,
0x10bad: 68,
0x10bae: 68,
- 0x10baf: 85,
0x10d00: 76,
0x10d01: 68,
0x10d02: 68,
@@ -785,6 +1869,15 @@ joining_types = {
0x10d21: 68,
0x10d22: 82,
0x10d23: 68,
+ 0x10d24: 84,
+ 0x10d25: 84,
+ 0x10d26: 84,
+ 0x10d27: 84,
+ 0x10eab: 84,
+ 0x10eac: 84,
+ 0x10efd: 84,
+ 0x10efe: 84,
+ 0x10eff: 84,
0x10f30: 68,
0x10f31: 68,
0x10f32: 68,
@@ -806,7 +1899,17 @@ joining_types = {
0x10f42: 68,
0x10f43: 68,
0x10f44: 68,
- 0x10f45: 85,
+ 0x10f46: 84,
+ 0x10f47: 84,
+ 0x10f48: 84,
+ 0x10f49: 84,
+ 0x10f4a: 84,
+ 0x10f4b: 84,
+ 0x10f4c: 84,
+ 0x10f4d: 84,
+ 0x10f4e: 84,
+ 0x10f4f: 84,
+ 0x10f50: 84,
0x10f51: 68,
0x10f52: 68,
0x10f53: 68,
@@ -829,14 +1932,16 @@ joining_types = {
0x10f7f: 68,
0x10f80: 68,
0x10f81: 68,
+ 0x10f82: 84,
+ 0x10f83: 84,
+ 0x10f84: 84,
+ 0x10f85: 84,
0x10fb0: 68,
- 0x10fb1: 85,
0x10fb2: 68,
0x10fb3: 68,
0x10fb4: 82,
0x10fb5: 82,
0x10fb6: 82,
- 0x10fb7: 85,
0x10fb8: 68,
0x10fb9: 82,
0x10fba: 82,
@@ -845,20 +1950,668 @@ joining_types = {
0x10fbd: 82,
0x10fbe: 68,
0x10fbf: 68,
- 0x10fc0: 85,
0x10fc1: 68,
0x10fc2: 82,
0x10fc3: 82,
0x10fc4: 68,
- 0x10fc5: 85,
- 0x10fc6: 85,
- 0x10fc7: 85,
- 0x10fc8: 85,
0x10fc9: 82,
0x10fca: 68,
0x10fcb: 76,
- 0x110bd: 85,
- 0x110cd: 85,
+ 0x11001: 84,
+ 0x11038: 84,
+ 0x11039: 84,
+ 0x1103a: 84,
+ 0x1103b: 84,
+ 0x1103c: 84,
+ 0x1103d: 84,
+ 0x1103e: 84,
+ 0x1103f: 84,
+ 0x11040: 84,
+ 0x11041: 84,
+ 0x11042: 84,
+ 0x11043: 84,
+ 0x11044: 84,
+ 0x11045: 84,
+ 0x11046: 84,
+ 0x11070: 84,
+ 0x11073: 84,
+ 0x11074: 84,
+ 0x1107f: 84,
+ 0x11080: 84,
+ 0x11081: 84,
+ 0x110b3: 84,
+ 0x110b4: 84,
+ 0x110b5: 84,
+ 0x110b6: 84,
+ 0x110b9: 84,
+ 0x110ba: 84,
+ 0x110c2: 84,
+ 0x11100: 84,
+ 0x11101: 84,
+ 0x11102: 84,
+ 0x11127: 84,
+ 0x11128: 84,
+ 0x11129: 84,
+ 0x1112a: 84,
+ 0x1112b: 84,
+ 0x1112d: 84,
+ 0x1112e: 84,
+ 0x1112f: 84,
+ 0x11130: 84,
+ 0x11131: 84,
+ 0x11132: 84,
+ 0x11133: 84,
+ 0x11134: 84,
+ 0x11173: 84,
+ 0x11180: 84,
+ 0x11181: 84,
+ 0x111b6: 84,
+ 0x111b7: 84,
+ 0x111b8: 84,
+ 0x111b9: 84,
+ 0x111ba: 84,
+ 0x111bb: 84,
+ 0x111bc: 84,
+ 0x111bd: 84,
+ 0x111be: 84,
+ 0x111c9: 84,
+ 0x111ca: 84,
+ 0x111cb: 84,
+ 0x111cc: 84,
+ 0x111cf: 84,
+ 0x1122f: 84,
+ 0x11230: 84,
+ 0x11231: 84,
+ 0x11234: 84,
+ 0x11236: 84,
+ 0x11237: 84,
+ 0x1123e: 84,
+ 0x11241: 84,
+ 0x112df: 84,
+ 0x112e3: 84,
+ 0x112e4: 84,
+ 0x112e5: 84,
+ 0x112e6: 84,
+ 0x112e7: 84,
+ 0x112e8: 84,
+ 0x112e9: 84,
+ 0x112ea: 84,
+ 0x11300: 84,
+ 0x11301: 84,
+ 0x1133b: 84,
+ 0x1133c: 84,
+ 0x11340: 84,
+ 0x11366: 84,
+ 0x11367: 84,
+ 0x11368: 84,
+ 0x11369: 84,
+ 0x1136a: 84,
+ 0x1136b: 84,
+ 0x1136c: 84,
+ 0x11370: 84,
+ 0x11371: 84,
+ 0x11372: 84,
+ 0x11373: 84,
+ 0x11374: 84,
+ 0x11438: 84,
+ 0x11439: 84,
+ 0x1143a: 84,
+ 0x1143b: 84,
+ 0x1143c: 84,
+ 0x1143d: 84,
+ 0x1143e: 84,
+ 0x1143f: 84,
+ 0x11442: 84,
+ 0x11443: 84,
+ 0x11444: 84,
+ 0x11446: 84,
+ 0x1145e: 84,
+ 0x114b3: 84,
+ 0x114b4: 84,
+ 0x114b5: 84,
+ 0x114b6: 84,
+ 0x114b7: 84,
+ 0x114b8: 84,
+ 0x114ba: 84,
+ 0x114bf: 84,
+ 0x114c0: 84,
+ 0x114c2: 84,
+ 0x114c3: 84,
+ 0x115b2: 84,
+ 0x115b3: 84,
+ 0x115b4: 84,
+ 0x115b5: 84,
+ 0x115bc: 84,
+ 0x115bd: 84,
+ 0x115bf: 84,
+ 0x115c0: 84,
+ 0x115dc: 84,
+ 0x115dd: 84,
+ 0x11633: 84,
+ 0x11634: 84,
+ 0x11635: 84,
+ 0x11636: 84,
+ 0x11637: 84,
+ 0x11638: 84,
+ 0x11639: 84,
+ 0x1163a: 84,
+ 0x1163d: 84,
+ 0x1163f: 84,
+ 0x11640: 84,
+ 0x116ab: 84,
+ 0x116ad: 84,
+ 0x116b0: 84,
+ 0x116b1: 84,
+ 0x116b2: 84,
+ 0x116b3: 84,
+ 0x116b4: 84,
+ 0x116b5: 84,
+ 0x116b7: 84,
+ 0x1171d: 84,
+ 0x1171e: 84,
+ 0x1171f: 84,
+ 0x11722: 84,
+ 0x11723: 84,
+ 0x11724: 84,
+ 0x11725: 84,
+ 0x11727: 84,
+ 0x11728: 84,
+ 0x11729: 84,
+ 0x1172a: 84,
+ 0x1172b: 84,
+ 0x1182f: 84,
+ 0x11830: 84,
+ 0x11831: 84,
+ 0x11832: 84,
+ 0x11833: 84,
+ 0x11834: 84,
+ 0x11835: 84,
+ 0x11836: 84,
+ 0x11837: 84,
+ 0x11839: 84,
+ 0x1183a: 84,
+ 0x1193b: 84,
+ 0x1193c: 84,
+ 0x1193e: 84,
+ 0x11943: 84,
+ 0x119d4: 84,
+ 0x119d5: 84,
+ 0x119d6: 84,
+ 0x119d7: 84,
+ 0x119da: 84,
+ 0x119db: 84,
+ 0x119e0: 84,
+ 0x11a01: 84,
+ 0x11a02: 84,
+ 0x11a03: 84,
+ 0x11a04: 84,
+ 0x11a05: 84,
+ 0x11a06: 84,
+ 0x11a07: 84,
+ 0x11a08: 84,
+ 0x11a09: 84,
+ 0x11a0a: 84,
+ 0x11a33: 84,
+ 0x11a34: 84,
+ 0x11a35: 84,
+ 0x11a36: 84,
+ 0x11a37: 84,
+ 0x11a38: 84,
+ 0x11a3b: 84,
+ 0x11a3c: 84,
+ 0x11a3d: 84,
+ 0x11a3e: 84,
+ 0x11a47: 84,
+ 0x11a51: 84,
+ 0x11a52: 84,
+ 0x11a53: 84,
+ 0x11a54: 84,
+ 0x11a55: 84,
+ 0x11a56: 84,
+ 0x11a59: 84,
+ 0x11a5a: 84,
+ 0x11a5b: 84,
+ 0x11a8a: 84,
+ 0x11a8b: 84,
+ 0x11a8c: 84,
+ 0x11a8d: 84,
+ 0x11a8e: 84,
+ 0x11a8f: 84,
+ 0x11a90: 84,
+ 0x11a91: 84,
+ 0x11a92: 84,
+ 0x11a93: 84,
+ 0x11a94: 84,
+ 0x11a95: 84,
+ 0x11a96: 84,
+ 0x11a98: 84,
+ 0x11a99: 84,
+ 0x11c30: 84,
+ 0x11c31: 84,
+ 0x11c32: 84,
+ 0x11c33: 84,
+ 0x11c34: 84,
+ 0x11c35: 84,
+ 0x11c36: 84,
+ 0x11c38: 84,
+ 0x11c39: 84,
+ 0x11c3a: 84,
+ 0x11c3b: 84,
+ 0x11c3c: 84,
+ 0x11c3d: 84,
+ 0x11c3f: 84,
+ 0x11c92: 84,
+ 0x11c93: 84,
+ 0x11c94: 84,
+ 0x11c95: 84,
+ 0x11c96: 84,
+ 0x11c97: 84,
+ 0x11c98: 84,
+ 0x11c99: 84,
+ 0x11c9a: 84,
+ 0x11c9b: 84,
+ 0x11c9c: 84,
+ 0x11c9d: 84,
+ 0x11c9e: 84,
+ 0x11c9f: 84,
+ 0x11ca0: 84,
+ 0x11ca1: 84,
+ 0x11ca2: 84,
+ 0x11ca3: 84,
+ 0x11ca4: 84,
+ 0x11ca5: 84,
+ 0x11ca6: 84,
+ 0x11ca7: 84,
+ 0x11caa: 84,
+ 0x11cab: 84,
+ 0x11cac: 84,
+ 0x11cad: 84,
+ 0x11cae: 84,
+ 0x11caf: 84,
+ 0x11cb0: 84,
+ 0x11cb2: 84,
+ 0x11cb3: 84,
+ 0x11cb5: 84,
+ 0x11cb6: 84,
+ 0x11d31: 84,
+ 0x11d32: 84,
+ 0x11d33: 84,
+ 0x11d34: 84,
+ 0x11d35: 84,
+ 0x11d36: 84,
+ 0x11d3a: 84,
+ 0x11d3c: 84,
+ 0x11d3d: 84,
+ 0x11d3f: 84,
+ 0x11d40: 84,
+ 0x11d41: 84,
+ 0x11d42: 84,
+ 0x11d43: 84,
+ 0x11d44: 84,
+ 0x11d45: 84,
+ 0x11d47: 84,
+ 0x11d90: 84,
+ 0x11d91: 84,
+ 0x11d95: 84,
+ 0x11d97: 84,
+ 0x11ef3: 84,
+ 0x11ef4: 84,
+ 0x11f00: 84,
+ 0x11f01: 84,
+ 0x11f36: 84,
+ 0x11f37: 84,
+ 0x11f38: 84,
+ 0x11f39: 84,
+ 0x11f3a: 84,
+ 0x11f40: 84,
+ 0x11f42: 84,
+ 0x13430: 84,
+ 0x13431: 84,
+ 0x13432: 84,
+ 0x13433: 84,
+ 0x13434: 84,
+ 0x13435: 84,
+ 0x13436: 84,
+ 0x13437: 84,
+ 0x13438: 84,
+ 0x13439: 84,
+ 0x1343a: 84,
+ 0x1343b: 84,
+ 0x1343c: 84,
+ 0x1343d: 84,
+ 0x1343e: 84,
+ 0x1343f: 84,
+ 0x13440: 84,
+ 0x13447: 84,
+ 0x13448: 84,
+ 0x13449: 84,
+ 0x1344a: 84,
+ 0x1344b: 84,
+ 0x1344c: 84,
+ 0x1344d: 84,
+ 0x1344e: 84,
+ 0x1344f: 84,
+ 0x13450: 84,
+ 0x13451: 84,
+ 0x13452: 84,
+ 0x13453: 84,
+ 0x13454: 84,
+ 0x13455: 84,
+ 0x16af0: 84,
+ 0x16af1: 84,
+ 0x16af2: 84,
+ 0x16af3: 84,
+ 0x16af4: 84,
+ 0x16b30: 84,
+ 0x16b31: 84,
+ 0x16b32: 84,
+ 0x16b33: 84,
+ 0x16b34: 84,
+ 0x16b35: 84,
+ 0x16b36: 84,
+ 0x16f4f: 84,
+ 0x16f8f: 84,
+ 0x16f90: 84,
+ 0x16f91: 84,
+ 0x16f92: 84,
+ 0x16fe4: 84,
+ 0x1bc9d: 84,
+ 0x1bc9e: 84,
+ 0x1bca0: 84,
+ 0x1bca1: 84,
+ 0x1bca2: 84,
+ 0x1bca3: 84,
+ 0x1cf00: 84,
+ 0x1cf01: 84,
+ 0x1cf02: 84,
+ 0x1cf03: 84,
+ 0x1cf04: 84,
+ 0x1cf05: 84,
+ 0x1cf06: 84,
+ 0x1cf07: 84,
+ 0x1cf08: 84,
+ 0x1cf09: 84,
+ 0x1cf0a: 84,
+ 0x1cf0b: 84,
+ 0x1cf0c: 84,
+ 0x1cf0d: 84,
+ 0x1cf0e: 84,
+ 0x1cf0f: 84,
+ 0x1cf10: 84,
+ 0x1cf11: 84,
+ 0x1cf12: 84,
+ 0x1cf13: 84,
+ 0x1cf14: 84,
+ 0x1cf15: 84,
+ 0x1cf16: 84,
+ 0x1cf17: 84,
+ 0x1cf18: 84,
+ 0x1cf19: 84,
+ 0x1cf1a: 84,
+ 0x1cf1b: 84,
+ 0x1cf1c: 84,
+ 0x1cf1d: 84,
+ 0x1cf1e: 84,
+ 0x1cf1f: 84,
+ 0x1cf20: 84,
+ 0x1cf21: 84,
+ 0x1cf22: 84,
+ 0x1cf23: 84,
+ 0x1cf24: 84,
+ 0x1cf25: 84,
+ 0x1cf26: 84,
+ 0x1cf27: 84,
+ 0x1cf28: 84,
+ 0x1cf29: 84,
+ 0x1cf2a: 84,
+ 0x1cf2b: 84,
+ 0x1cf2c: 84,
+ 0x1cf2d: 84,
+ 0x1cf30: 84,
+ 0x1cf31: 84,
+ 0x1cf32: 84,
+ 0x1cf33: 84,
+ 0x1cf34: 84,
+ 0x1cf35: 84,
+ 0x1cf36: 84,
+ 0x1cf37: 84,
+ 0x1cf38: 84,
+ 0x1cf39: 84,
+ 0x1cf3a: 84,
+ 0x1cf3b: 84,
+ 0x1cf3c: 84,
+ 0x1cf3d: 84,
+ 0x1cf3e: 84,
+ 0x1cf3f: 84,
+ 0x1cf40: 84,
+ 0x1cf41: 84,
+ 0x1cf42: 84,
+ 0x1cf43: 84,
+ 0x1cf44: 84,
+ 0x1cf45: 84,
+ 0x1cf46: 84,
+ 0x1d167: 84,
+ 0x1d168: 84,
+ 0x1d169: 84,
+ 0x1d173: 84,
+ 0x1d174: 84,
+ 0x1d175: 84,
+ 0x1d176: 84,
+ 0x1d177: 84,
+ 0x1d178: 84,
+ 0x1d179: 84,
+ 0x1d17a: 84,
+ 0x1d17b: 84,
+ 0x1d17c: 84,
+ 0x1d17d: 84,
+ 0x1d17e: 84,
+ 0x1d17f: 84,
+ 0x1d180: 84,
+ 0x1d181: 84,
+ 0x1d182: 84,
+ 0x1d185: 84,
+ 0x1d186: 84,
+ 0x1d187: 84,
+ 0x1d188: 84,
+ 0x1d189: 84,
+ 0x1d18a: 84,
+ 0x1d18b: 84,
+ 0x1d1aa: 84,
+ 0x1d1ab: 84,
+ 0x1d1ac: 84,
+ 0x1d1ad: 84,
+ 0x1d242: 84,
+ 0x1d243: 84,
+ 0x1d244: 84,
+ 0x1da00: 84,
+ 0x1da01: 84,
+ 0x1da02: 84,
+ 0x1da03: 84,
+ 0x1da04: 84,
+ 0x1da05: 84,
+ 0x1da06: 84,
+ 0x1da07: 84,
+ 0x1da08: 84,
+ 0x1da09: 84,
+ 0x1da0a: 84,
+ 0x1da0b: 84,
+ 0x1da0c: 84,
+ 0x1da0d: 84,
+ 0x1da0e: 84,
+ 0x1da0f: 84,
+ 0x1da10: 84,
+ 0x1da11: 84,
+ 0x1da12: 84,
+ 0x1da13: 84,
+ 0x1da14: 84,
+ 0x1da15: 84,
+ 0x1da16: 84,
+ 0x1da17: 84,
+ 0x1da18: 84,
+ 0x1da19: 84,
+ 0x1da1a: 84,
+ 0x1da1b: 84,
+ 0x1da1c: 84,
+ 0x1da1d: 84,
+ 0x1da1e: 84,
+ 0x1da1f: 84,
+ 0x1da20: 84,
+ 0x1da21: 84,
+ 0x1da22: 84,
+ 0x1da23: 84,
+ 0x1da24: 84,
+ 0x1da25: 84,
+ 0x1da26: 84,
+ 0x1da27: 84,
+ 0x1da28: 84,
+ 0x1da29: 84,
+ 0x1da2a: 84,
+ 0x1da2b: 84,
+ 0x1da2c: 84,
+ 0x1da2d: 84,
+ 0x1da2e: 84,
+ 0x1da2f: 84,
+ 0x1da30: 84,
+ 0x1da31: 84,
+ 0x1da32: 84,
+ 0x1da33: 84,
+ 0x1da34: 84,
+ 0x1da35: 84,
+ 0x1da36: 84,
+ 0x1da3b: 84,
+ 0x1da3c: 84,
+ 0x1da3d: 84,
+ 0x1da3e: 84,
+ 0x1da3f: 84,
+ 0x1da40: 84,
+ 0x1da41: 84,
+ 0x1da42: 84,
+ 0x1da43: 84,
+ 0x1da44: 84,
+ 0x1da45: 84,
+ 0x1da46: 84,
+ 0x1da47: 84,
+ 0x1da48: 84,
+ 0x1da49: 84,
+ 0x1da4a: 84,
+ 0x1da4b: 84,
+ 0x1da4c: 84,
+ 0x1da4d: 84,
+ 0x1da4e: 84,
+ 0x1da4f: 84,
+ 0x1da50: 84,
+ 0x1da51: 84,
+ 0x1da52: 84,
+ 0x1da53: 84,
+ 0x1da54: 84,
+ 0x1da55: 84,
+ 0x1da56: 84,
+ 0x1da57: 84,
+ 0x1da58: 84,
+ 0x1da59: 84,
+ 0x1da5a: 84,
+ 0x1da5b: 84,
+ 0x1da5c: 84,
+ 0x1da5d: 84,
+ 0x1da5e: 84,
+ 0x1da5f: 84,
+ 0x1da60: 84,
+ 0x1da61: 84,
+ 0x1da62: 84,
+ 0x1da63: 84,
+ 0x1da64: 84,
+ 0x1da65: 84,
+ 0x1da66: 84,
+ 0x1da67: 84,
+ 0x1da68: 84,
+ 0x1da69: 84,
+ 0x1da6a: 84,
+ 0x1da6b: 84,
+ 0x1da6c: 84,
+ 0x1da75: 84,
+ 0x1da84: 84,
+ 0x1da9b: 84,
+ 0x1da9c: 84,
+ 0x1da9d: 84,
+ 0x1da9e: 84,
+ 0x1da9f: 84,
+ 0x1daa1: 84,
+ 0x1daa2: 84,
+ 0x1daa3: 84,
+ 0x1daa4: 84,
+ 0x1daa5: 84,
+ 0x1daa6: 84,
+ 0x1daa7: 84,
+ 0x1daa8: 84,
+ 0x1daa9: 84,
+ 0x1daaa: 84,
+ 0x1daab: 84,
+ 0x1daac: 84,
+ 0x1daad: 84,
+ 0x1daae: 84,
+ 0x1daaf: 84,
+ 0x1e000: 84,
+ 0x1e001: 84,
+ 0x1e002: 84,
+ 0x1e003: 84,
+ 0x1e004: 84,
+ 0x1e005: 84,
+ 0x1e006: 84,
+ 0x1e008: 84,
+ 0x1e009: 84,
+ 0x1e00a: 84,
+ 0x1e00b: 84,
+ 0x1e00c: 84,
+ 0x1e00d: 84,
+ 0x1e00e: 84,
+ 0x1e00f: 84,
+ 0x1e010: 84,
+ 0x1e011: 84,
+ 0x1e012: 84,
+ 0x1e013: 84,
+ 0x1e014: 84,
+ 0x1e015: 84,
+ 0x1e016: 84,
+ 0x1e017: 84,
+ 0x1e018: 84,
+ 0x1e01b: 84,
+ 0x1e01c: 84,
+ 0x1e01d: 84,
+ 0x1e01e: 84,
+ 0x1e01f: 84,
+ 0x1e020: 84,
+ 0x1e021: 84,
+ 0x1e023: 84,
+ 0x1e024: 84,
+ 0x1e026: 84,
+ 0x1e027: 84,
+ 0x1e028: 84,
+ 0x1e029: 84,
+ 0x1e02a: 84,
+ 0x1e08f: 84,
+ 0x1e130: 84,
+ 0x1e131: 84,
+ 0x1e132: 84,
+ 0x1e133: 84,
+ 0x1e134: 84,
+ 0x1e135: 84,
+ 0x1e136: 84,
+ 0x1e2ae: 84,
+ 0x1e2ec: 84,
+ 0x1e2ed: 84,
+ 0x1e2ee: 84,
+ 0x1e2ef: 84,
+ 0x1e4ec: 84,
+ 0x1e4ed: 84,
+ 0x1e4ee: 84,
+ 0x1e4ef: 84,
+ 0x1e8d0: 84,
+ 0x1e8d1: 84,
+ 0x1e8d2: 84,
+ 0x1e8d3: 84,
+ 0x1e8d4: 84,
+ 0x1e8d5: 84,
+ 0x1e8d6: 84,
0x1e900: 68,
0x1e901: 68,
0x1e902: 68,
@@ -927,7 +2680,351 @@ joining_types = {
0x1e941: 68,
0x1e942: 68,
0x1e943: 68,
+ 0x1e944: 84,
+ 0x1e945: 84,
+ 0x1e946: 84,
+ 0x1e947: 84,
+ 0x1e948: 84,
+ 0x1e949: 84,
+ 0x1e94a: 84,
0x1e94b: 84,
+ 0xe0001: 84,
+ 0xe0020: 84,
+ 0xe0021: 84,
+ 0xe0022: 84,
+ 0xe0023: 84,
+ 0xe0024: 84,
+ 0xe0025: 84,
+ 0xe0026: 84,
+ 0xe0027: 84,
+ 0xe0028: 84,
+ 0xe0029: 84,
+ 0xe002a: 84,
+ 0xe002b: 84,
+ 0xe002c: 84,
+ 0xe002d: 84,
+ 0xe002e: 84,
+ 0xe002f: 84,
+ 0xe0030: 84,
+ 0xe0031: 84,
+ 0xe0032: 84,
+ 0xe0033: 84,
+ 0xe0034: 84,
+ 0xe0035: 84,
+ 0xe0036: 84,
+ 0xe0037: 84,
+ 0xe0038: 84,
+ 0xe0039: 84,
+ 0xe003a: 84,
+ 0xe003b: 84,
+ 0xe003c: 84,
+ 0xe003d: 84,
+ 0xe003e: 84,
+ 0xe003f: 84,
+ 0xe0040: 84,
+ 0xe0041: 84,
+ 0xe0042: 84,
+ 0xe0043: 84,
+ 0xe0044: 84,
+ 0xe0045: 84,
+ 0xe0046: 84,
+ 0xe0047: 84,
+ 0xe0048: 84,
+ 0xe0049: 84,
+ 0xe004a: 84,
+ 0xe004b: 84,
+ 0xe004c: 84,
+ 0xe004d: 84,
+ 0xe004e: 84,
+ 0xe004f: 84,
+ 0xe0050: 84,
+ 0xe0051: 84,
+ 0xe0052: 84,
+ 0xe0053: 84,
+ 0xe0054: 84,
+ 0xe0055: 84,
+ 0xe0056: 84,
+ 0xe0057: 84,
+ 0xe0058: 84,
+ 0xe0059: 84,
+ 0xe005a: 84,
+ 0xe005b: 84,
+ 0xe005c: 84,
+ 0xe005d: 84,
+ 0xe005e: 84,
+ 0xe005f: 84,
+ 0xe0060: 84,
+ 0xe0061: 84,
+ 0xe0062: 84,
+ 0xe0063: 84,
+ 0xe0064: 84,
+ 0xe0065: 84,
+ 0xe0066: 84,
+ 0xe0067: 84,
+ 0xe0068: 84,
+ 0xe0069: 84,
+ 0xe006a: 84,
+ 0xe006b: 84,
+ 0xe006c: 84,
+ 0xe006d: 84,
+ 0xe006e: 84,
+ 0xe006f: 84,
+ 0xe0070: 84,
+ 0xe0071: 84,
+ 0xe0072: 84,
+ 0xe0073: 84,
+ 0xe0074: 84,
+ 0xe0075: 84,
+ 0xe0076: 84,
+ 0xe0077: 84,
+ 0xe0078: 84,
+ 0xe0079: 84,
+ 0xe007a: 84,
+ 0xe007b: 84,
+ 0xe007c: 84,
+ 0xe007d: 84,
+ 0xe007e: 84,
+ 0xe007f: 84,
+ 0xe0100: 84,
+ 0xe0101: 84,
+ 0xe0102: 84,
+ 0xe0103: 84,
+ 0xe0104: 84,
+ 0xe0105: 84,
+ 0xe0106: 84,
+ 0xe0107: 84,
+ 0xe0108: 84,
+ 0xe0109: 84,
+ 0xe010a: 84,
+ 0xe010b: 84,
+ 0xe010c: 84,
+ 0xe010d: 84,
+ 0xe010e: 84,
+ 0xe010f: 84,
+ 0xe0110: 84,
+ 0xe0111: 84,
+ 0xe0112: 84,
+ 0xe0113: 84,
+ 0xe0114: 84,
+ 0xe0115: 84,
+ 0xe0116: 84,
+ 0xe0117: 84,
+ 0xe0118: 84,
+ 0xe0119: 84,
+ 0xe011a: 84,
+ 0xe011b: 84,
+ 0xe011c: 84,
+ 0xe011d: 84,
+ 0xe011e: 84,
+ 0xe011f: 84,
+ 0xe0120: 84,
+ 0xe0121: 84,
+ 0xe0122: 84,
+ 0xe0123: 84,
+ 0xe0124: 84,
+ 0xe0125: 84,
+ 0xe0126: 84,
+ 0xe0127: 84,
+ 0xe0128: 84,
+ 0xe0129: 84,
+ 0xe012a: 84,
+ 0xe012b: 84,
+ 0xe012c: 84,
+ 0xe012d: 84,
+ 0xe012e: 84,
+ 0xe012f: 84,
+ 0xe0130: 84,
+ 0xe0131: 84,
+ 0xe0132: 84,
+ 0xe0133: 84,
+ 0xe0134: 84,
+ 0xe0135: 84,
+ 0xe0136: 84,
+ 0xe0137: 84,
+ 0xe0138: 84,
+ 0xe0139: 84,
+ 0xe013a: 84,
+ 0xe013b: 84,
+ 0xe013c: 84,
+ 0xe013d: 84,
+ 0xe013e: 84,
+ 0xe013f: 84,
+ 0xe0140: 84,
+ 0xe0141: 84,
+ 0xe0142: 84,
+ 0xe0143: 84,
+ 0xe0144: 84,
+ 0xe0145: 84,
+ 0xe0146: 84,
+ 0xe0147: 84,
+ 0xe0148: 84,
+ 0xe0149: 84,
+ 0xe014a: 84,
+ 0xe014b: 84,
+ 0xe014c: 84,
+ 0xe014d: 84,
+ 0xe014e: 84,
+ 0xe014f: 84,
+ 0xe0150: 84,
+ 0xe0151: 84,
+ 0xe0152: 84,
+ 0xe0153: 84,
+ 0xe0154: 84,
+ 0xe0155: 84,
+ 0xe0156: 84,
+ 0xe0157: 84,
+ 0xe0158: 84,
+ 0xe0159: 84,
+ 0xe015a: 84,
+ 0xe015b: 84,
+ 0xe015c: 84,
+ 0xe015d: 84,
+ 0xe015e: 84,
+ 0xe015f: 84,
+ 0xe0160: 84,
+ 0xe0161: 84,
+ 0xe0162: 84,
+ 0xe0163: 84,
+ 0xe0164: 84,
+ 0xe0165: 84,
+ 0xe0166: 84,
+ 0xe0167: 84,
+ 0xe0168: 84,
+ 0xe0169: 84,
+ 0xe016a: 84,
+ 0xe016b: 84,
+ 0xe016c: 84,
+ 0xe016d: 84,
+ 0xe016e: 84,
+ 0xe016f: 84,
+ 0xe0170: 84,
+ 0xe0171: 84,
+ 0xe0172: 84,
+ 0xe0173: 84,
+ 0xe0174: 84,
+ 0xe0175: 84,
+ 0xe0176: 84,
+ 0xe0177: 84,
+ 0xe0178: 84,
+ 0xe0179: 84,
+ 0xe017a: 84,
+ 0xe017b: 84,
+ 0xe017c: 84,
+ 0xe017d: 84,
+ 0xe017e: 84,
+ 0xe017f: 84,
+ 0xe0180: 84,
+ 0xe0181: 84,
+ 0xe0182: 84,
+ 0xe0183: 84,
+ 0xe0184: 84,
+ 0xe0185: 84,
+ 0xe0186: 84,
+ 0xe0187: 84,
+ 0xe0188: 84,
+ 0xe0189: 84,
+ 0xe018a: 84,
+ 0xe018b: 84,
+ 0xe018c: 84,
+ 0xe018d: 84,
+ 0xe018e: 84,
+ 0xe018f: 84,
+ 0xe0190: 84,
+ 0xe0191: 84,
+ 0xe0192: 84,
+ 0xe0193: 84,
+ 0xe0194: 84,
+ 0xe0195: 84,
+ 0xe0196: 84,
+ 0xe0197: 84,
+ 0xe0198: 84,
+ 0xe0199: 84,
+ 0xe019a: 84,
+ 0xe019b: 84,
+ 0xe019c: 84,
+ 0xe019d: 84,
+ 0xe019e: 84,
+ 0xe019f: 84,
+ 0xe01a0: 84,
+ 0xe01a1: 84,
+ 0xe01a2: 84,
+ 0xe01a3: 84,
+ 0xe01a4: 84,
+ 0xe01a5: 84,
+ 0xe01a6: 84,
+ 0xe01a7: 84,
+ 0xe01a8: 84,
+ 0xe01a9: 84,
+ 0xe01aa: 84,
+ 0xe01ab: 84,
+ 0xe01ac: 84,
+ 0xe01ad: 84,
+ 0xe01ae: 84,
+ 0xe01af: 84,
+ 0xe01b0: 84,
+ 0xe01b1: 84,
+ 0xe01b2: 84,
+ 0xe01b3: 84,
+ 0xe01b4: 84,
+ 0xe01b5: 84,
+ 0xe01b6: 84,
+ 0xe01b7: 84,
+ 0xe01b8: 84,
+ 0xe01b9: 84,
+ 0xe01ba: 84,
+ 0xe01bb: 84,
+ 0xe01bc: 84,
+ 0xe01bd: 84,
+ 0xe01be: 84,
+ 0xe01bf: 84,
+ 0xe01c0: 84,
+ 0xe01c1: 84,
+ 0xe01c2: 84,
+ 0xe01c3: 84,
+ 0xe01c4: 84,
+ 0xe01c5: 84,
+ 0xe01c6: 84,
+ 0xe01c7: 84,
+ 0xe01c8: 84,
+ 0xe01c9: 84,
+ 0xe01ca: 84,
+ 0xe01cb: 84,
+ 0xe01cc: 84,
+ 0xe01cd: 84,
+ 0xe01ce: 84,
+ 0xe01cf: 84,
+ 0xe01d0: 84,
+ 0xe01d1: 84,
+ 0xe01d2: 84,
+ 0xe01d3: 84,
+ 0xe01d4: 84,
+ 0xe01d5: 84,
+ 0xe01d6: 84,
+ 0xe01d7: 84,
+ 0xe01d8: 84,
+ 0xe01d9: 84,
+ 0xe01da: 84,
+ 0xe01db: 84,
+ 0xe01dc: 84,
+ 0xe01dd: 84,
+ 0xe01de: 84,
+ 0xe01df: 84,
+ 0xe01e0: 84,
+ 0xe01e1: 84,
+ 0xe01e2: 84,
+ 0xe01e3: 84,
+ 0xe01e4: 84,
+ 0xe01e5: 84,
+ 0xe01e6: 84,
+ 0xe01e7: 84,
+ 0xe01e8: 84,
+ 0xe01e9: 84,
+ 0xe01ea: 84,
+ 0xe01eb: 84,
+ 0xe01ec: 84,
+ 0xe01ed: 84,
+ 0xe01ee: 84,
+ 0xe01ef: 84,
}
codepoint_classes = {
'PVALID': (
@@ -1834,7 +3931,6 @@ codepoint_classes = {
0xa7d50000a7d6,
0xa7d70000a7d8,
0xa7d90000a7da,
- 0xa7f20000a7f5,
0xa7f60000a7f8,
0xa7fa0000a828,
0xa82c0000a82d,
@@ -1907,9 +4003,7 @@ codepoint_classes = {
0x1060000010737,
0x1074000010756,
0x1076000010768,
- 0x1078000010786,
- 0x10787000107b1,
- 0x107b2000107bb,
+ 0x1078000010781,
0x1080000010806,
0x1080800010809,
0x1080a00010836,
@@ -2112,7 +4206,6 @@ codepoint_classes = {
0x1e01b0001e022,
0x1e0230001e025,
0x1e0260001e02b,
- 0x1e0300001e06e,
0x1e08f0001e090,
0x1e1000001e12d,
0x1e1300001e13e,
@@ -2134,6 +4227,7 @@ codepoint_classes = {
0x2b7400002b81e,
0x2b8200002cea2,
0x2ceb00002ebe1,
+ 0x2ebf00002ee5e,
0x300000003134b,
0x31350000323b0,
),
diff --git a/contrib/python/pip/pip/_vendor/idna/package_data.py b/contrib/python/pip/pip/_vendor/idna/package_data.py
index 8501893bd1..ed81113363 100644
--- a/contrib/python/pip/pip/_vendor/idna/package_data.py
+++ b/contrib/python/pip/pip/_vendor/idna/package_data.py
@@ -1,2 +1,2 @@
-__version__ = '3.4'
+__version__ = '3.7'
diff --git a/contrib/python/pip/pip/_vendor/idna/uts46data.py b/contrib/python/pip/pip/_vendor/idna/uts46data.py
index 186796c17b..6a1eddbfd7 100644
--- a/contrib/python/pip/pip/_vendor/idna/uts46data.py
+++ b/contrib/python/pip/pip/_vendor/idna/uts46data.py
@@ -7,7 +7,7 @@ from typing import List, Tuple, Union
"""IDNA Mapping Table from UTS46."""
-__version__ = '15.0.0'
+__version__ = '15.1.0'
def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x0, '3'),
@@ -1899,7 +1899,7 @@ def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1E9A, 'M', 'aʾ'),
(0x1E9B, 'M', 'ṡ'),
(0x1E9C, 'V'),
- (0x1E9E, 'M', 'ss'),
+ (0x1E9E, 'M', 'ß'),
(0x1E9F, 'V'),
(0x1EA0, 'M', 'ạ'),
(0x1EA1, 'V'),
@@ -2418,10 +2418,6 @@ def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x222F, 'M', '∮∮'),
(0x2230, 'M', '∮∮∮'),
(0x2231, 'V'),
- (0x2260, '3'),
- (0x2261, 'V'),
- (0x226E, '3'),
- (0x2270, 'V'),
(0x2329, 'M', '〈'),
(0x232A, 'M', '〉'),
(0x232B, 'V'),
@@ -2502,14 +2498,14 @@ def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x24BA, 'M', 'e'),
(0x24BB, 'M', 'f'),
(0x24BC, 'M', 'g'),
- ]
-
-def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x24BD, 'M', 'h'),
(0x24BE, 'M', 'i'),
(0x24BF, 'M', 'j'),
(0x24C0, 'M', 'k'),
+ ]
+
+def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x24C1, 'M', 'l'),
(0x24C2, 'M', 'm'),
(0x24C3, 'M', 'n'),
@@ -2606,14 +2602,14 @@ def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2C26, 'M', 'ⱖ'),
(0x2C27, 'M', 'ⱗ'),
(0x2C28, 'M', 'ⱘ'),
- ]
-
-def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x2C29, 'M', 'ⱙ'),
(0x2C2A, 'M', 'ⱚ'),
(0x2C2B, 'M', 'ⱛ'),
(0x2C2C, 'M', 'ⱜ'),
+ ]
+
+def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x2C2D, 'M', 'ⱝ'),
(0x2C2E, 'M', 'ⱞ'),
(0x2C2F, 'M', 'ⱟ'),
@@ -2710,14 +2706,14 @@ def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2CC0, 'M', 'ⳁ'),
(0x2CC1, 'V'),
(0x2CC2, 'M', 'ⳃ'),
- ]
-
-def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x2CC3, 'V'),
(0x2CC4, 'M', 'ⳅ'),
(0x2CC5, 'V'),
(0x2CC6, 'M', 'ⳇ'),
+ ]
+
+def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x2CC7, 'V'),
(0x2CC8, 'M', 'ⳉ'),
(0x2CC9, 'V'),
@@ -2814,14 +2810,14 @@ def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2F13, 'M', '勹'),
(0x2F14, 'M', '匕'),
(0x2F15, 'M', '匚'),
- ]
-
-def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x2F16, 'M', '匸'),
(0x2F17, 'M', '十'),
(0x2F18, 'M', '卜'),
(0x2F19, 'M', '卩'),
+ ]
+
+def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x2F1A, 'M', '厂'),
(0x2F1B, 'M', '厶'),
(0x2F1C, 'M', '又'),
@@ -2918,14 +2914,14 @@ def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2F77, 'M', '糸'),
(0x2F78, 'M', '缶'),
(0x2F79, 'M', '网'),
- ]
-
-def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x2F7A, 'M', '羊'),
(0x2F7B, 'M', '羽'),
(0x2F7C, 'M', '老'),
(0x2F7D, 'M', '而'),
+ ]
+
+def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x2F7E, 'M', '耒'),
(0x2F7F, 'M', '耳'),
(0x2F80, 'M', '聿'),
@@ -3022,14 +3018,14 @@ def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x3036, 'M', '〒'),
(0x3037, 'V'),
(0x3038, 'M', '十'),
- ]
-
-def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x3039, 'M', '卄'),
(0x303A, 'M', '卅'),
(0x303B, 'V'),
(0x3040, 'X'),
+ ]
+
+def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x3041, 'V'),
(0x3097, 'X'),
(0x3099, 'V'),
@@ -3126,14 +3122,14 @@ def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x3182, 'M', 'ᇱ'),
(0x3183, 'M', 'ᇲ'),
(0x3184, 'M', 'ᅗ'),
- ]
-
-def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x3185, 'M', 'ᅘ'),
(0x3186, 'M', 'ᅙ'),
(0x3187, 'M', 'ᆄ'),
(0x3188, 'M', 'ᆅ'),
+ ]
+
+def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x3189, 'M', 'ᆈ'),
(0x318A, 'M', 'ᆑ'),
(0x318B, 'M', 'ᆒ'),
@@ -3230,14 +3226,14 @@ def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x3244, 'M', '問'),
(0x3245, 'M', '幼'),
(0x3246, 'M', '文'),
- ]
-
-def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x3247, 'M', '箏'),
(0x3248, 'V'),
(0x3250, 'M', 'pte'),
(0x3251, 'M', '21'),
+ ]
+
+def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x3252, 'M', '22'),
(0x3253, 'M', '23'),
(0x3254, 'M', '24'),
@@ -3334,14 +3330,14 @@ def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x32AF, 'M', '協'),
(0x32B0, 'M', '夜'),
(0x32B1, 'M', '36'),
- ]
-
-def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x32B2, 'M', '37'),
(0x32B3, 'M', '38'),
(0x32B4, 'M', '39'),
(0x32B5, 'M', '40'),
+ ]
+
+def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x32B6, 'M', '41'),
(0x32B7, 'M', '42'),
(0x32B8, 'M', '43'),
@@ -3438,14 +3434,14 @@ def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x3313, 'M', 'ギルダー'),
(0x3314, 'M', 'キロ'),
(0x3315, 'M', 'キログラム'),
- ]
-
-def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x3316, 'M', 'キロメートル'),
(0x3317, 'M', 'キロワット'),
(0x3318, 'M', 'グラム'),
(0x3319, 'M', 'グラムトン'),
+ ]
+
+def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x331A, 'M', 'クルゼイロ'),
(0x331B, 'M', 'クローネ'),
(0x331C, 'M', 'ケース'),
@@ -3542,14 +3538,14 @@ def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x3377, 'M', 'dm'),
(0x3378, 'M', 'dm2'),
(0x3379, 'M', 'dm3'),
- ]
-
-def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x337A, 'M', 'iu'),
(0x337B, 'M', '平成'),
(0x337C, 'M', '昭和'),
(0x337D, 'M', '大正'),
+ ]
+
+def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x337E, 'M', '明治'),
(0x337F, 'M', '株式会社'),
(0x3380, 'M', 'pa'),
@@ -3646,14 +3642,14 @@ def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x33DB, 'M', 'sr'),
(0x33DC, 'M', 'sv'),
(0x33DD, 'M', 'wb'),
- ]
-
-def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x33DE, 'M', 'v∕m'),
(0x33DF, 'M', 'a∕m'),
(0x33E0, 'M', '1日'),
(0x33E1, 'M', '2日'),
+ ]
+
+def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x33E2, 'M', '3日'),
(0x33E3, 'M', '4日'),
(0x33E4, 'M', '5日'),
@@ -3750,14 +3746,14 @@ def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0xA68B, 'V'),
(0xA68C, 'M', 'ꚍ'),
(0xA68D, 'V'),
- ]
-
-def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0xA68E, 'M', 'ꚏ'),
(0xA68F, 'V'),
(0xA690, 'M', 'ꚑ'),
(0xA691, 'V'),
+ ]
+
+def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0xA692, 'M', 'ꚓ'),
(0xA693, 'V'),
(0xA694, 'M', 'ꚕ'),
@@ -3854,14 +3850,14 @@ def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0xA779, 'M', 'ꝺ'),
(0xA77A, 'V'),
(0xA77B, 'M', 'ꝼ'),
- ]
-
-def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0xA77C, 'V'),
(0xA77D, 'M', 'ᵹ'),
(0xA77E, 'M', 'ꝿ'),
(0xA77F, 'V'),
+ ]
+
+def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0xA780, 'M', 'ꞁ'),
(0xA781, 'V'),
(0xA782, 'M', 'ꞃ'),
@@ -3958,14 +3954,14 @@ def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0xA878, 'X'),
(0xA880, 'V'),
(0xA8C6, 'X'),
- ]
-
-def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0xA8CE, 'V'),
(0xA8DA, 'X'),
(0xA8E0, 'V'),
(0xA954, 'X'),
+ ]
+
+def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0xA95F, 'V'),
(0xA97D, 'X'),
(0xA980, 'V'),
@@ -4062,14 +4058,14 @@ def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0xABA8, 'M', 'Ꮨ'),
(0xABA9, 'M', 'Ꮩ'),
(0xABAA, 'M', 'Ꮪ'),
- ]
-
-def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0xABAB, 'M', 'Ꮫ'),
(0xABAC, 'M', 'Ꮬ'),
(0xABAD, 'M', 'Ꮭ'),
(0xABAE, 'M', 'Ꮮ'),
+ ]
+
+def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0xABAF, 'M', 'Ꮯ'),
(0xABB0, 'M', 'Ꮰ'),
(0xABB1, 'M', 'Ꮱ'),
@@ -4166,14 +4162,14 @@ def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0xF943, 'M', '弄'),
(0xF944, 'M', '籠'),
(0xF945, 'M', '聾'),
- ]
-
-def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0xF946, 'M', '牢'),
(0xF947, 'M', '磊'),
(0xF948, 'M', '賂'),
(0xF949, 'M', '雷'),
+ ]
+
+def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0xF94A, 'M', '壘'),
(0xF94B, 'M', '屢'),
(0xF94C, 'M', '樓'),
@@ -4270,14 +4266,14 @@ def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0xF9A7, 'M', '獵'),
(0xF9A8, 'M', '令'),
(0xF9A9, 'M', '囹'),
- ]
-
-def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0xF9AA, 'M', '寧'),
(0xF9AB, 'M', '嶺'),
(0xF9AC, 'M', '怜'),
(0xF9AD, 'M', '玲'),
+ ]
+
+def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0xF9AE, 'M', '瑩'),
(0xF9AF, 'M', '羚'),
(0xF9B0, 'M', '聆'),
@@ -4374,14 +4370,14 @@ def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0xFA0B, 'M', '廓'),
(0xFA0C, 'M', '兀'),
(0xFA0D, 'M', '嗀'),
- ]
-
-def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0xFA0E, 'V'),
(0xFA10, 'M', '塚'),
(0xFA11, 'V'),
(0xFA12, 'M', '晴'),
+ ]
+
+def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0xFA13, 'V'),
(0xFA15, 'M', '凞'),
(0xFA16, 'M', '猪'),
@@ -4478,14 +4474,14 @@ def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0xFA76, 'M', '勇'),
(0xFA77, 'M', '勺'),
(0xFA78, 'M', '喝'),
- ]
-
-def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0xFA79, 'M', '啕'),
(0xFA7A, 'M', '喙'),
(0xFA7B, 'M', '嗢'),
(0xFA7C, 'M', '塚'),
+ ]
+
+def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0xFA7D, 'M', '墳'),
(0xFA7E, 'M', '奄'),
(0xFA7F, 'M', '奔'),
@@ -4582,14 +4578,14 @@ def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0xFADA, 'X'),
(0xFB00, 'M', 'ff'),
(0xFB01, 'M', 'fi'),
- ]
-
-def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0xFB02, 'M', 'fl'),
(0xFB03, 'M', 'ffi'),
(0xFB04, 'M', 'ffl'),
(0xFB05, 'M', 'st'),
+ ]
+
+def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0xFB07, 'X'),
(0xFB13, 'M', 'մն'),
(0xFB14, 'M', 'մե'),
@@ -4686,14 +4682,14 @@ def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0xFBDB, 'M', 'ۈ'),
(0xFBDD, 'M', 'ۇٴ'),
(0xFBDE, 'M', 'ۋ'),
- ]
-
-def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0xFBE0, 'M', 'ۅ'),
(0xFBE2, 'M', 'ۉ'),
(0xFBE4, 'M', 'ې'),
(0xFBE8, 'M', 'ى'),
+ ]
+
+def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0xFBEA, 'M', 'ئا'),
(0xFBEC, 'M', 'ئە'),
(0xFBEE, 'M', 'ئو'),
@@ -4790,14 +4786,14 @@ def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0xFC54, 'M', 'هي'),
(0xFC55, 'M', 'يج'),
(0xFC56, 'M', 'يح'),
- ]
-
-def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0xFC57, 'M', 'يخ'),
(0xFC58, 'M', 'يم'),
(0xFC59, 'M', 'يى'),
(0xFC5A, 'M', 'يي'),
+ ]
+
+def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0xFC5B, 'M', 'ذٰ'),
(0xFC5C, 'M', 'رٰ'),
(0xFC5D, 'M', 'ىٰ'),
@@ -4894,14 +4890,14 @@ def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0xFCB8, 'M', 'طح'),
(0xFCB9, 'M', 'ظم'),
(0xFCBA, 'M', 'عج'),
- ]
-
-def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0xFCBB, 'M', 'عم'),
(0xFCBC, 'M', 'غج'),
(0xFCBD, 'M', 'غم'),
(0xFCBE, 'M', 'فج'),
+ ]
+
+def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0xFCBF, 'M', 'فح'),
(0xFCC0, 'M', 'فخ'),
(0xFCC1, 'M', 'فم'),
@@ -4998,14 +4994,14 @@ def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0xFD1C, 'M', 'حي'),
(0xFD1D, 'M', 'جى'),
(0xFD1E, 'M', 'جي'),
- ]
-
-def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0xFD1F, 'M', 'خى'),
(0xFD20, 'M', 'خي'),
(0xFD21, 'M', 'صى'),
(0xFD22, 'M', 'صي'),
+ ]
+
+def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0xFD23, 'M', 'ضى'),
(0xFD24, 'M', 'ضي'),
(0xFD25, 'M', 'شج'),
@@ -5102,14 +5098,14 @@ def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0xFDA4, 'M', 'تمى'),
(0xFDA5, 'M', 'جمي'),
(0xFDA6, 'M', 'جحى'),
- ]
-
-def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0xFDA7, 'M', 'جمى'),
(0xFDA8, 'M', 'سخى'),
(0xFDA9, 'M', 'صحي'),
(0xFDAA, 'M', 'شحي'),
+ ]
+
+def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0xFDAB, 'M', 'ضحي'),
(0xFDAC, 'M', 'لجي'),
(0xFDAD, 'M', 'لمي'),
@@ -5206,14 +5202,14 @@ def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0xFE5B, '3', '{'),
(0xFE5C, '3', '}'),
(0xFE5D, 'M', '〔'),
- ]
-
-def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0xFE5E, 'M', '〕'),
(0xFE5F, '3', '#'),
(0xFE60, '3', '&'),
(0xFE61, '3', '*'),
+ ]
+
+def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0xFE62, '3', '+'),
(0xFE63, 'M', '-'),
(0xFE64, '3', '<'),
@@ -5310,14 +5306,14 @@ def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0xFF18, 'M', '8'),
(0xFF19, 'M', '9'),
(0xFF1A, '3', ':'),
- ]
-
-def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0xFF1B, '3', ';'),
(0xFF1C, '3', '<'),
(0xFF1D, '3', '='),
(0xFF1E, '3', '>'),
+ ]
+
+def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0xFF1F, '3', '?'),
(0xFF20, '3', '@'),
(0xFF21, 'M', 'a'),
@@ -5414,14 +5410,14 @@ def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0xFF7C, 'M', 'シ'),
(0xFF7D, 'M', 'ス'),
(0xFF7E, 'M', 'セ'),
- ]
-
-def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0xFF7F, 'M', 'ソ'),
(0xFF80, 'M', 'タ'),
(0xFF81, 'M', 'チ'),
(0xFF82, 'M', 'ツ'),
+ ]
+
+def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0xFF83, 'M', 'テ'),
(0xFF84, 'M', 'ト'),
(0xFF85, 'M', 'ナ'),
@@ -5518,14 +5514,14 @@ def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0xFFE7, 'X'),
(0xFFE8, 'M', '│'),
(0xFFE9, 'M', '←'),
- ]
-
-def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0xFFEA, 'M', '↑'),
(0xFFEB, 'M', '→'),
(0xFFEC, 'M', '↓'),
(0xFFED, 'M', '■'),
+ ]
+
+def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0xFFEE, 'M', '○'),
(0xFFEF, 'X'),
(0x10000, 'V'),
@@ -5622,14 +5618,14 @@ def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x104B3, 'M', '𐓛'),
(0x104B4, 'M', '𐓜'),
(0x104B5, 'M', '𐓝'),
- ]
-
-def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x104B6, 'M', '𐓞'),
(0x104B7, 'M', '𐓟'),
(0x104B8, 'M', '𐓠'),
(0x104B9, 'M', '𐓡'),
+ ]
+
+def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x104BA, 'M', '𐓢'),
(0x104BB, 'M', '𐓣'),
(0x104BC, 'M', '𐓤'),
@@ -5726,14 +5722,14 @@ def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x10786, 'X'),
(0x10787, 'M', 'ʣ'),
(0x10788, 'M', 'ꭦ'),
- ]
-
-def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x10789, 'M', 'ʥ'),
(0x1078A, 'M', 'ʤ'),
(0x1078B, 'M', 'ɖ'),
(0x1078C, 'M', 'ɗ'),
+ ]
+
+def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x1078D, 'M', 'ᶑ'),
(0x1078E, 'M', 'ɘ'),
(0x1078F, 'M', 'ɞ'),
@@ -5830,14 +5826,14 @@ def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x10A60, 'V'),
(0x10AA0, 'X'),
(0x10AC0, 'V'),
- ]
-
-def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x10AE7, 'X'),
(0x10AEB, 'V'),
(0x10AF7, 'X'),
(0x10B00, 'V'),
+ ]
+
+def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x10B36, 'X'),
(0x10B39, 'V'),
(0x10B56, 'X'),
@@ -5934,14 +5930,14 @@ def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1107F, 'V'),
(0x110BD, 'X'),
(0x110BE, 'V'),
- ]
-
-def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x110C3, 'X'),
(0x110D0, 'V'),
(0x110E9, 'X'),
(0x110F0, 'V'),
+ ]
+
+def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x110FA, 'X'),
(0x11100, 'V'),
(0x11135, 'X'),
@@ -6038,14 +6034,14 @@ def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x118A4, 'M', '𑣄'),
(0x118A5, 'M', '𑣅'),
(0x118A6, 'M', '𑣆'),
- ]
-
-def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x118A7, 'M', '𑣇'),
(0x118A8, 'M', '𑣈'),
(0x118A9, 'M', '𑣉'),
(0x118AA, 'M', '𑣊'),
+ ]
+
+def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x118AB, 'M', '𑣋'),
(0x118AC, 'M', '𑣌'),
(0x118AD, 'M', '𑣍'),
@@ -6142,14 +6138,14 @@ def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x11EE0, 'V'),
(0x11EF9, 'X'),
(0x11F00, 'V'),
- ]
-
-def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x11F11, 'X'),
(0x11F12, 'V'),
(0x11F3B, 'X'),
(0x11F3E, 'V'),
+ ]
+
+def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x11F5A, 'X'),
(0x11FB0, 'V'),
(0x11FB1, 'X'),
@@ -6246,14 +6242,14 @@ def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x18D00, 'V'),
(0x18D09, 'X'),
(0x1AFF0, 'V'),
- ]
-
-def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x1AFF4, 'X'),
(0x1AFF5, 'V'),
(0x1AFFC, 'X'),
(0x1AFFD, 'V'),
+ ]
+
+def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x1AFFF, 'X'),
(0x1B000, 'V'),
(0x1B123, 'X'),
@@ -6350,14 +6346,14 @@ def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D41E, 'M', 'e'),
(0x1D41F, 'M', 'f'),
(0x1D420, 'M', 'g'),
- ]
-
-def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x1D421, 'M', 'h'),
(0x1D422, 'M', 'i'),
(0x1D423, 'M', 'j'),
(0x1D424, 'M', 'k'),
+ ]
+
+def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x1D425, 'M', 'l'),
(0x1D426, 'M', 'm'),
(0x1D427, 'M', 'n'),
@@ -6454,14 +6450,14 @@ def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D482, 'M', 'a'),
(0x1D483, 'M', 'b'),
(0x1D484, 'M', 'c'),
- ]
-
-def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x1D485, 'M', 'd'),
(0x1D486, 'M', 'e'),
(0x1D487, 'M', 'f'),
(0x1D488, 'M', 'g'),
+ ]
+
+def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x1D489, 'M', 'h'),
(0x1D48A, 'M', 'i'),
(0x1D48B, 'M', 'j'),
@@ -6558,14 +6554,14 @@ def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D4E9, 'M', 'z'),
(0x1D4EA, 'M', 'a'),
(0x1D4EB, 'M', 'b'),
- ]
-
-def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x1D4EC, 'M', 'c'),
(0x1D4ED, 'M', 'd'),
(0x1D4EE, 'M', 'e'),
(0x1D4EF, 'M', 'f'),
+ ]
+
+def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x1D4F0, 'M', 'g'),
(0x1D4F1, 'M', 'h'),
(0x1D4F2, 'M', 'i'),
@@ -6662,14 +6658,14 @@ def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D550, 'M', 'y'),
(0x1D551, 'X'),
(0x1D552, 'M', 'a'),
- ]
-
-def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x1D553, 'M', 'b'),
(0x1D554, 'M', 'c'),
(0x1D555, 'M', 'd'),
(0x1D556, 'M', 'e'),
+ ]
+
+def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x1D557, 'M', 'f'),
(0x1D558, 'M', 'g'),
(0x1D559, 'M', 'h'),
@@ -6766,14 +6762,14 @@ def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D5B4, 'M', 'u'),
(0x1D5B5, 'M', 'v'),
(0x1D5B6, 'M', 'w'),
- ]
-
-def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x1D5B7, 'M', 'x'),
(0x1D5B8, 'M', 'y'),
(0x1D5B9, 'M', 'z'),
(0x1D5BA, 'M', 'a'),
+ ]
+
+def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x1D5BB, 'M', 'b'),
(0x1D5BC, 'M', 'c'),
(0x1D5BD, 'M', 'd'),
@@ -6870,14 +6866,14 @@ def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D618, 'M', 'q'),
(0x1D619, 'M', 'r'),
(0x1D61A, 'M', 's'),
- ]
-
-def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x1D61B, 'M', 't'),
(0x1D61C, 'M', 'u'),
(0x1D61D, 'M', 'v'),
(0x1D61E, 'M', 'w'),
+ ]
+
+def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x1D61F, 'M', 'x'),
(0x1D620, 'M', 'y'),
(0x1D621, 'M', 'z'),
@@ -6974,14 +6970,14 @@ def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D67C, 'M', 'm'),
(0x1D67D, 'M', 'n'),
(0x1D67E, 'M', 'o'),
- ]
-
-def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x1D67F, 'M', 'p'),
(0x1D680, 'M', 'q'),
(0x1D681, 'M', 'r'),
(0x1D682, 'M', 's'),
+ ]
+
+def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x1D683, 'M', 't'),
(0x1D684, 'M', 'u'),
(0x1D685, 'M', 'v'),
@@ -7078,14 +7074,14 @@ def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D6E2, 'M', 'α'),
(0x1D6E3, 'M', 'β'),
(0x1D6E4, 'M', 'γ'),
- ]
-
-def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x1D6E5, 'M', 'δ'),
(0x1D6E6, 'M', 'ε'),
(0x1D6E7, 'M', 'ζ'),
(0x1D6E8, 'M', 'η'),
+ ]
+
+def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x1D6E9, 'M', 'θ'),
(0x1D6EA, 'M', 'ι'),
(0x1D6EB, 'M', 'κ'),
@@ -7182,14 +7178,14 @@ def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D747, 'M', 'σ'),
(0x1D749, 'M', 'τ'),
(0x1D74A, 'M', 'υ'),
- ]
-
-def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x1D74B, 'M', 'φ'),
(0x1D74C, 'M', 'χ'),
(0x1D74D, 'M', 'ψ'),
(0x1D74E, 'M', 'ω'),
+ ]
+
+def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x1D74F, 'M', '∂'),
(0x1D750, 'M', 'ε'),
(0x1D751, 'M', 'θ'),
@@ -7286,14 +7282,14 @@ def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D7AD, 'M', 'δ'),
(0x1D7AE, 'M', 'ε'),
(0x1D7AF, 'M', 'ζ'),
- ]
-
-def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x1D7B0, 'M', 'η'),
(0x1D7B1, 'M', 'θ'),
(0x1D7B2, 'M', 'ι'),
(0x1D7B3, 'M', 'κ'),
+ ]
+
+def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x1D7B4, 'M', 'λ'),
(0x1D7B5, 'M', 'μ'),
(0x1D7B6, 'M', 'ν'),
@@ -7390,14 +7386,14 @@ def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1E030, 'M', 'а'),
(0x1E031, 'M', 'б'),
(0x1E032, 'M', 'в'),
- ]
-
-def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x1E033, 'M', 'г'),
(0x1E034, 'M', 'д'),
(0x1E035, 'M', 'е'),
(0x1E036, 'M', 'ж'),
+ ]
+
+def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x1E037, 'M', 'з'),
(0x1E038, 'M', 'и'),
(0x1E039, 'M', 'к'),
@@ -7494,14 +7490,14 @@ def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1E907, 'M', '𞤩'),
(0x1E908, 'M', '𞤪'),
(0x1E909, 'M', '𞤫'),
- ]
-
-def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x1E90A, 'M', '𞤬'),
(0x1E90B, 'M', '𞤭'),
(0x1E90C, 'M', '𞤮'),
(0x1E90D, 'M', '𞤯'),
+ ]
+
+def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x1E90E, 'M', '𞤰'),
(0x1E90F, 'M', '𞤱'),
(0x1E910, 'M', '𞤲'),
@@ -7598,14 +7594,14 @@ def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1EE48, 'X'),
(0x1EE49, 'M', 'ي'),
(0x1EE4A, 'X'),
- ]
-
-def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x1EE4B, 'M', 'ل'),
(0x1EE4C, 'X'),
(0x1EE4D, 'M', 'ن'),
(0x1EE4E, 'M', 'س'),
+ ]
+
+def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x1EE4F, 'M', 'ع'),
(0x1EE50, 'X'),
(0x1EE51, 'M', 'ص'),
@@ -7702,14 +7698,14 @@ def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1EEB2, 'M', 'ق'),
(0x1EEB3, 'M', 'ر'),
(0x1EEB4, 'M', 'ش'),
- ]
-
-def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x1EEB5, 'M', 'ت'),
(0x1EEB6, 'M', 'ث'),
(0x1EEB7, 'M', 'خ'),
(0x1EEB8, 'M', 'ذ'),
+ ]
+
+def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x1EEB9, 'M', 'ض'),
(0x1EEBA, 'M', 'ظ'),
(0x1EEBB, 'M', 'غ'),
@@ -7806,14 +7802,14 @@ def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1F150, 'V'),
(0x1F16A, 'M', 'mc'),
(0x1F16B, 'M', 'md'),
- ]
-
-def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x1F16C, 'M', 'mr'),
(0x1F16D, 'V'),
(0x1F190, 'M', 'dj'),
(0x1F191, 'V'),
+ ]
+
+def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x1F1AE, 'X'),
(0x1F1E6, 'V'),
(0x1F200, 'M', 'ほか'),
@@ -7910,14 +7906,14 @@ def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1FA54, 'X'),
(0x1FA60, 'V'),
(0x1FA6E, 'X'),
- ]
-
-def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
- return [
(0x1FA70, 'V'),
(0x1FA7D, 'X'),
(0x1FA80, 'V'),
(0x1FA89, 'X'),
+ ]
+
+def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
+ return [
(0x1FA90, 'V'),
(0x1FABE, 'X'),
(0x1FABF, 'V'),
@@ -7953,6 +7949,8 @@ def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2CEA2, 'X'),
(0x2CEB0, 'V'),
(0x2EBE1, 'X'),
+ (0x2EBF0, 'V'),
+ (0x2EE5E, 'X'),
(0x2F800, 'M', '丽'),
(0x2F801, 'M', '丸'),
(0x2F802, 'M', '乁'),
@@ -8014,12 +8012,12 @@ def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2F83C, 'M', '咞'),
(0x2F83D, 'M', '吸'),
(0x2F83E, 'M', '呈'),
+ (0x2F83F, 'M', '周'),
+ (0x2F840, 'M', '咢'),
]
def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2F83F, 'M', '周'),
- (0x2F840, 'M', '咢'),
(0x2F841, 'M', '哶'),
(0x2F842, 'M', '唐'),
(0x2F843, 'M', '啓'),
@@ -8118,12 +8116,12 @@ def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2F8A4, 'M', '𢛔'),
(0x2F8A5, 'M', '惇'),
(0x2F8A6, 'M', '慈'),
+ (0x2F8A7, 'M', '慌'),
+ (0x2F8A8, 'M', '慎'),
]
def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2F8A7, 'M', '慌'),
- (0x2F8A8, 'M', '慎'),
(0x2F8A9, 'M', '慌'),
(0x2F8AA, 'M', '慺'),
(0x2F8AB, 'M', '憎'),
@@ -8222,12 +8220,12 @@ def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2F908, 'M', '港'),
(0x2F909, 'M', '湮'),
(0x2F90A, 'M', '㴳'),
+ (0x2F90B, 'M', '滋'),
+ (0x2F90C, 'M', '滇'),
]
def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2F90B, 'M', '滋'),
- (0x2F90C, 'M', '滇'),
(0x2F90D, 'M', '𣻑'),
(0x2F90E, 'M', '淹'),
(0x2F90F, 'M', '潮'),
@@ -8326,12 +8324,12 @@ def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2F96F, 'M', '縂'),
(0x2F970, 'M', '繅'),
(0x2F971, 'M', '䌴'),
+ (0x2F972, 'M', '𦈨'),
+ (0x2F973, 'M', '𦉇'),
]
def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2F972, 'M', '𦈨'),
- (0x2F973, 'M', '𦉇'),
(0x2F974, 'M', '䍙'),
(0x2F975, 'M', '𦋙'),
(0x2F976, 'M', '罺'),
@@ -8430,12 +8428,12 @@ def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2F9D3, 'M', '𧲨'),
(0x2F9D4, 'M', '貫'),
(0x2F9D5, 'M', '賁'),
+ (0x2F9D6, 'M', '贛'),
+ (0x2F9D7, 'M', '起'),
]
def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2F9D6, 'M', '贛'),
- (0x2F9D7, 'M', '起'),
(0x2F9D8, 'M', '𧼯'),
(0x2F9D9, 'M', '𠠄'),
(0x2F9DA, 'M', '跋'),
diff --git a/contrib/python/pip/pip/_vendor/msgpack/__init__.py b/contrib/python/pip/pip/_vendor/msgpack/__init__.py
index 1300b86604..919b86f175 100644
--- a/contrib/python/pip/pip/_vendor/msgpack/__init__.py
+++ b/contrib/python/pip/pip/_vendor/msgpack/__init__.py
@@ -1,16 +1,14 @@
-# coding: utf-8
from .exceptions import *
from .ext import ExtType, Timestamp
import os
-import sys
-version = (1, 0, 5)
-__version__ = "1.0.5"
+version = (1, 0, 8)
+__version__ = "1.0.8"
-if os.environ.get("MSGPACK_PUREPYTHON") or sys.version_info[0] == 2:
+if os.environ.get("MSGPACK_PUREPYTHON"):
from .fallback import Packer, unpackb, Unpacker
else:
try:
diff --git a/contrib/python/pip/pip/_vendor/msgpack/ext.py b/contrib/python/pip/pip/_vendor/msgpack/ext.py
index 23e0d6b41c..02c2c43008 100644
--- a/contrib/python/pip/pip/_vendor/msgpack/ext.py
+++ b/contrib/python/pip/pip/_vendor/msgpack/ext.py
@@ -1,23 +1,8 @@
-# coding: utf-8
from collections import namedtuple
import datetime
-import sys
import struct
-PY2 = sys.version_info[0] == 2
-
-if PY2:
- int_types = (int, long)
- _utc = None
-else:
- int_types = int
- try:
- _utc = datetime.timezone.utc
- except AttributeError:
- _utc = datetime.timezone(datetime.timedelta(0))
-
-
class ExtType(namedtuple("ExtType", "code data")):
"""ExtType represents ext type in msgpack."""
@@ -28,14 +13,15 @@ class ExtType(namedtuple("ExtType", "code data")):
raise TypeError("data must be bytes")
if not 0 <= code <= 127:
raise ValueError("code must be 0~127")
- return super(ExtType, cls).__new__(cls, code, data)
+ return super().__new__(cls, code, data)
-class Timestamp(object):
+class Timestamp:
"""Timestamp represents the Timestamp extension type in msgpack.
- When built with Cython, msgpack uses C methods to pack and unpack `Timestamp`. When using pure-Python
- msgpack, :func:`to_bytes` and :func:`from_bytes` are used to pack and unpack `Timestamp`.
+ When built with Cython, msgpack uses C methods to pack and unpack `Timestamp`.
+ When using pure-Python msgpack, :func:`to_bytes` and :func:`from_bytes` are used to pack and
+ unpack `Timestamp`.
This class is immutable: Do not override seconds and nanoseconds.
"""
@@ -53,31 +39,25 @@ class Timestamp(object):
Number of nanoseconds to add to `seconds` to get fractional time.
Maximum is 999_999_999. Default is 0.
- Note: Negative times (before the UNIX epoch) are represented as negative seconds + positive ns.
+ Note: Negative times (before the UNIX epoch) are represented as neg. seconds + pos. ns.
"""
- if not isinstance(seconds, int_types):
+ if not isinstance(seconds, int):
raise TypeError("seconds must be an integer")
- if not isinstance(nanoseconds, int_types):
+ if not isinstance(nanoseconds, int):
raise TypeError("nanoseconds must be an integer")
if not (0 <= nanoseconds < 10**9):
- raise ValueError(
- "nanoseconds must be a non-negative integer less than 999999999."
- )
+ raise ValueError("nanoseconds must be a non-negative integer less than 999999999.")
self.seconds = seconds
self.nanoseconds = nanoseconds
def __repr__(self):
"""String representation of Timestamp."""
- return "Timestamp(seconds={0}, nanoseconds={1})".format(
- self.seconds, self.nanoseconds
- )
+ return f"Timestamp(seconds={self.seconds}, nanoseconds={self.nanoseconds})"
def __eq__(self, other):
"""Check for equality with another Timestamp object"""
if type(other) is self.__class__:
- return (
- self.seconds == other.seconds and self.nanoseconds == other.nanoseconds
- )
+ return self.seconds == other.seconds and self.nanoseconds == other.nanoseconds
return False
def __ne__(self, other):
@@ -140,7 +120,7 @@ class Timestamp(object):
"""Create a Timestamp from posix timestamp in seconds.
:param unix_float: Posix timestamp in seconds.
- :type unix_float: int or float.
+ :type unix_float: int or float
"""
seconds = int(unix_sec // 1)
nanoseconds = int((unix_sec % 1) * 10**9)
@@ -174,20 +154,15 @@ class Timestamp(object):
def to_datetime(self):
"""Get the timestamp as a UTC datetime.
- Python 2 is not supported.
-
- :rtype: datetime.
+ :rtype: `datetime.datetime`
"""
- return datetime.datetime.fromtimestamp(0, _utc) + datetime.timedelta(
- seconds=self.to_unix()
- )
+ utc = datetime.timezone.utc
+ return datetime.datetime.fromtimestamp(0, utc) + datetime.timedelta(seconds=self.to_unix())
@staticmethod
def from_datetime(dt):
"""Create a Timestamp from datetime with tzinfo.
- Python 2 is not supported.
-
:rtype: Timestamp
"""
return Timestamp.from_unix(dt.timestamp())
diff --git a/contrib/python/pip/pip/_vendor/msgpack/fallback.py b/contrib/python/pip/pip/_vendor/msgpack/fallback.py
index e8cebc1bef..a174162af8 100644
--- a/contrib/python/pip/pip/_vendor/msgpack/fallback.py
+++ b/contrib/python/pip/pip/_vendor/msgpack/fallback.py
@@ -4,39 +4,6 @@ import sys
import struct
-PY2 = sys.version_info[0] == 2
-if PY2:
- int_types = (int, long)
-
- def dict_iteritems(d):
- return d.iteritems()
-
-else:
- int_types = int
- unicode = str
- xrange = range
-
- def dict_iteritems(d):
- return d.items()
-
-
-if sys.version_info < (3, 5):
- # Ugly hack...
- RecursionError = RuntimeError
-
- def _is_recursionerror(e):
- return (
- len(e.args) == 1
- and isinstance(e.args[0], str)
- and e.args[0].startswith("maximum recursion depth exceeded")
- )
-
-else:
-
- def _is_recursionerror(e):
- return True
-
-
if hasattr(sys, "pypy_version_info"):
# StringIO is slow on PyPy, StringIO is faster. However: PyPy's own
# StringBuilder is fastest.
@@ -48,7 +15,7 @@ if hasattr(sys, "pypy_version_info"):
from __pypy__.builders import StringBuilder
USING_STRINGBUILDER = True
- class StringIO(object):
+ class StringIO:
def __init__(self, s=b""):
if s:
self.builder = StringBuilder(len(s))
@@ -125,24 +92,13 @@ def unpackb(packed, **kwargs):
ret = unpacker._unpack()
except OutOfData:
raise ValueError("Unpack failed: incomplete input")
- except RecursionError as e:
- if _is_recursionerror(e):
- raise StackError
- raise
+ except RecursionError:
+ raise StackError
if unpacker._got_extradata():
raise ExtraData(ret, unpacker._get_extradata())
return ret
-if sys.version_info < (2, 7, 6):
-
- def _unpack_from(f, b, o=0):
- """Explicit type cast for legacy struct.unpack_from"""
- return struct.unpack_from(f, bytes(b), o)
-
-else:
- _unpack_from = struct.unpack_from
-
_NO_FORMAT_USED = ""
_MSGPACK_HEADERS = {
0xC4: (1, _NO_FORMAT_USED, TYPE_BIN),
@@ -176,14 +132,14 @@ _MSGPACK_HEADERS = {
}
-class Unpacker(object):
+class Unpacker:
"""Streaming unpacker.
Arguments:
:param file_like:
File-like object having `.read(n)` method.
- If specified, unpacker reads serialized data from it and :meth:`feed()` is not usable.
+ If specified, unpacker reads serialized data from it and `.feed()` is not usable.
:param int read_size:
Used as `file_like.read(read_size)`. (default: `min(16*1024, max_buffer_size)`)
@@ -202,17 +158,17 @@ class Unpacker(object):
0 - Timestamp
1 - float (Seconds from the EPOCH)
2 - int (Nanoseconds from the EPOCH)
- 3 - datetime.datetime (UTC). Python 2 is not supported.
+ 3 - datetime.datetime (UTC).
:param bool strict_map_key:
If true (default), only str or bytes are accepted for map (dict) keys.
- :param callable object_hook:
+ :param object_hook:
When specified, it should be callable.
Unpacker calls it with a dict argument after unpacking msgpack map.
(See also simplejson)
- :param callable object_pairs_hook:
+ :param object_pairs_hook:
When specified, it should be callable.
Unpacker calls it with a list of key-value pairs after unpacking msgpack map.
(See also simplejson)
@@ -359,9 +315,7 @@ class Unpacker(object):
if object_pairs_hook is not None and not callable(object_pairs_hook):
raise TypeError("`object_pairs_hook` is not callable")
if object_hook is not None and object_pairs_hook is not None:
- raise TypeError(
- "object_pairs_hook and object_hook are mutually " "exclusive"
- )
+ raise TypeError("object_pairs_hook and object_hook are mutually exclusive")
if not callable(ext_hook):
raise TypeError("`ext_hook` is not callable")
@@ -453,20 +407,18 @@ class Unpacker(object):
n = b & 0b00011111
typ = TYPE_RAW
if n > self._max_str_len:
- raise ValueError("%s exceeds max_str_len(%s)" % (n, self._max_str_len))
+ raise ValueError(f"{n} exceeds max_str_len({self._max_str_len})")
obj = self._read(n)
elif b & 0b11110000 == 0b10010000:
n = b & 0b00001111
typ = TYPE_ARRAY
if n > self._max_array_len:
- raise ValueError(
- "%s exceeds max_array_len(%s)" % (n, self._max_array_len)
- )
+ raise ValueError(f"{n} exceeds max_array_len({self._max_array_len})")
elif b & 0b11110000 == 0b10000000:
n = b & 0b00001111
typ = TYPE_MAP
if n > self._max_map_len:
- raise ValueError("%s exceeds max_map_len(%s)" % (n, self._max_map_len))
+ raise ValueError(f"{n} exceeds max_map_len({self._max_map_len})")
elif b == 0xC0:
obj = None
elif b == 0xC2:
@@ -477,65 +429,61 @@ class Unpacker(object):
size, fmt, typ = _MSGPACK_HEADERS[b]
self._reserve(size)
if len(fmt) > 0:
- n = _unpack_from(fmt, self._buffer, self._buff_i)[0]
+ n = struct.unpack_from(fmt, self._buffer, self._buff_i)[0]
else:
n = self._buffer[self._buff_i]
self._buff_i += size
if n > self._max_bin_len:
- raise ValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
+ raise ValueError(f"{n} exceeds max_bin_len({self._max_bin_len})")
obj = self._read(n)
elif 0xC7 <= b <= 0xC9:
size, fmt, typ = _MSGPACK_HEADERS[b]
self._reserve(size)
- L, n = _unpack_from(fmt, self._buffer, self._buff_i)
+ L, n = struct.unpack_from(fmt, self._buffer, self._buff_i)
self._buff_i += size
if L > self._max_ext_len:
- raise ValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
+ raise ValueError(f"{L} exceeds max_ext_len({self._max_ext_len})")
obj = self._read(L)
elif 0xCA <= b <= 0xD3:
size, fmt = _MSGPACK_HEADERS[b]
self._reserve(size)
if len(fmt) > 0:
- obj = _unpack_from(fmt, self._buffer, self._buff_i)[0]
+ obj = struct.unpack_from(fmt, self._buffer, self._buff_i)[0]
else:
obj = self._buffer[self._buff_i]
self._buff_i += size
elif 0xD4 <= b <= 0xD8:
size, fmt, typ = _MSGPACK_HEADERS[b]
if self._max_ext_len < size:
- raise ValueError(
- "%s exceeds max_ext_len(%s)" % (size, self._max_ext_len)
- )
+ raise ValueError(f"{size} exceeds max_ext_len({self._max_ext_len})")
self._reserve(size + 1)
- n, obj = _unpack_from(fmt, self._buffer, self._buff_i)
+ n, obj = struct.unpack_from(fmt, self._buffer, self._buff_i)
self._buff_i += size + 1
elif 0xD9 <= b <= 0xDB:
size, fmt, typ = _MSGPACK_HEADERS[b]
self._reserve(size)
if len(fmt) > 0:
- (n,) = _unpack_from(fmt, self._buffer, self._buff_i)
+ (n,) = struct.unpack_from(fmt, self._buffer, self._buff_i)
else:
n = self._buffer[self._buff_i]
self._buff_i += size
if n > self._max_str_len:
- raise ValueError("%s exceeds max_str_len(%s)" % (n, self._max_str_len))
+ raise ValueError(f"{n} exceeds max_str_len({self._max_str_len})")
obj = self._read(n)
elif 0xDC <= b <= 0xDD:
size, fmt, typ = _MSGPACK_HEADERS[b]
self._reserve(size)
- (n,) = _unpack_from(fmt, self._buffer, self._buff_i)
+ (n,) = struct.unpack_from(fmt, self._buffer, self._buff_i)
self._buff_i += size
if n > self._max_array_len:
- raise ValueError(
- "%s exceeds max_array_len(%s)" % (n, self._max_array_len)
- )
+ raise ValueError(f"{n} exceeds max_array_len({self._max_array_len})")
elif 0xDE <= b <= 0xDF:
size, fmt, typ = _MSGPACK_HEADERS[b]
self._reserve(size)
- (n,) = _unpack_from(fmt, self._buffer, self._buff_i)
+ (n,) = struct.unpack_from(fmt, self._buffer, self._buff_i)
self._buff_i += size
if n > self._max_map_len:
- raise ValueError("%s exceeds max_map_len(%s)" % (n, self._max_map_len))
+ raise ValueError(f"{n} exceeds max_map_len({self._max_map_len})")
else:
raise FormatError("Unknown header: 0x%x" % b)
return typ, n, obj
@@ -554,12 +502,12 @@ class Unpacker(object):
# TODO should we eliminate the recursion?
if typ == TYPE_ARRAY:
if execute == EX_SKIP:
- for i in xrange(n):
+ for i in range(n):
# TODO check whether we need to call `list_hook`
self._unpack(EX_SKIP)
return
ret = newlist_hint(n)
- for i in xrange(n):
+ for i in range(n):
ret.append(self._unpack(EX_CONSTRUCT))
if self._list_hook is not None:
ret = self._list_hook(ret)
@@ -567,25 +515,22 @@ class Unpacker(object):
return ret if self._use_list else tuple(ret)
if typ == TYPE_MAP:
if execute == EX_SKIP:
- for i in xrange(n):
+ for i in range(n):
# TODO check whether we need to call hooks
self._unpack(EX_SKIP)
self._unpack(EX_SKIP)
return
if self._object_pairs_hook is not None:
ret = self._object_pairs_hook(
- (self._unpack(EX_CONSTRUCT), self._unpack(EX_CONSTRUCT))
- for _ in xrange(n)
+ (self._unpack(EX_CONSTRUCT), self._unpack(EX_CONSTRUCT)) for _ in range(n)
)
else:
ret = {}
- for _ in xrange(n):
+ for _ in range(n):
key = self._unpack(EX_CONSTRUCT)
- if self._strict_map_key and type(key) not in (unicode, bytes):
- raise ValueError(
- "%s is not allowed for map key" % str(type(key))
- )
- if not PY2 and type(key) is str:
+ if self._strict_map_key and type(key) not in (str, bytes):
+ raise ValueError("%s is not allowed for map key" % str(type(key)))
+ if isinstance(key, str):
key = sys.intern(key)
ret[key] = self._unpack(EX_CONSTRUCT)
if self._object_hook is not None:
@@ -659,7 +604,7 @@ class Unpacker(object):
return self._stream_offset
-class Packer(object):
+class Packer:
"""
MessagePack Packer
@@ -671,7 +616,8 @@ class Packer(object):
Packer's constructor has some keyword arguments:
- :param callable default:
+ :param default:
+ When specified, it should be callable.
Convert user type to builtin type that Packer supports.
See also simplejson's document.
@@ -698,7 +644,6 @@ class Packer(object):
If set to true, datetime with tzinfo is packed into Timestamp type.
Note that the tzinfo is stripped in the timestamp.
You can get UTC datetime with `timestamp=3` option of the Unpacker.
- (Python 2 is not supported).
:param str unicode_errors:
The error handler for encoding unicode. (default: 'strict')
@@ -743,8 +688,6 @@ class Packer(object):
self._autoreset = autoreset
self._use_bin_type = use_bin_type
self._buffer = StringIO()
- if PY2 and datetime:
- raise ValueError("datetime is not supported in Python 2")
self._datetime = bool(datetime)
self._unicode_errors = unicode_errors or "strict"
if default is not None:
@@ -774,7 +717,7 @@ class Packer(object):
if obj:
return self._buffer.write(b"\xc3")
return self._buffer.write(b"\xc2")
- if check(obj, int_types):
+ if check(obj, int):
if 0 <= obj < 0x80:
return self._buffer.write(struct.pack("B", obj))
if -0x20 <= obj < 0:
@@ -806,7 +749,7 @@ class Packer(object):
raise ValueError("%s is too large" % type(obj).__name__)
self._pack_bin_header(n)
return self._buffer.write(obj)
- if check(obj, unicode):
+ if check(obj, str):
obj = obj.encode("utf-8", self._unicode_errors)
n = len(obj)
if n >= 2**32:
@@ -855,13 +798,11 @@ class Packer(object):
if check(obj, list_types):
n = len(obj)
self._pack_array_header(n)
- for i in xrange(n):
+ for i in range(n):
self._pack(obj[i], nest_limit - 1)
return
if check(obj, dict):
- return self._pack_map_pairs(
- len(obj), dict_iteritems(obj), nest_limit - 1
- )
+ return self._pack_map_pairs(len(obj), obj.items(), nest_limit - 1)
if self._datetime and check(obj, _DateTime) and obj.tzinfo is not None:
obj = Timestamp.from_datetime(obj)
@@ -874,9 +815,9 @@ class Packer(object):
continue
if self._datetime and check(obj, _DateTime):
- raise ValueError("Cannot serialize %r where tzinfo=None" % (obj,))
+ raise ValueError(f"Cannot serialize {obj!r} where tzinfo=None")
- raise TypeError("Cannot serialize %r" % (obj,))
+ raise TypeError(f"Cannot serialize {obj!r}")
def pack(self, obj):
try:
@@ -963,7 +904,7 @@ class Packer(object):
def _pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT):
self._pack_map_header(n)
- for (k, v) in pairs:
+ for k, v in pairs:
self._pack(k, nest_limit - 1)
self._pack(v, nest_limit - 1)
@@ -1004,7 +945,7 @@ class Packer(object):
def getbuffer(self):
"""Return view of internal buffer."""
- if USING_STRINGBUILDER or PY2:
+ if USING_STRINGBUILDER:
return memoryview(self.bytes())
else:
return self._buffer.getbuffer()
diff --git a/contrib/python/pip/pip/_vendor/packaging/__about__.py b/contrib/python/pip/pip/_vendor/packaging/__about__.py
deleted file mode 100644
index 3551bc2d29..0000000000
--- a/contrib/python/pip/pip/_vendor/packaging/__about__.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-__all__ = [
- "__title__",
- "__summary__",
- "__uri__",
- "__version__",
- "__author__",
- "__email__",
- "__license__",
- "__copyright__",
-]
-
-__title__ = "packaging"
-__summary__ = "Core utilities for Python packages"
-__uri__ = "https://github.com/pypa/packaging"
-
-__version__ = "21.3"
-
-__author__ = "Donald Stufft and individual contributors"
-__email__ = "donald@stufft.io"
-
-__license__ = "BSD-2-Clause or Apache-2.0"
-__copyright__ = "2014-2019 %s" % __author__
diff --git a/contrib/python/pip/pip/_vendor/packaging/__init__.py b/contrib/python/pip/pip/_vendor/packaging/__init__.py
index 3c50c5dcfe..9ba41d8357 100644
--- a/contrib/python/pip/pip/_vendor/packaging/__init__.py
+++ b/contrib/python/pip/pip/_vendor/packaging/__init__.py
@@ -2,24 +2,14 @@
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
-from .__about__ import (
- __author__,
- __copyright__,
- __email__,
- __license__,
- __summary__,
- __title__,
- __uri__,
- __version__,
-)
+__title__ = "packaging"
+__summary__ = "Core utilities for Python packages"
+__uri__ = "https://github.com/pypa/packaging"
-__all__ = [
- "__title__",
- "__summary__",
- "__uri__",
- "__version__",
- "__author__",
- "__email__",
- "__license__",
- "__copyright__",
-]
+__version__ = "24.1"
+
+__author__ = "Donald Stufft and individual contributors"
+__email__ = "donald@stufft.io"
+
+__license__ = "BSD-2-Clause or Apache-2.0"
+__copyright__ = "2014 %s" % __author__
diff --git a/contrib/python/pip/pip/_vendor/packaging/_elffile.py b/contrib/python/pip/pip/_vendor/packaging/_elffile.py
new file mode 100644
index 0000000000..f7a02180bf
--- /dev/null
+++ b/contrib/python/pip/pip/_vendor/packaging/_elffile.py
@@ -0,0 +1,110 @@
+"""
+ELF file parser.
+
+This provides a class ``ELFFile`` that parses an ELF executable in a similar
+interface to ``ZipFile``. Only the read interface is implemented.
+
+Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca
+ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html
+"""
+
+from __future__ import annotations
+
+import enum
+import os
+import struct
+from typing import IO
+
+
+class ELFInvalid(ValueError):
+ pass
+
+
+class EIClass(enum.IntEnum):
+ C32 = 1
+ C64 = 2
+
+
+class EIData(enum.IntEnum):
+ Lsb = 1
+ Msb = 2
+
+
+class EMachine(enum.IntEnum):
+ I386 = 3
+ S390 = 22
+ Arm = 40
+ X8664 = 62
+ AArc64 = 183
+
+
+class ELFFile:
+ """
+ Representation of an ELF executable.
+ """
+
+ def __init__(self, f: IO[bytes]) -> None:
+ self._f = f
+
+ try:
+ ident = self._read("16B")
+ except struct.error:
+ raise ELFInvalid("unable to parse identification")
+ magic = bytes(ident[:4])
+ if magic != b"\x7fELF":
+ raise ELFInvalid(f"invalid magic: {magic!r}")
+
+ self.capacity = ident[4] # Format for program header (bitness).
+ self.encoding = ident[5] # Data structure encoding (endianness).
+
+ try:
+ # e_fmt: Format for program header.
+ # p_fmt: Format for section header.
+ # p_idx: Indexes to find p_type, p_offset, and p_filesz.
+ e_fmt, self._p_fmt, self._p_idx = {
+ (1, 1): ("<HHIIIIIHHH", "<IIIIIIII", (0, 1, 4)), # 32-bit LSB.
+ (1, 2): (">HHIIIIIHHH", ">IIIIIIII", (0, 1, 4)), # 32-bit MSB.
+ (2, 1): ("<HHIQQQIHHH", "<IIQQQQQQ", (0, 2, 5)), # 64-bit LSB.
+ (2, 2): (">HHIQQQIHHH", ">IIQQQQQQ", (0, 2, 5)), # 64-bit MSB.
+ }[(self.capacity, self.encoding)]
+ except KeyError:
+ raise ELFInvalid(
+ f"unrecognized capacity ({self.capacity}) or "
+ f"encoding ({self.encoding})"
+ )
+
+ try:
+ (
+ _,
+ self.machine, # Architecture type.
+ _,
+ _,
+ self._e_phoff, # Offset of program header.
+ _,
+ self.flags, # Processor-specific flags.
+ _,
+ self._e_phentsize, # Size of section.
+ self._e_phnum, # Number of sections.
+ ) = self._read(e_fmt)
+ except struct.error as e:
+ raise ELFInvalid("unable to parse machine and section information") from e
+
+ def _read(self, fmt: str) -> tuple[int, ...]:
+ return struct.unpack(fmt, self._f.read(struct.calcsize(fmt)))
+
+ @property
+ def interpreter(self) -> str | None:
+ """
+ The path recorded in the ``PT_INTERP`` section header.
+ """
+ for index in range(self._e_phnum):
+ self._f.seek(self._e_phoff + self._e_phentsize * index)
+ try:
+ data = self._read(self._p_fmt)
+ except struct.error:
+ continue
+ if data[self._p_idx[0]] != 3: # Not PT_INTERP.
+ continue
+ self._f.seek(data[self._p_idx[1]])
+ return os.fsdecode(self._f.read(data[self._p_idx[2]])).strip("\0")
+ return None
diff --git a/contrib/python/pip/pip/_vendor/packaging/_manylinux.py b/contrib/python/pip/pip/_vendor/packaging/_manylinux.py
index 4c379aa6f6..08f651fbd8 100644
--- a/contrib/python/pip/pip/_vendor/packaging/_manylinux.py
+++ b/contrib/python/pip/pip/_vendor/packaging/_manylinux.py
@@ -1,122 +1,72 @@
+from __future__ import annotations
+
import collections
+import contextlib
import functools
import os
import re
-import struct
import sys
import warnings
-from typing import IO, Dict, Iterator, NamedTuple, Optional, Tuple
-
-
-# Python does not provide platform information at sufficient granularity to
-# identify the architecture of the running executable in some cases, so we
-# determine it dynamically by reading the information from the running
-# process. This only applies on Linux, which uses the ELF format.
-class _ELFFileHeader:
- # https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header
- class _InvalidELFFileHeader(ValueError):
- """
- An invalid ELF file header was found.
- """
-
- ELF_MAGIC_NUMBER = 0x7F454C46
- ELFCLASS32 = 1
- ELFCLASS64 = 2
- ELFDATA2LSB = 1
- ELFDATA2MSB = 2
- EM_386 = 3
- EM_S390 = 22
- EM_ARM = 40
- EM_X86_64 = 62
- EF_ARM_ABIMASK = 0xFF000000
- EF_ARM_ABI_VER5 = 0x05000000
- EF_ARM_ABI_FLOAT_HARD = 0x00000400
-
- def __init__(self, file: IO[bytes]) -> None:
- def unpack(fmt: str) -> int:
- try:
- data = file.read(struct.calcsize(fmt))
- result: Tuple[int, ...] = struct.unpack(fmt, data)
- except struct.error:
- raise _ELFFileHeader._InvalidELFFileHeader()
- return result[0]
-
- self.e_ident_magic = unpack(">I")
- if self.e_ident_magic != self.ELF_MAGIC_NUMBER:
- raise _ELFFileHeader._InvalidELFFileHeader()
- self.e_ident_class = unpack("B")
- if self.e_ident_class not in {self.ELFCLASS32, self.ELFCLASS64}:
- raise _ELFFileHeader._InvalidELFFileHeader()
- self.e_ident_data = unpack("B")
- if self.e_ident_data not in {self.ELFDATA2LSB, self.ELFDATA2MSB}:
- raise _ELFFileHeader._InvalidELFFileHeader()
- self.e_ident_version = unpack("B")
- self.e_ident_osabi = unpack("B")
- self.e_ident_abiversion = unpack("B")
- self.e_ident_pad = file.read(7)
- format_h = "<H" if self.e_ident_data == self.ELFDATA2LSB else ">H"
- format_i = "<I" if self.e_ident_data == self.ELFDATA2LSB else ">I"
- format_q = "<Q" if self.e_ident_data == self.ELFDATA2LSB else ">Q"
- format_p = format_i if self.e_ident_class == self.ELFCLASS32 else format_q
- self.e_type = unpack(format_h)
- self.e_machine = unpack(format_h)
- self.e_version = unpack(format_i)
- self.e_entry = unpack(format_p)
- self.e_phoff = unpack(format_p)
- self.e_shoff = unpack(format_p)
- self.e_flags = unpack(format_i)
- self.e_ehsize = unpack(format_h)
- self.e_phentsize = unpack(format_h)
- self.e_phnum = unpack(format_h)
- self.e_shentsize = unpack(format_h)
- self.e_shnum = unpack(format_h)
- self.e_shstrndx = unpack(format_h)
-
-
-def _get_elf_header() -> Optional[_ELFFileHeader]:
+from typing import Generator, Iterator, NamedTuple, Sequence
+
+from ._elffile import EIClass, EIData, ELFFile, EMachine
+
+EF_ARM_ABIMASK = 0xFF000000
+EF_ARM_ABI_VER5 = 0x05000000
+EF_ARM_ABI_FLOAT_HARD = 0x00000400
+
+
+# `os.PathLike` not a generic type until Python 3.9, so sticking with `str`
+# as the type for `path` until then.
+@contextlib.contextmanager
+def _parse_elf(path: str) -> Generator[ELFFile | None, None, None]:
try:
- with open(sys.executable, "rb") as f:
- elf_header = _ELFFileHeader(f)
- except (OSError, TypeError, _ELFFileHeader._InvalidELFFileHeader):
- return None
- return elf_header
+ with open(path, "rb") as f:
+ yield ELFFile(f)
+ except (OSError, TypeError, ValueError):
+ yield None
-def _is_linux_armhf() -> bool:
+def _is_linux_armhf(executable: str) -> bool:
# hard-float ABI can be detected from the ELF header of the running
# process
# https://static.docs.arm.com/ihi0044/g/aaelf32.pdf
- elf_header = _get_elf_header()
- if elf_header is None:
- return False
- result = elf_header.e_ident_class == elf_header.ELFCLASS32
- result &= elf_header.e_ident_data == elf_header.ELFDATA2LSB
- result &= elf_header.e_machine == elf_header.EM_ARM
- result &= (
- elf_header.e_flags & elf_header.EF_ARM_ABIMASK
- ) == elf_header.EF_ARM_ABI_VER5
- result &= (
- elf_header.e_flags & elf_header.EF_ARM_ABI_FLOAT_HARD
- ) == elf_header.EF_ARM_ABI_FLOAT_HARD
- return result
-
-
-def _is_linux_i686() -> bool:
- elf_header = _get_elf_header()
- if elf_header is None:
- return False
- result = elf_header.e_ident_class == elf_header.ELFCLASS32
- result &= elf_header.e_ident_data == elf_header.ELFDATA2LSB
- result &= elf_header.e_machine == elf_header.EM_386
- return result
+ with _parse_elf(executable) as f:
+ return (
+ f is not None
+ and f.capacity == EIClass.C32
+ and f.encoding == EIData.Lsb
+ and f.machine == EMachine.Arm
+ and f.flags & EF_ARM_ABIMASK == EF_ARM_ABI_VER5
+ and f.flags & EF_ARM_ABI_FLOAT_HARD == EF_ARM_ABI_FLOAT_HARD
+ )
+
+
+def _is_linux_i686(executable: str) -> bool:
+ with _parse_elf(executable) as f:
+ return (
+ f is not None
+ and f.capacity == EIClass.C32
+ and f.encoding == EIData.Lsb
+ and f.machine == EMachine.I386
+ )
-def _have_compatible_abi(arch: str) -> bool:
- if arch == "armv7l":
- return _is_linux_armhf()
- if arch == "i686":
- return _is_linux_i686()
- return arch in {"x86_64", "aarch64", "ppc64", "ppc64le", "s390x"}
+def _have_compatible_abi(executable: str, archs: Sequence[str]) -> bool:
+ if "armv7l" in archs:
+ return _is_linux_armhf(executable)
+ if "i686" in archs:
+ return _is_linux_i686(executable)
+ allowed_archs = {
+ "x86_64",
+ "aarch64",
+ "ppc64",
+ "ppc64le",
+ "s390x",
+ "loongarch64",
+ "riscv64",
+ }
+ return any(arch in allowed_archs for arch in archs)
# If glibc ever changes its major version, we need to know what the last
@@ -124,7 +74,7 @@ def _have_compatible_abi(arch: str) -> bool:
# For now, guess what the highest minor version might be, assume it will
# be 50 for testing. Once this actually happens, update the dictionary
# with the actual value.
-_LAST_GLIBC_MINOR: Dict[int, int] = collections.defaultdict(lambda: 50)
+_LAST_GLIBC_MINOR: dict[int, int] = collections.defaultdict(lambda: 50)
class _GLibCVersion(NamedTuple):
@@ -132,7 +82,7 @@ class _GLibCVersion(NamedTuple):
minor: int
-def _glibc_version_string_confstr() -> Optional[str]:
+def _glibc_version_string_confstr() -> str | None:
"""
Primary implementation of glibc_version_string using os.confstr.
"""
@@ -141,17 +91,17 @@ def _glibc_version_string_confstr() -> Optional[str]:
# platform module.
# https://github.com/python/cpython/blob/fcf1d003bf4f0100c/Lib/platform.py#L175-L183
try:
- # os.confstr("CS_GNU_LIBC_VERSION") returns a string like "glibc 2.17".
- version_string = os.confstr("CS_GNU_LIBC_VERSION")
+ # Should be a string like "glibc 2.17".
+ version_string: str | None = os.confstr("CS_GNU_LIBC_VERSION")
assert version_string is not None
- _, version = version_string.split()
+ _, version = version_string.rsplit()
except (AssertionError, AttributeError, OSError, ValueError):
# os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)...
return None
return version
-def _glibc_version_string_ctypes() -> Optional[str]:
+def _glibc_version_string_ctypes() -> str | None:
"""
Fallback implementation of glibc_version_string using ctypes.
"""
@@ -195,12 +145,12 @@ def _glibc_version_string_ctypes() -> Optional[str]:
return version_str
-def _glibc_version_string() -> Optional[str]:
+def _glibc_version_string() -> str | None:
"""Returns glibc version string, or None if not using glibc."""
return _glibc_version_string_confstr() or _glibc_version_string_ctypes()
-def _parse_glibc_version(version_str: str) -> Tuple[int, int]:
+def _parse_glibc_version(version_str: str) -> tuple[int, int]:
"""Parse glibc version.
We use a regexp instead of str.split because we want to discard any
@@ -211,16 +161,16 @@ def _parse_glibc_version(version_str: str) -> Tuple[int, int]:
m = re.match(r"(?P<major>[0-9]+)\.(?P<minor>[0-9]+)", version_str)
if not m:
warnings.warn(
- "Expected glibc version with 2 components major.minor,"
- " got: %s" % version_str,
+ f"Expected glibc version with 2 components major.minor,"
+ f" got: {version_str}",
RuntimeWarning,
)
return -1, -1
return int(m.group("major")), int(m.group("minor"))
-@functools.lru_cache()
-def _get_glibc_version() -> Tuple[int, int]:
+@functools.lru_cache
+def _get_glibc_version() -> tuple[int, int]:
version_str = _glibc_version_string()
if version_str is None:
return (-1, -1)
@@ -228,13 +178,13 @@ def _get_glibc_version() -> Tuple[int, int]:
# From PEP 513, PEP 600
-def _is_compatible(name: str, arch: str, version: _GLibCVersion) -> bool:
+def _is_compatible(arch: str, version: _GLibCVersion) -> bool:
sys_glibc = _get_glibc_version()
if sys_glibc < version:
return False
# Check for presence of _manylinux module.
try:
- import _manylinux # noqa
+ import _manylinux
except ImportError:
return True
if hasattr(_manylinux, "manylinux_compatible"):
@@ -264,12 +214,22 @@ _LEGACY_MANYLINUX_MAP = {
}
-def platform_tags(linux: str, arch: str) -> Iterator[str]:
- if not _have_compatible_abi(arch):
+def platform_tags(archs: Sequence[str]) -> Iterator[str]:
+ """Generate manylinux tags compatible to the current platform.
+
+ :param archs: Sequence of compatible architectures.
+ The first one shall be the closest to the actual architecture and be the part of
+ platform tag after the ``linux_`` prefix, e.g. ``x86_64``.
+ The ``linux_`` prefix is assumed as a prerequisite for the current platform to
+ be manylinux-compatible.
+
+ :returns: An iterator of compatible manylinux tags.
+ """
+ if not _have_compatible_abi(sys.executable, archs):
return
# Oldest glibc to be supported regardless of architecture is (2, 17).
too_old_glibc2 = _GLibCVersion(2, 16)
- if arch in {"x86_64", "i686"}:
+ if set(archs) & {"x86_64", "i686"}:
# On x86/i686 also oldest glibc to be supported is (2, 5).
too_old_glibc2 = _GLibCVersion(2, 4)
current_glibc = _GLibCVersion(*_get_glibc_version())
@@ -283,19 +243,20 @@ def platform_tags(linux: str, arch: str) -> Iterator[str]:
for glibc_major in range(current_glibc.major - 1, 1, -1):
glibc_minor = _LAST_GLIBC_MINOR[glibc_major]
glibc_max_list.append(_GLibCVersion(glibc_major, glibc_minor))
- for glibc_max in glibc_max_list:
- if glibc_max.major == too_old_glibc2.major:
- min_minor = too_old_glibc2.minor
- else:
- # For other glibc major versions oldest supported is (x, 0).
- min_minor = -1
- for glibc_minor in range(glibc_max.minor, min_minor, -1):
- glibc_version = _GLibCVersion(glibc_max.major, glibc_minor)
- tag = "manylinux_{}_{}".format(*glibc_version)
- if _is_compatible(tag, arch, glibc_version):
- yield linux.replace("linux", tag)
- # Handle the legacy manylinux1, manylinux2010, manylinux2014 tags.
- if glibc_version in _LEGACY_MANYLINUX_MAP:
- legacy_tag = _LEGACY_MANYLINUX_MAP[glibc_version]
- if _is_compatible(legacy_tag, arch, glibc_version):
- yield linux.replace("linux", legacy_tag)
+ for arch in archs:
+ for glibc_max in glibc_max_list:
+ if glibc_max.major == too_old_glibc2.major:
+ min_minor = too_old_glibc2.minor
+ else:
+ # For other glibc major versions oldest supported is (x, 0).
+ min_minor = -1
+ for glibc_minor in range(glibc_max.minor, min_minor, -1):
+ glibc_version = _GLibCVersion(glibc_max.major, glibc_minor)
+ tag = "manylinux_{}_{}".format(*glibc_version)
+ if _is_compatible(arch, glibc_version):
+ yield f"{tag}_{arch}"
+ # Handle the legacy manylinux1, manylinux2010, manylinux2014 tags.
+ if glibc_version in _LEGACY_MANYLINUX_MAP:
+ legacy_tag = _LEGACY_MANYLINUX_MAP[glibc_version]
+ if _is_compatible(arch, glibc_version):
+ yield f"{legacy_tag}_{arch}"
diff --git a/contrib/python/pip/pip/_vendor/packaging/_musllinux.py b/contrib/python/pip/pip/_vendor/packaging/_musllinux.py
index 8ac3059ba3..d2bf30b563 100644
--- a/contrib/python/pip/pip/_vendor/packaging/_musllinux.py
+++ b/contrib/python/pip/pip/_vendor/packaging/_musllinux.py
@@ -4,68 +4,15 @@ This module implements logic to detect if the currently running Python is
linked against musl, and what musl version is used.
"""
-import contextlib
+from __future__ import annotations
+
import functools
-import operator
-import os
import re
-import struct
import subprocess
import sys
-from typing import IO, Iterator, NamedTuple, Optional, Tuple
-
-
-def _read_unpacked(f: IO[bytes], fmt: str) -> Tuple[int, ...]:
- return struct.unpack(fmt, f.read(struct.calcsize(fmt)))
+from typing import Iterator, NamedTuple, Sequence
-
-def _parse_ld_musl_from_elf(f: IO[bytes]) -> Optional[str]:
- """Detect musl libc location by parsing the Python executable.
-
- Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca
- ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html
- """
- f.seek(0)
- try:
- ident = _read_unpacked(f, "16B")
- except struct.error:
- return None
- if ident[:4] != tuple(b"\x7fELF"): # Invalid magic, not ELF.
- return None
- f.seek(struct.calcsize("HHI"), 1) # Skip file type, machine, and version.
-
- try:
- # e_fmt: Format for program header.
- # p_fmt: Format for section header.
- # p_idx: Indexes to find p_type, p_offset, and p_filesz.
- e_fmt, p_fmt, p_idx = {
- 1: ("IIIIHHH", "IIIIIIII", (0, 1, 4)), # 32-bit.
- 2: ("QQQIHHH", "IIQQQQQQ", (0, 2, 5)), # 64-bit.
- }[ident[4]]
- except KeyError:
- return None
- else:
- p_get = operator.itemgetter(*p_idx)
-
- # Find the interpreter section and return its content.
- try:
- _, e_phoff, _, _, _, e_phentsize, e_phnum = _read_unpacked(f, e_fmt)
- except struct.error:
- return None
- for i in range(e_phnum + 1):
- f.seek(e_phoff + e_phentsize * i)
- try:
- p_type, p_offset, p_filesz = p_get(_read_unpacked(f, p_fmt))
- except struct.error:
- return None
- if p_type != 3: # Not PT_INTERP.
- continue
- f.seek(p_offset)
- interpreter = os.fsdecode(f.read(p_filesz)).strip("\0")
- if "musl" not in interpreter:
- return None
- return interpreter
- return None
+from ._elffile import ELFFile
class _MuslVersion(NamedTuple):
@@ -73,7 +20,7 @@ class _MuslVersion(NamedTuple):
minor: int
-def _parse_musl_version(output: str) -> Optional[_MuslVersion]:
+def _parse_musl_version(output: str) -> _MuslVersion | None:
lines = [n for n in (n.strip() for n in output.splitlines()) if n]
if len(lines) < 2 or lines[0][:4] != "musl":
return None
@@ -83,8 +30,8 @@ def _parse_musl_version(output: str) -> Optional[_MuslVersion]:
return _MuslVersion(major=int(m.group(1)), minor=int(m.group(2)))
-@functools.lru_cache()
-def _get_musl_version(executable: str) -> Optional[_MuslVersion]:
+@functools.lru_cache
+def _get_musl_version(executable: str) -> _MuslVersion | None:
"""Detect currently-running musl runtime version.
This is done by checking the specified executable's dynamic linking
@@ -95,32 +42,34 @@ def _get_musl_version(executable: str) -> Optional[_MuslVersion]:
Version 1.2.2
Dynamic Program Loader
"""
- with contextlib.ExitStack() as stack:
- try:
- f = stack.enter_context(open(executable, "rb"))
- except OSError:
- return None
- ld = _parse_ld_musl_from_elf(f)
- if not ld:
+ try:
+ with open(executable, "rb") as f:
+ ld = ELFFile(f).interpreter
+ except (OSError, TypeError, ValueError):
+ return None
+ if ld is None or "musl" not in ld:
return None
- proc = subprocess.run([ld], stderr=subprocess.PIPE, universal_newlines=True)
+ proc = subprocess.run([ld], stderr=subprocess.PIPE, text=True)
return _parse_musl_version(proc.stderr)
-def platform_tags(arch: str) -> Iterator[str]:
+def platform_tags(archs: Sequence[str]) -> Iterator[str]:
"""Generate musllinux tags compatible to the current platform.
- :param arch: Should be the part of platform tag after the ``linux_``
- prefix, e.g. ``x86_64``. The ``linux_`` prefix is assumed as a
- prerequisite for the current platform to be musllinux-compatible.
+ :param archs: Sequence of compatible architectures.
+ The first one shall be the closest to the actual architecture and be the part of
+ platform tag after the ``linux_`` prefix, e.g. ``x86_64``.
+ The ``linux_`` prefix is assumed as a prerequisite for the current platform to
+ be musllinux-compatible.
:returns: An iterator of compatible musllinux tags.
"""
sys_musl = _get_musl_version(sys.executable)
if sys_musl is None: # Python not dynamically linked against musl.
return
- for minor in range(sys_musl.minor, -1, -1):
- yield f"musllinux_{sys_musl.major}_{minor}_{arch}"
+ for arch in archs:
+ for minor in range(sys_musl.minor, -1, -1):
+ yield f"musllinux_{sys_musl.major}_{minor}_{arch}"
if __name__ == "__main__": # pragma: no cover
diff --git a/contrib/python/pip/pip/_vendor/packaging/_parser.py b/contrib/python/pip/pip/_vendor/packaging/_parser.py
new file mode 100644
index 0000000000..c1238c06ea
--- /dev/null
+++ b/contrib/python/pip/pip/_vendor/packaging/_parser.py
@@ -0,0 +1,354 @@
+"""Handwritten parser of dependency specifiers.
+
+The docstring for each __parse_* function contains EBNF-inspired grammar representing
+the implementation.
+"""
+
+from __future__ import annotations
+
+import ast
+from typing import NamedTuple, Sequence, Tuple, Union
+
+from ._tokenizer import DEFAULT_RULES, Tokenizer
+
+
+class Node:
+ def __init__(self, value: str) -> None:
+ self.value = value
+
+ def __str__(self) -> str:
+ return self.value
+
+ def __repr__(self) -> str:
+ return f"<{self.__class__.__name__}('{self}')>"
+
+ def serialize(self) -> str:
+ raise NotImplementedError
+
+
+class Variable(Node):
+ def serialize(self) -> str:
+ return str(self)
+
+
+class Value(Node):
+ def serialize(self) -> str:
+ return f'"{self}"'
+
+
+class Op(Node):
+ def serialize(self) -> str:
+ return str(self)
+
+
+MarkerVar = Union[Variable, Value]
+MarkerItem = Tuple[MarkerVar, Op, MarkerVar]
+MarkerAtom = Union[MarkerItem, Sequence["MarkerAtom"]]
+MarkerList = Sequence[Union["MarkerList", MarkerAtom, str]]
+
+
+class ParsedRequirement(NamedTuple):
+ name: str
+ url: str
+ extras: list[str]
+ specifier: str
+ marker: MarkerList | None
+
+
+# --------------------------------------------------------------------------------------
+# Recursive descent parser for dependency specifier
+# --------------------------------------------------------------------------------------
+def parse_requirement(source: str) -> ParsedRequirement:
+ return _parse_requirement(Tokenizer(source, rules=DEFAULT_RULES))
+
+
+def _parse_requirement(tokenizer: Tokenizer) -> ParsedRequirement:
+ """
+ requirement = WS? IDENTIFIER WS? extras WS? requirement_details
+ """
+ tokenizer.consume("WS")
+
+ name_token = tokenizer.expect(
+ "IDENTIFIER", expected="package name at the start of dependency specifier"
+ )
+ name = name_token.text
+ tokenizer.consume("WS")
+
+ extras = _parse_extras(tokenizer)
+ tokenizer.consume("WS")
+
+ url, specifier, marker = _parse_requirement_details(tokenizer)
+ tokenizer.expect("END", expected="end of dependency specifier")
+
+ return ParsedRequirement(name, url, extras, specifier, marker)
+
+
+def _parse_requirement_details(
+ tokenizer: Tokenizer,
+) -> tuple[str, str, MarkerList | None]:
+ """
+ requirement_details = AT URL (WS requirement_marker?)?
+ | specifier WS? (requirement_marker)?
+ """
+
+ specifier = ""
+ url = ""
+ marker = None
+
+ if tokenizer.check("AT"):
+ tokenizer.read()
+ tokenizer.consume("WS")
+
+ url_start = tokenizer.position
+ url = tokenizer.expect("URL", expected="URL after @").text
+ if tokenizer.check("END", peek=True):
+ return (url, specifier, marker)
+
+ tokenizer.expect("WS", expected="whitespace after URL")
+
+ # The input might end after whitespace.
+ if tokenizer.check("END", peek=True):
+ return (url, specifier, marker)
+
+ marker = _parse_requirement_marker(
+ tokenizer, span_start=url_start, after="URL and whitespace"
+ )
+ else:
+ specifier_start = tokenizer.position
+ specifier = _parse_specifier(tokenizer)
+ tokenizer.consume("WS")
+
+ if tokenizer.check("END", peek=True):
+ return (url, specifier, marker)
+
+ marker = _parse_requirement_marker(
+ tokenizer,
+ span_start=specifier_start,
+ after=(
+ "version specifier"
+ if specifier
+ else "name and no valid version specifier"
+ ),
+ )
+
+ return (url, specifier, marker)
+
+
+def _parse_requirement_marker(
+ tokenizer: Tokenizer, *, span_start: int, after: str
+) -> MarkerList:
+ """
+ requirement_marker = SEMICOLON marker WS?
+ """
+
+ if not tokenizer.check("SEMICOLON"):
+ tokenizer.raise_syntax_error(
+ f"Expected end or semicolon (after {after})",
+ span_start=span_start,
+ )
+ tokenizer.read()
+
+ marker = _parse_marker(tokenizer)
+ tokenizer.consume("WS")
+
+ return marker
+
+
+def _parse_extras(tokenizer: Tokenizer) -> list[str]:
+ """
+ extras = (LEFT_BRACKET wsp* extras_list? wsp* RIGHT_BRACKET)?
+ """
+ if not tokenizer.check("LEFT_BRACKET", peek=True):
+ return []
+
+ with tokenizer.enclosing_tokens(
+ "LEFT_BRACKET",
+ "RIGHT_BRACKET",
+ around="extras",
+ ):
+ tokenizer.consume("WS")
+ extras = _parse_extras_list(tokenizer)
+ tokenizer.consume("WS")
+
+ return extras
+
+
+def _parse_extras_list(tokenizer: Tokenizer) -> list[str]:
+ """
+ extras_list = identifier (wsp* ',' wsp* identifier)*
+ """
+ extras: list[str] = []
+
+ if not tokenizer.check("IDENTIFIER"):
+ return extras
+
+ extras.append(tokenizer.read().text)
+
+ while True:
+ tokenizer.consume("WS")
+ if tokenizer.check("IDENTIFIER", peek=True):
+ tokenizer.raise_syntax_error("Expected comma between extra names")
+ elif not tokenizer.check("COMMA"):
+ break
+
+ tokenizer.read()
+ tokenizer.consume("WS")
+
+ extra_token = tokenizer.expect("IDENTIFIER", expected="extra name after comma")
+ extras.append(extra_token.text)
+
+ return extras
+
+
+def _parse_specifier(tokenizer: Tokenizer) -> str:
+ """
+ specifier = LEFT_PARENTHESIS WS? version_many WS? RIGHT_PARENTHESIS
+ | WS? version_many WS?
+ """
+ with tokenizer.enclosing_tokens(
+ "LEFT_PARENTHESIS",
+ "RIGHT_PARENTHESIS",
+ around="version specifier",
+ ):
+ tokenizer.consume("WS")
+ parsed_specifiers = _parse_version_many(tokenizer)
+ tokenizer.consume("WS")
+
+ return parsed_specifiers
+
+
+def _parse_version_many(tokenizer: Tokenizer) -> str:
+ """
+ version_many = (SPECIFIER (WS? COMMA WS? SPECIFIER)*)?
+ """
+ parsed_specifiers = ""
+ while tokenizer.check("SPECIFIER"):
+ span_start = tokenizer.position
+ parsed_specifiers += tokenizer.read().text
+ if tokenizer.check("VERSION_PREFIX_TRAIL", peek=True):
+ tokenizer.raise_syntax_error(
+ ".* suffix can only be used with `==` or `!=` operators",
+ span_start=span_start,
+ span_end=tokenizer.position + 1,
+ )
+ if tokenizer.check("VERSION_LOCAL_LABEL_TRAIL", peek=True):
+ tokenizer.raise_syntax_error(
+ "Local version label can only be used with `==` or `!=` operators",
+ span_start=span_start,
+ span_end=tokenizer.position,
+ )
+ tokenizer.consume("WS")
+ if not tokenizer.check("COMMA"):
+ break
+ parsed_specifiers += tokenizer.read().text
+ tokenizer.consume("WS")
+
+ return parsed_specifiers
+
+
+# --------------------------------------------------------------------------------------
+# Recursive descent parser for marker expression
+# --------------------------------------------------------------------------------------
+def parse_marker(source: str) -> MarkerList:
+ return _parse_full_marker(Tokenizer(source, rules=DEFAULT_RULES))
+
+
+def _parse_full_marker(tokenizer: Tokenizer) -> MarkerList:
+ retval = _parse_marker(tokenizer)
+ tokenizer.expect("END", expected="end of marker expression")
+ return retval
+
+
+def _parse_marker(tokenizer: Tokenizer) -> MarkerList:
+ """
+ marker = marker_atom (BOOLOP marker_atom)+
+ """
+ expression = [_parse_marker_atom(tokenizer)]
+ while tokenizer.check("BOOLOP"):
+ token = tokenizer.read()
+ expr_right = _parse_marker_atom(tokenizer)
+ expression.extend((token.text, expr_right))
+ return expression
+
+
+def _parse_marker_atom(tokenizer: Tokenizer) -> MarkerAtom:
+ """
+ marker_atom = WS? LEFT_PARENTHESIS WS? marker WS? RIGHT_PARENTHESIS WS?
+ | WS? marker_item WS?
+ """
+
+ tokenizer.consume("WS")
+ if tokenizer.check("LEFT_PARENTHESIS", peek=True):
+ with tokenizer.enclosing_tokens(
+ "LEFT_PARENTHESIS",
+ "RIGHT_PARENTHESIS",
+ around="marker expression",
+ ):
+ tokenizer.consume("WS")
+ marker: MarkerAtom = _parse_marker(tokenizer)
+ tokenizer.consume("WS")
+ else:
+ marker = _parse_marker_item(tokenizer)
+ tokenizer.consume("WS")
+ return marker
+
+
+def _parse_marker_item(tokenizer: Tokenizer) -> MarkerItem:
+ """
+ marker_item = WS? marker_var WS? marker_op WS? marker_var WS?
+ """
+ tokenizer.consume("WS")
+ marker_var_left = _parse_marker_var(tokenizer)
+ tokenizer.consume("WS")
+ marker_op = _parse_marker_op(tokenizer)
+ tokenizer.consume("WS")
+ marker_var_right = _parse_marker_var(tokenizer)
+ tokenizer.consume("WS")
+ return (marker_var_left, marker_op, marker_var_right)
+
+
+def _parse_marker_var(tokenizer: Tokenizer) -> MarkerVar:
+ """
+ marker_var = VARIABLE | QUOTED_STRING
+ """
+ if tokenizer.check("VARIABLE"):
+ return process_env_var(tokenizer.read().text.replace(".", "_"))
+ elif tokenizer.check("QUOTED_STRING"):
+ return process_python_str(tokenizer.read().text)
+ else:
+ tokenizer.raise_syntax_error(
+ message="Expected a marker variable or quoted string"
+ )
+
+
+def process_env_var(env_var: str) -> Variable:
+ if env_var in ("platform_python_implementation", "python_implementation"):
+ return Variable("platform_python_implementation")
+ else:
+ return Variable(env_var)
+
+
+def process_python_str(python_str: str) -> Value:
+ value = ast.literal_eval(python_str)
+ return Value(str(value))
+
+
+def _parse_marker_op(tokenizer: Tokenizer) -> Op:
+ """
+ marker_op = IN | NOT IN | OP
+ """
+ if tokenizer.check("IN"):
+ tokenizer.read()
+ return Op("in")
+ elif tokenizer.check("NOT"):
+ tokenizer.read()
+ tokenizer.expect("WS", expected="whitespace after 'not'")
+ tokenizer.expect("IN", expected="'in' after 'not'")
+ return Op("not in")
+ elif tokenizer.check("OP"):
+ return Op(tokenizer.read().text)
+ else:
+ return tokenizer.raise_syntax_error(
+ "Expected marker operator, one of "
+ "<=, <, !=, ==, >=, >, ~=, ===, in, not in"
+ )
diff --git a/contrib/python/pip/pip/_vendor/packaging/_tokenizer.py b/contrib/python/pip/pip/_vendor/packaging/_tokenizer.py
new file mode 100644
index 0000000000..89d041605c
--- /dev/null
+++ b/contrib/python/pip/pip/_vendor/packaging/_tokenizer.py
@@ -0,0 +1,194 @@
+from __future__ import annotations
+
+import contextlib
+import re
+from dataclasses import dataclass
+from typing import Iterator, NoReturn
+
+from .specifiers import Specifier
+
+
+@dataclass
+class Token:
+ name: str
+ text: str
+ position: int
+
+
+class ParserSyntaxError(Exception):
+ """The provided source text could not be parsed correctly."""
+
+ def __init__(
+ self,
+ message: str,
+ *,
+ source: str,
+ span: tuple[int, int],
+ ) -> None:
+ self.span = span
+ self.message = message
+ self.source = source
+
+ super().__init__()
+
+ def __str__(self) -> str:
+ marker = " " * self.span[0] + "~" * (self.span[1] - self.span[0]) + "^"
+ return "\n ".join([self.message, self.source, marker])
+
+
+DEFAULT_RULES: dict[str, str | re.Pattern[str]] = {
+ "LEFT_PARENTHESIS": r"\(",
+ "RIGHT_PARENTHESIS": r"\)",
+ "LEFT_BRACKET": r"\[",
+ "RIGHT_BRACKET": r"\]",
+ "SEMICOLON": r";",
+ "COMMA": r",",
+ "QUOTED_STRING": re.compile(
+ r"""
+ (
+ ('[^']*')
+ |
+ ("[^"]*")
+ )
+ """,
+ re.VERBOSE,
+ ),
+ "OP": r"(===|==|~=|!=|<=|>=|<|>)",
+ "BOOLOP": r"\b(or|and)\b",
+ "IN": r"\bin\b",
+ "NOT": r"\bnot\b",
+ "VARIABLE": re.compile(
+ r"""
+ \b(
+ python_version
+ |python_full_version
+ |os[._]name
+ |sys[._]platform
+ |platform_(release|system)
+ |platform[._](version|machine|python_implementation)
+ |python_implementation
+ |implementation_(name|version)
+ |extra
+ )\b
+ """,
+ re.VERBOSE,
+ ),
+ "SPECIFIER": re.compile(
+ Specifier._operator_regex_str + Specifier._version_regex_str,
+ re.VERBOSE | re.IGNORECASE,
+ ),
+ "AT": r"\@",
+ "URL": r"[^ \t]+",
+ "IDENTIFIER": r"\b[a-zA-Z0-9][a-zA-Z0-9._-]*\b",
+ "VERSION_PREFIX_TRAIL": r"\.\*",
+ "VERSION_LOCAL_LABEL_TRAIL": r"\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*",
+ "WS": r"[ \t]+",
+ "END": r"$",
+}
+
+
+class Tokenizer:
+ """Context-sensitive token parsing.
+
+ Provides methods to examine the input stream to check whether the next token
+ matches.
+ """
+
+ def __init__(
+ self,
+ source: str,
+ *,
+ rules: dict[str, str | re.Pattern[str]],
+ ) -> None:
+ self.source = source
+ self.rules: dict[str, re.Pattern[str]] = {
+ name: re.compile(pattern) for name, pattern in rules.items()
+ }
+ self.next_token: Token | None = None
+ self.position = 0
+
+ def consume(self, name: str) -> None:
+ """Move beyond provided token name, if at current position."""
+ if self.check(name):
+ self.read()
+
+ def check(self, name: str, *, peek: bool = False) -> bool:
+ """Check whether the next token has the provided name.
+
+ By default, if the check succeeds, the token *must* be read before
+ another check. If `peek` is set to `True`, the token is not loaded and
+ would need to be checked again.
+ """
+ assert (
+ self.next_token is None
+ ), f"Cannot check for {name!r}, already have {self.next_token!r}"
+ assert name in self.rules, f"Unknown token name: {name!r}"
+
+ expression = self.rules[name]
+
+ match = expression.match(self.source, self.position)
+ if match is None:
+ return False
+ if not peek:
+ self.next_token = Token(name, match[0], self.position)
+ return True
+
+ def expect(self, name: str, *, expected: str) -> Token:
+ """Expect a certain token name next, failing with a syntax error otherwise.
+
+ The token is *not* read.
+ """
+ if not self.check(name):
+ raise self.raise_syntax_error(f"Expected {expected}")
+ return self.read()
+
+ def read(self) -> Token:
+ """Consume the next token and return it."""
+ token = self.next_token
+ assert token is not None
+
+ self.position += len(token.text)
+ self.next_token = None
+
+ return token
+
+ def raise_syntax_error(
+ self,
+ message: str,
+ *,
+ span_start: int | None = None,
+ span_end: int | None = None,
+ ) -> NoReturn:
+ """Raise ParserSyntaxError at the given position."""
+ span = (
+ self.position if span_start is None else span_start,
+ self.position if span_end is None else span_end,
+ )
+ raise ParserSyntaxError(
+ message,
+ source=self.source,
+ span=span,
+ )
+
+ @contextlib.contextmanager
+ def enclosing_tokens(
+ self, open_token: str, close_token: str, *, around: str
+ ) -> Iterator[None]:
+ if self.check(open_token):
+ open_position = self.position
+ self.read()
+ else:
+ open_position = None
+
+ yield
+
+ if open_position is None:
+ return
+
+ if not self.check(close_token):
+ self.raise_syntax_error(
+ f"Expected matching {close_token} for {open_token}, after {around}",
+ span_start=open_position,
+ )
+
+ self.read()
diff --git a/contrib/python/pip/pip/_vendor/packaging/markers.py b/contrib/python/pip/pip/_vendor/packaging/markers.py
index 540e7a4dc7..7ac7bb69a5 100644
--- a/contrib/python/pip/pip/_vendor/packaging/markers.py
+++ b/contrib/python/pip/pip/_vendor/packaging/markers.py
@@ -2,25 +2,19 @@
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
+from __future__ import annotations
+
import operator
import os
import platform
import sys
-from typing import Any, Callable, Dict, List, Optional, Tuple, Union
-
-from pip._vendor.pyparsing import ( # noqa: N817
- Forward,
- Group,
- Literal as L,
- ParseException,
- ParseResults,
- QuotedString,
- ZeroOrMore,
- stringEnd,
- stringStart,
-)
+from typing import Any, Callable, TypedDict, cast
+from ._parser import MarkerAtom, MarkerList, Op, Value, Variable
+from ._parser import parse_marker as _parse_marker
+from ._tokenizer import ParserSyntaxError
from .specifiers import InvalidSpecifier, Specifier
+from .utils import canonicalize_name
__all__ = [
"InvalidMarker",
@@ -52,103 +46,97 @@ class UndefinedEnvironmentName(ValueError):
"""
-class Node:
- def __init__(self, value: Any) -> None:
- self.value = value
+class Environment(TypedDict):
+ implementation_name: str
+ """The implementation's identifier, e.g. ``'cpython'``."""
- def __str__(self) -> str:
- return str(self.value)
+ implementation_version: str
+ """
+ The implementation's version, e.g. ``'3.13.0a2'`` for CPython 3.13.0a2, or
+ ``'7.3.13'`` for PyPy3.10 v7.3.13.
+ """
- def __repr__(self) -> str:
- return f"<{self.__class__.__name__}('{self}')>"
-
- def serialize(self) -> str:
- raise NotImplementedError
-
-
-class Variable(Node):
- def serialize(self) -> str:
- return str(self)
-
-
-class Value(Node):
- def serialize(self) -> str:
- return f'"{self}"'
-
-
-class Op(Node):
- def serialize(self) -> str:
- return str(self)
-
-
-VARIABLE = (
- L("implementation_version")
- | L("platform_python_implementation")
- | L("implementation_name")
- | L("python_full_version")
- | L("platform_release")
- | L("platform_version")
- | L("platform_machine")
- | L("platform_system")
- | L("python_version")
- | L("sys_platform")
- | L("os_name")
- | L("os.name") # PEP-345
- | L("sys.platform") # PEP-345
- | L("platform.version") # PEP-345
- | L("platform.machine") # PEP-345
- | L("platform.python_implementation") # PEP-345
- | L("python_implementation") # undocumented setuptools legacy
- | L("extra") # PEP-508
-)
-ALIASES = {
- "os.name": "os_name",
- "sys.platform": "sys_platform",
- "platform.version": "platform_version",
- "platform.machine": "platform_machine",
- "platform.python_implementation": "platform_python_implementation",
- "python_implementation": "platform_python_implementation",
-}
-VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0])))
+ os_name: str
+ """
+ The value of :py:data:`os.name`. The name of the operating system dependent module
+ imported, e.g. ``'posix'``.
+ """
-VERSION_CMP = (
- L("===") | L("==") | L(">=") | L("<=") | L("!=") | L("~=") | L(">") | L("<")
-)
+ platform_machine: str
+ """
+ Returns the machine type, e.g. ``'i386'``.
-MARKER_OP = VERSION_CMP | L("not in") | L("in")
-MARKER_OP.setParseAction(lambda s, l, t: Op(t[0]))
+ An empty string if the value cannot be determined.
+ """
-MARKER_VALUE = QuotedString("'") | QuotedString('"')
-MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0]))
+ platform_release: str
+ """
+ The system's release, e.g. ``'2.2.0'`` or ``'NT'``.
-BOOLOP = L("and") | L("or")
+ An empty string if the value cannot be determined.
+ """
-MARKER_VAR = VARIABLE | MARKER_VALUE
+ platform_system: str
+ """
+ The system/OS name, e.g. ``'Linux'``, ``'Windows'`` or ``'Java'``.
-MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR)
-MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0]))
+ An empty string if the value cannot be determined.
+ """
-LPAREN = L("(").suppress()
-RPAREN = L(")").suppress()
+ platform_version: str
+ """
+ The system's release version, e.g. ``'#3 on degas'``.
-MARKER_EXPR = Forward()
-MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN)
-MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR)
+ An empty string if the value cannot be determined.
+ """
-MARKER = stringStart + MARKER_EXPR + stringEnd
+ python_full_version: str
+ """
+ The Python version as string ``'major.minor.patchlevel'``.
+ Note that unlike the Python :py:data:`sys.version`, this value will always include
+ the patchlevel (it defaults to 0).
+ """
-def _coerce_parse_result(results: Union[ParseResults, List[Any]]) -> List[Any]:
- if isinstance(results, ParseResults):
- return [_coerce_parse_result(i) for i in results]
- else:
- return results
+ platform_python_implementation: str
+ """
+ A string identifying the Python implementation, e.g. ``'CPython'``.
+ """
+
+ python_version: str
+ """The Python version as string ``'major.minor'``."""
+
+ sys_platform: str
+ """
+ This string contains a platform identifier that can be used to append
+ platform-specific components to :py:data:`sys.path`, for instance.
+
+ For Unix systems, except on Linux and AIX, this is the lowercased OS name as
+ returned by ``uname -s`` with the first part of the version as returned by
+ ``uname -r`` appended, e.g. ``'sunos5'`` or ``'freebsd8'``, at the time when Python
+ was built.
+ """
+
+
+def _normalize_extra_values(results: Any) -> Any:
+ """
+ Normalize extra values.
+ """
+ if isinstance(results[0], tuple):
+ lhs, op, rhs = results[0]
+ if isinstance(lhs, Variable) and lhs.value == "extra":
+ normalized_extra = canonicalize_name(rhs.value)
+ rhs = Value(normalized_extra)
+ elif isinstance(rhs, Variable) and rhs.value == "extra":
+ normalized_extra = canonicalize_name(lhs.value)
+ lhs = Value(normalized_extra)
+ results[0] = lhs, op, rhs
+ return results
def _format_marker(
- marker: Union[List[str], Tuple[Node, ...], str], first: Optional[bool] = True
+ marker: list[str] | MarkerAtom | str, first: bool | None = True
) -> str:
-
assert isinstance(marker, (list, tuple, str))
# Sometimes we have a structure like [[...]] which is a single item list
@@ -174,7 +162,7 @@ def _format_marker(
return marker
-_operators: Dict[str, Operator] = {
+_operators: dict[str, Operator] = {
"in": lambda lhs, rhs: lhs in rhs,
"not in": lambda lhs, rhs: lhs not in rhs,
"<": operator.lt,
@@ -192,35 +180,29 @@ def _eval_op(lhs: str, op: Op, rhs: str) -> bool:
except InvalidSpecifier:
pass
else:
- return spec.contains(lhs)
+ return spec.contains(lhs, prereleases=True)
- oper: Optional[Operator] = _operators.get(op.serialize())
+ oper: Operator | None = _operators.get(op.serialize())
if oper is None:
raise UndefinedComparison(f"Undefined {op!r} on {lhs!r} and {rhs!r}.")
return oper(lhs, rhs)
-class Undefined:
- pass
-
-
-_undefined = Undefined()
-
-
-def _get_env(environment: Dict[str, str], name: str) -> str:
- value: Union[str, Undefined] = environment.get(name, _undefined)
+def _normalize(*values: str, key: str) -> tuple[str, ...]:
+ # PEP 685 – Comparison of extra names for optional distribution dependencies
+ # https://peps.python.org/pep-0685/
+ # > When comparing extra names, tools MUST normalize the names being
+ # > compared using the semantics outlined in PEP 503 for names
+ if key == "extra":
+ return tuple(canonicalize_name(v) for v in values)
- if isinstance(value, Undefined):
- raise UndefinedEnvironmentName(
- f"{name!r} does not exist in evaluation environment."
- )
+ # other environment markers don't have such standards
+ return values
- return value
-
-def _evaluate_markers(markers: List[Any], environment: Dict[str, str]) -> bool:
- groups: List[List[bool]] = [[]]
+def _evaluate_markers(markers: MarkerList, environment: dict[str, str]) -> bool:
+ groups: list[list[bool]] = [[]]
for marker in markers:
assert isinstance(marker, (list, tuple, str))
@@ -231,12 +213,15 @@ def _evaluate_markers(markers: List[Any], environment: Dict[str, str]) -> bool:
lhs, op, rhs = marker
if isinstance(lhs, Variable):
- lhs_value = _get_env(environment, lhs.value)
+ environment_key = lhs.value
+ lhs_value = environment[environment_key]
rhs_value = rhs.value
else:
lhs_value = lhs.value
- rhs_value = _get_env(environment, rhs.value)
+ environment_key = rhs.value
+ rhs_value = environment[environment_key]
+ lhs_value, rhs_value = _normalize(lhs_value, rhs_value, key=environment_key)
groups[-1].append(_eval_op(lhs_value, op, rhs_value))
else:
assert marker in ["and", "or"]
@@ -246,7 +231,7 @@ def _evaluate_markers(markers: List[Any], environment: Dict[str, str]) -> bool:
return any(all(item) for item in groups)
-def format_full_version(info: "sys._version_info") -> str:
+def format_full_version(info: sys._version_info) -> str:
version = "{0.major}.{0.minor}.{0.micro}".format(info)
kind = info.releaselevel
if kind != "final":
@@ -254,7 +239,7 @@ def format_full_version(info: "sys._version_info") -> str:
return version
-def default_environment() -> Dict[str, str]:
+def default_environment() -> Environment:
iver = format_full_version(sys.implementation.version)
implementation_name = sys.implementation.name
return {
@@ -274,13 +259,29 @@ def default_environment() -> Dict[str, str]:
class Marker:
def __init__(self, marker: str) -> None:
+ # Note: We create a Marker object without calling this constructor in
+ # packaging.requirements.Requirement. If any additional logic is
+ # added here, make sure to mirror/adapt Requirement.
try:
- self._markers = _coerce_parse_result(MARKER.parseString(marker))
- except ParseException as e:
- raise InvalidMarker(
- f"Invalid marker: {marker!r}, parse error at "
- f"{marker[e.loc : e.loc + 8]!r}"
- )
+ self._markers = _normalize_extra_values(_parse_marker(marker))
+ # The attribute `_markers` can be described in terms of a recursive type:
+ # MarkerList = List[Union[Tuple[Node, ...], str, MarkerList]]
+ #
+ # For example, the following expression:
+ # python_version > "3.6" or (python_version == "3.6" and os_name == "unix")
+ #
+ # is parsed into:
+ # [
+ # (<Variable('python_version')>, <Op('>')>, <Value('3.6')>),
+ # 'and',
+ # [
+ # (<Variable('python_version')>, <Op('==')>, <Value('3.6')>),
+ # 'or',
+ # (<Variable('os_name')>, <Op('==')>, <Value('unix')>)
+ # ]
+ # ]
+ except ParserSyntaxError as e:
+ raise InvalidMarker(str(e)) from e
def __str__(self) -> str:
return _format_marker(self._markers)
@@ -288,7 +289,16 @@ class Marker:
def __repr__(self) -> str:
return f"<Marker('{self}')>"
- def evaluate(self, environment: Optional[Dict[str, str]] = None) -> bool:
+ def __hash__(self) -> int:
+ return hash((self.__class__.__name__, str(self)))
+
+ def __eq__(self, other: Any) -> bool:
+ if not isinstance(other, Marker):
+ return NotImplemented
+
+ return str(self) == str(other)
+
+ def evaluate(self, environment: dict[str, str] | None = None) -> bool:
"""Evaluate a marker.
Return the boolean from evaluating the given marker against the
@@ -297,8 +307,19 @@ class Marker:
The environment is determined from the current Python process.
"""
- current_environment = default_environment()
+ current_environment = cast("dict[str, str]", default_environment())
+ current_environment["extra"] = ""
+ # Work around platform.python_version() returning something that is not PEP 440
+ # compliant for non-tagged Python builds. We preserve default_environment()'s
+ # behavior of returning platform.python_version() verbatim, and leave it to the
+ # caller to provide a syntactically valid version if they want to override it.
+ if current_environment["python_full_version"].endswith("+"):
+ current_environment["python_full_version"] += "local"
if environment is not None:
current_environment.update(environment)
+ # The API used to allow setting extra to None. We need to handle this
+ # case for backwards compatibility.
+ if current_environment["extra"] is None:
+ current_environment["extra"] = ""
return _evaluate_markers(self._markers, current_environment)
diff --git a/contrib/python/pip/pip/_vendor/packaging/metadata.py b/contrib/python/pip/pip/_vendor/packaging/metadata.py
new file mode 100644
index 0000000000..eb8dc844d2
--- /dev/null
+++ b/contrib/python/pip/pip/_vendor/packaging/metadata.py
@@ -0,0 +1,804 @@
+from __future__ import annotations
+
+import email.feedparser
+import email.header
+import email.message
+import email.parser
+import email.policy
+import typing
+from typing import (
+ Any,
+ Callable,
+ Generic,
+ Literal,
+ TypedDict,
+ cast,
+)
+
+from . import requirements, specifiers, utils
+from . import version as version_module
+
+T = typing.TypeVar("T")
+
+
+try:
+ ExceptionGroup
+except NameError: # pragma: no cover
+
+ class ExceptionGroup(Exception):
+ """A minimal implementation of :external:exc:`ExceptionGroup` from Python 3.11.
+
+ If :external:exc:`ExceptionGroup` is already defined by Python itself,
+ that version is used instead.
+ """
+
+ message: str
+ exceptions: list[Exception]
+
+ def __init__(self, message: str, exceptions: list[Exception]) -> None:
+ self.message = message
+ self.exceptions = exceptions
+
+ def __repr__(self) -> str:
+ return f"{self.__class__.__name__}({self.message!r}, {self.exceptions!r})"
+
+else: # pragma: no cover
+ ExceptionGroup = ExceptionGroup
+
+
+class InvalidMetadata(ValueError):
+ """A metadata field contains invalid data."""
+
+ field: str
+ """The name of the field that contains invalid data."""
+
+ def __init__(self, field: str, message: str) -> None:
+ self.field = field
+ super().__init__(message)
+
+
+# The RawMetadata class attempts to make as few assumptions about the underlying
+# serialization formats as possible. The idea is that as long as a serialization
+# formats offer some very basic primitives in *some* way then we can support
+# serializing to and from that format.
+class RawMetadata(TypedDict, total=False):
+ """A dictionary of raw core metadata.
+
+ Each field in core metadata maps to a key of this dictionary (when data is
+ provided). The key is lower-case and underscores are used instead of dashes
+ compared to the equivalent core metadata field. Any core metadata field that
+ can be specified multiple times or can hold multiple values in a single
+ field have a key with a plural name. See :class:`Metadata` whose attributes
+ match the keys of this dictionary.
+
+ Core metadata fields that can be specified multiple times are stored as a
+ list or dict depending on which is appropriate for the field. Any fields
+ which hold multiple values in a single field are stored as a list.
+
+ """
+
+ # Metadata 1.0 - PEP 241
+ metadata_version: str
+ name: str
+ version: str
+ platforms: list[str]
+ summary: str
+ description: str
+ keywords: list[str]
+ home_page: str
+ author: str
+ author_email: str
+ license: str
+
+ # Metadata 1.1 - PEP 314
+ supported_platforms: list[str]
+ download_url: str
+ classifiers: list[str]
+ requires: list[str]
+ provides: list[str]
+ obsoletes: list[str]
+
+ # Metadata 1.2 - PEP 345
+ maintainer: str
+ maintainer_email: str
+ requires_dist: list[str]
+ provides_dist: list[str]
+ obsoletes_dist: list[str]
+ requires_python: str
+ requires_external: list[str]
+ project_urls: dict[str, str]
+
+ # Metadata 2.0
+ # PEP 426 attempted to completely revamp the metadata format
+ # but got stuck without ever being able to build consensus on
+ # it and ultimately ended up withdrawn.
+ #
+ # However, a number of tools had started emitting METADATA with
+ # `2.0` Metadata-Version, so for historical reasons, this version
+ # was skipped.
+
+ # Metadata 2.1 - PEP 566
+ description_content_type: str
+ provides_extra: list[str]
+
+ # Metadata 2.2 - PEP 643
+ dynamic: list[str]
+
+ # Metadata 2.3 - PEP 685
+ # No new fields were added in PEP 685, just some edge case were
+ # tightened up to provide better interoptability.
+
+
+_STRING_FIELDS = {
+ "author",
+ "author_email",
+ "description",
+ "description_content_type",
+ "download_url",
+ "home_page",
+ "license",
+ "maintainer",
+ "maintainer_email",
+ "metadata_version",
+ "name",
+ "requires_python",
+ "summary",
+ "version",
+}
+
+_LIST_FIELDS = {
+ "classifiers",
+ "dynamic",
+ "obsoletes",
+ "obsoletes_dist",
+ "platforms",
+ "provides",
+ "provides_dist",
+ "provides_extra",
+ "requires",
+ "requires_dist",
+ "requires_external",
+ "supported_platforms",
+}
+
+_DICT_FIELDS = {
+ "project_urls",
+}
+
+
+def _parse_keywords(data: str) -> list[str]:
+ """Split a string of comma-separate keyboards into a list of keywords."""
+ return [k.strip() for k in data.split(",")]
+
+
+def _parse_project_urls(data: list[str]) -> dict[str, str]:
+ """Parse a list of label/URL string pairings separated by a comma."""
+ urls = {}
+ for pair in data:
+ # Our logic is slightly tricky here as we want to try and do
+ # *something* reasonable with malformed data.
+ #
+ # The main thing that we have to worry about, is data that does
+ # not have a ',' at all to split the label from the Value. There
+ # isn't a singular right answer here, and we will fail validation
+ # later on (if the caller is validating) so it doesn't *really*
+ # matter, but since the missing value has to be an empty str
+ # and our return value is dict[str, str], if we let the key
+ # be the missing value, then they'd have multiple '' values that
+ # overwrite each other in a accumulating dict.
+ #
+ # The other potentional issue is that it's possible to have the
+ # same label multiple times in the metadata, with no solid "right"
+ # answer with what to do in that case. As such, we'll do the only
+ # thing we can, which is treat the field as unparseable and add it
+ # to our list of unparsed fields.
+ parts = [p.strip() for p in pair.split(",", 1)]
+ parts.extend([""] * (max(0, 2 - len(parts)))) # Ensure 2 items
+
+ # TODO: The spec doesn't say anything about if the keys should be
+ # considered case sensitive or not... logically they should
+ # be case-preserving and case-insensitive, but doing that
+ # would open up more cases where we might have duplicate
+ # entries.
+ label, url = parts
+ if label in urls:
+ # The label already exists in our set of urls, so this field
+ # is unparseable, and we can just add the whole thing to our
+ # unparseable data and stop processing it.
+ raise KeyError("duplicate labels in project urls")
+ urls[label] = url
+
+ return urls
+
+
+def _get_payload(msg: email.message.Message, source: bytes | str) -> str:
+ """Get the body of the message."""
+ # If our source is a str, then our caller has managed encodings for us,
+ # and we don't need to deal with it.
+ if isinstance(source, str):
+ payload: str = msg.get_payload()
+ return payload
+ # If our source is a bytes, then we're managing the encoding and we need
+ # to deal with it.
+ else:
+ bpayload: bytes = msg.get_payload(decode=True)
+ try:
+ return bpayload.decode("utf8", "strict")
+ except UnicodeDecodeError:
+ raise ValueError("payload in an invalid encoding")
+
+
+# The various parse_FORMAT functions here are intended to be as lenient as
+# possible in their parsing, while still returning a correctly typed
+# RawMetadata.
+#
+# To aid in this, we also generally want to do as little touching of the
+# data as possible, except where there are possibly some historic holdovers
+# that make valid data awkward to work with.
+#
+# While this is a lower level, intermediate format than our ``Metadata``
+# class, some light touch ups can make a massive difference in usability.
+
+# Map METADATA fields to RawMetadata.
+_EMAIL_TO_RAW_MAPPING = {
+ "author": "author",
+ "author-email": "author_email",
+ "classifier": "classifiers",
+ "description": "description",
+ "description-content-type": "description_content_type",
+ "download-url": "download_url",
+ "dynamic": "dynamic",
+ "home-page": "home_page",
+ "keywords": "keywords",
+ "license": "license",
+ "maintainer": "maintainer",
+ "maintainer-email": "maintainer_email",
+ "metadata-version": "metadata_version",
+ "name": "name",
+ "obsoletes": "obsoletes",
+ "obsoletes-dist": "obsoletes_dist",
+ "platform": "platforms",
+ "project-url": "project_urls",
+ "provides": "provides",
+ "provides-dist": "provides_dist",
+ "provides-extra": "provides_extra",
+ "requires": "requires",
+ "requires-dist": "requires_dist",
+ "requires-external": "requires_external",
+ "requires-python": "requires_python",
+ "summary": "summary",
+ "supported-platform": "supported_platforms",
+ "version": "version",
+}
+_RAW_TO_EMAIL_MAPPING = {raw: email for email, raw in _EMAIL_TO_RAW_MAPPING.items()}
+
+
+def parse_email(data: bytes | str) -> tuple[RawMetadata, dict[str, list[str]]]:
+ """Parse a distribution's metadata stored as email headers (e.g. from ``METADATA``).
+
+ This function returns a two-item tuple of dicts. The first dict is of
+ recognized fields from the core metadata specification. Fields that can be
+ parsed and translated into Python's built-in types are converted
+ appropriately. All other fields are left as-is. Fields that are allowed to
+ appear multiple times are stored as lists.
+
+ The second dict contains all other fields from the metadata. This includes
+ any unrecognized fields. It also includes any fields which are expected to
+ be parsed into a built-in type but were not formatted appropriately. Finally,
+ any fields that are expected to appear only once but are repeated are
+ included in this dict.
+
+ """
+ raw: dict[str, str | list[str] | dict[str, str]] = {}
+ unparsed: dict[str, list[str]] = {}
+
+ if isinstance(data, str):
+ parsed = email.parser.Parser(policy=email.policy.compat32).parsestr(data)
+ else:
+ parsed = email.parser.BytesParser(policy=email.policy.compat32).parsebytes(data)
+
+ # We have to wrap parsed.keys() in a set, because in the case of multiple
+ # values for a key (a list), the key will appear multiple times in the
+ # list of keys, but we're avoiding that by using get_all().
+ for name in frozenset(parsed.keys()):
+ # Header names in RFC are case insensitive, so we'll normalize to all
+ # lower case to make comparisons easier.
+ name = name.lower()
+
+ # We use get_all() here, even for fields that aren't multiple use,
+ # because otherwise someone could have e.g. two Name fields, and we
+ # would just silently ignore it rather than doing something about it.
+ headers = parsed.get_all(name) or []
+
+ # The way the email module works when parsing bytes is that it
+ # unconditionally decodes the bytes as ascii using the surrogateescape
+ # handler. When you pull that data back out (such as with get_all() ),
+ # it looks to see if the str has any surrogate escapes, and if it does
+ # it wraps it in a Header object instead of returning the string.
+ #
+ # As such, we'll look for those Header objects, and fix up the encoding.
+ value = []
+ # Flag if we have run into any issues processing the headers, thus
+ # signalling that the data belongs in 'unparsed'.
+ valid_encoding = True
+ for h in headers:
+ # It's unclear if this can return more types than just a Header or
+ # a str, so we'll just assert here to make sure.
+ assert isinstance(h, (email.header.Header, str))
+
+ # If it's a header object, we need to do our little dance to get
+ # the real data out of it. In cases where there is invalid data
+ # we're going to end up with mojibake, but there's no obvious, good
+ # way around that without reimplementing parts of the Header object
+ # ourselves.
+ #
+ # That should be fine since, if mojibacked happens, this key is
+ # going into the unparsed dict anyways.
+ if isinstance(h, email.header.Header):
+ # The Header object stores it's data as chunks, and each chunk
+ # can be independently encoded, so we'll need to check each
+ # of them.
+ chunks: list[tuple[bytes, str | None]] = []
+ for bin, encoding in email.header.decode_header(h):
+ try:
+ bin.decode("utf8", "strict")
+ except UnicodeDecodeError:
+ # Enable mojibake.
+ encoding = "latin1"
+ valid_encoding = False
+ else:
+ encoding = "utf8"
+ chunks.append((bin, encoding))
+
+ # Turn our chunks back into a Header object, then let that
+ # Header object do the right thing to turn them into a
+ # string for us.
+ value.append(str(email.header.make_header(chunks)))
+ # This is already a string, so just add it.
+ else:
+ value.append(h)
+
+ # We've processed all of our values to get them into a list of str,
+ # but we may have mojibake data, in which case this is an unparsed
+ # field.
+ if not valid_encoding:
+ unparsed[name] = value
+ continue
+
+ raw_name = _EMAIL_TO_RAW_MAPPING.get(name)
+ if raw_name is None:
+ # This is a bit of a weird situation, we've encountered a key that
+ # we don't know what it means, so we don't know whether it's meant
+ # to be a list or not.
+ #
+ # Since we can't really tell one way or another, we'll just leave it
+ # as a list, even though it may be a single item list, because that's
+ # what makes the most sense for email headers.
+ unparsed[name] = value
+ continue
+
+ # If this is one of our string fields, then we'll check to see if our
+ # value is a list of a single item. If it is then we'll assume that
+ # it was emitted as a single string, and unwrap the str from inside
+ # the list.
+ #
+ # If it's any other kind of data, then we haven't the faintest clue
+ # what we should parse it as, and we have to just add it to our list
+ # of unparsed stuff.
+ if raw_name in _STRING_FIELDS and len(value) == 1:
+ raw[raw_name] = value[0]
+ # If this is one of our list of string fields, then we can just assign
+ # the value, since email *only* has strings, and our get_all() call
+ # above ensures that this is a list.
+ elif raw_name in _LIST_FIELDS:
+ raw[raw_name] = value
+ # Special Case: Keywords
+ # The keywords field is implemented in the metadata spec as a str,
+ # but it conceptually is a list of strings, and is serialized using
+ # ", ".join(keywords), so we'll do some light data massaging to turn
+ # this into what it logically is.
+ elif raw_name == "keywords" and len(value) == 1:
+ raw[raw_name] = _parse_keywords(value[0])
+ # Special Case: Project-URL
+ # The project urls is implemented in the metadata spec as a list of
+ # specially-formatted strings that represent a key and a value, which
+ # is fundamentally a mapping, however the email format doesn't support
+ # mappings in a sane way, so it was crammed into a list of strings
+ # instead.
+ #
+ # We will do a little light data massaging to turn this into a map as
+ # it logically should be.
+ elif raw_name == "project_urls":
+ try:
+ raw[raw_name] = _parse_project_urls(value)
+ except KeyError:
+ unparsed[name] = value
+ # Nothing that we've done has managed to parse this, so it'll just
+ # throw it in our unparseable data and move on.
+ else:
+ unparsed[name] = value
+
+ # We need to support getting the Description from the message payload in
+ # addition to getting it from the the headers. This does mean, though, there
+ # is the possibility of it being set both ways, in which case we put both
+ # in 'unparsed' since we don't know which is right.
+ try:
+ payload = _get_payload(parsed, data)
+ except ValueError:
+ unparsed.setdefault("description", []).append(
+ parsed.get_payload(decode=isinstance(data, bytes))
+ )
+ else:
+ if payload:
+ # Check to see if we've already got a description, if so then both
+ # it, and this body move to unparseable.
+ if "description" in raw:
+ description_header = cast(str, raw.pop("description"))
+ unparsed.setdefault("description", []).extend(
+ [description_header, payload]
+ )
+ elif "description" in unparsed:
+ unparsed["description"].append(payload)
+ else:
+ raw["description"] = payload
+
+ # We need to cast our `raw` to a metadata, because a TypedDict only support
+ # literal key names, but we're computing our key names on purpose, but the
+ # way this function is implemented, our `TypedDict` can only have valid key
+ # names.
+ return cast(RawMetadata, raw), unparsed
+
+
+_NOT_FOUND = object()
+
+
+# Keep the two values in sync.
+_VALID_METADATA_VERSIONS = ["1.0", "1.1", "1.2", "2.1", "2.2", "2.3"]
+_MetadataVersion = Literal["1.0", "1.1", "1.2", "2.1", "2.2", "2.3"]
+
+_REQUIRED_ATTRS = frozenset(["metadata_version", "name", "version"])
+
+
+class _Validator(Generic[T]):
+ """Validate a metadata field.
+
+ All _process_*() methods correspond to a core metadata field. The method is
+ called with the field's raw value. If the raw value is valid it is returned
+ in its "enriched" form (e.g. ``version.Version`` for the ``Version`` field).
+ If the raw value is invalid, :exc:`InvalidMetadata` is raised (with a cause
+ as appropriate).
+ """
+
+ name: str
+ raw_name: str
+ added: _MetadataVersion
+
+ def __init__(
+ self,
+ *,
+ added: _MetadataVersion = "1.0",
+ ) -> None:
+ self.added = added
+
+ def __set_name__(self, _owner: Metadata, name: str) -> None:
+ self.name = name
+ self.raw_name = _RAW_TO_EMAIL_MAPPING[name]
+
+ def __get__(self, instance: Metadata, _owner: type[Metadata]) -> T:
+ # With Python 3.8, the caching can be replaced with functools.cached_property().
+ # No need to check the cache as attribute lookup will resolve into the
+ # instance's __dict__ before __get__ is called.
+ cache = instance.__dict__
+ value = instance._raw.get(self.name)
+
+ # To make the _process_* methods easier, we'll check if the value is None
+ # and if this field is NOT a required attribute, and if both of those
+ # things are true, we'll skip the the converter. This will mean that the
+ # converters never have to deal with the None union.
+ if self.name in _REQUIRED_ATTRS or value is not None:
+ try:
+ converter: Callable[[Any], T] = getattr(self, f"_process_{self.name}")
+ except AttributeError:
+ pass
+ else:
+ value = converter(value)
+
+ cache[self.name] = value
+ try:
+ del instance._raw[self.name] # type: ignore[misc]
+ except KeyError:
+ pass
+
+ return cast(T, value)
+
+ def _invalid_metadata(
+ self, msg: str, cause: Exception | None = None
+ ) -> InvalidMetadata:
+ exc = InvalidMetadata(
+ self.raw_name, msg.format_map({"field": repr(self.raw_name)})
+ )
+ exc.__cause__ = cause
+ return exc
+
+ def _process_metadata_version(self, value: str) -> _MetadataVersion:
+ # Implicitly makes Metadata-Version required.
+ if value not in _VALID_METADATA_VERSIONS:
+ raise self._invalid_metadata(f"{value!r} is not a valid metadata version")
+ return cast(_MetadataVersion, value)
+
+ def _process_name(self, value: str) -> str:
+ if not value:
+ raise self._invalid_metadata("{field} is a required field")
+ # Validate the name as a side-effect.
+ try:
+ utils.canonicalize_name(value, validate=True)
+ except utils.InvalidName as exc:
+ raise self._invalid_metadata(
+ f"{value!r} is invalid for {{field}}", cause=exc
+ )
+ else:
+ return value
+
+ def _process_version(self, value: str) -> version_module.Version:
+ if not value:
+ raise self._invalid_metadata("{field} is a required field")
+ try:
+ return version_module.parse(value)
+ except version_module.InvalidVersion as exc:
+ raise self._invalid_metadata(
+ f"{value!r} is invalid for {{field}}", cause=exc
+ )
+
+ def _process_summary(self, value: str) -> str:
+ """Check the field contains no newlines."""
+ if "\n" in value:
+ raise self._invalid_metadata("{field} must be a single line")
+ return value
+
+ def _process_description_content_type(self, value: str) -> str:
+ content_types = {"text/plain", "text/x-rst", "text/markdown"}
+ message = email.message.EmailMessage()
+ message["content-type"] = value
+
+ content_type, parameters = (
+ # Defaults to `text/plain` if parsing failed.
+ message.get_content_type().lower(),
+ message["content-type"].params,
+ )
+ # Check if content-type is valid or defaulted to `text/plain` and thus was
+ # not parseable.
+ if content_type not in content_types or content_type not in value.lower():
+ raise self._invalid_metadata(
+ f"{{field}} must be one of {list(content_types)}, not {value!r}"
+ )
+
+ charset = parameters.get("charset", "UTF-8")
+ if charset != "UTF-8":
+ raise self._invalid_metadata(
+ f"{{field}} can only specify the UTF-8 charset, not {list(charset)}"
+ )
+
+ markdown_variants = {"GFM", "CommonMark"}
+ variant = parameters.get("variant", "GFM") # Use an acceptable default.
+ if content_type == "text/markdown" and variant not in markdown_variants:
+ raise self._invalid_metadata(
+ f"valid Markdown variants for {{field}} are {list(markdown_variants)}, "
+ f"not {variant!r}",
+ )
+ return value
+
+ def _process_dynamic(self, value: list[str]) -> list[str]:
+ for dynamic_field in map(str.lower, value):
+ if dynamic_field in {"name", "version", "metadata-version"}:
+ raise self._invalid_metadata(
+ f"{value!r} is not allowed as a dynamic field"
+ )
+ elif dynamic_field not in _EMAIL_TO_RAW_MAPPING:
+ raise self._invalid_metadata(f"{value!r} is not a valid dynamic field")
+ return list(map(str.lower, value))
+
+ def _process_provides_extra(
+ self,
+ value: list[str],
+ ) -> list[utils.NormalizedName]:
+ normalized_names = []
+ try:
+ for name in value:
+ normalized_names.append(utils.canonicalize_name(name, validate=True))
+ except utils.InvalidName as exc:
+ raise self._invalid_metadata(
+ f"{name!r} is invalid for {{field}}", cause=exc
+ )
+ else:
+ return normalized_names
+
+ def _process_requires_python(self, value: str) -> specifiers.SpecifierSet:
+ try:
+ return specifiers.SpecifierSet(value)
+ except specifiers.InvalidSpecifier as exc:
+ raise self._invalid_metadata(
+ f"{value!r} is invalid for {{field}}", cause=exc
+ )
+
+ def _process_requires_dist(
+ self,
+ value: list[str],
+ ) -> list[requirements.Requirement]:
+ reqs = []
+ try:
+ for req in value:
+ reqs.append(requirements.Requirement(req))
+ except requirements.InvalidRequirement as exc:
+ raise self._invalid_metadata(f"{req!r} is invalid for {{field}}", cause=exc)
+ else:
+ return reqs
+
+
+class Metadata:
+ """Representation of distribution metadata.
+
+ Compared to :class:`RawMetadata`, this class provides objects representing
+ metadata fields instead of only using built-in types. Any invalid metadata
+ will cause :exc:`InvalidMetadata` to be raised (with a
+ :py:attr:`~BaseException.__cause__` attribute as appropriate).
+ """
+
+ _raw: RawMetadata
+
+ @classmethod
+ def from_raw(cls, data: RawMetadata, *, validate: bool = True) -> Metadata:
+ """Create an instance from :class:`RawMetadata`.
+
+ If *validate* is true, all metadata will be validated. All exceptions
+ related to validation will be gathered and raised as an :class:`ExceptionGroup`.
+ """
+ ins = cls()
+ ins._raw = data.copy() # Mutations occur due to caching enriched values.
+
+ if validate:
+ exceptions: list[Exception] = []
+ try:
+ metadata_version = ins.metadata_version
+ metadata_age = _VALID_METADATA_VERSIONS.index(metadata_version)
+ except InvalidMetadata as metadata_version_exc:
+ exceptions.append(metadata_version_exc)
+ metadata_version = None
+
+ # Make sure to check for the fields that are present, the required
+ # fields (so their absence can be reported).
+ fields_to_check = frozenset(ins._raw) | _REQUIRED_ATTRS
+ # Remove fields that have already been checked.
+ fields_to_check -= {"metadata_version"}
+
+ for key in fields_to_check:
+ try:
+ if metadata_version:
+ # Can't use getattr() as that triggers descriptor protocol which
+ # will fail due to no value for the instance argument.
+ try:
+ field_metadata_version = cls.__dict__[key].added
+ except KeyError:
+ exc = InvalidMetadata(key, f"unrecognized field: {key!r}")
+ exceptions.append(exc)
+ continue
+ field_age = _VALID_METADATA_VERSIONS.index(
+ field_metadata_version
+ )
+ if field_age > metadata_age:
+ field = _RAW_TO_EMAIL_MAPPING[key]
+ exc = InvalidMetadata(
+ field,
+ "{field} introduced in metadata version "
+ "{field_metadata_version}, not {metadata_version}",
+ )
+ exceptions.append(exc)
+ continue
+ getattr(ins, key)
+ except InvalidMetadata as exc:
+ exceptions.append(exc)
+
+ if exceptions:
+ raise ExceptionGroup("invalid metadata", exceptions)
+
+ return ins
+
+ @classmethod
+ def from_email(cls, data: bytes | str, *, validate: bool = True) -> Metadata:
+ """Parse metadata from email headers.
+
+ If *validate* is true, the metadata will be validated. All exceptions
+ related to validation will be gathered and raised as an :class:`ExceptionGroup`.
+ """
+ raw, unparsed = parse_email(data)
+
+ if validate:
+ exceptions: list[Exception] = []
+ for unparsed_key in unparsed:
+ if unparsed_key in _EMAIL_TO_RAW_MAPPING:
+ message = f"{unparsed_key!r} has invalid data"
+ else:
+ message = f"unrecognized field: {unparsed_key!r}"
+ exceptions.append(InvalidMetadata(unparsed_key, message))
+
+ if exceptions:
+ raise ExceptionGroup("unparsed", exceptions)
+
+ try:
+ return cls.from_raw(raw, validate=validate)
+ except ExceptionGroup as exc_group:
+ raise ExceptionGroup(
+ "invalid or unparsed metadata", exc_group.exceptions
+ ) from None
+
+ metadata_version: _Validator[_MetadataVersion] = _Validator()
+ """:external:ref:`core-metadata-metadata-version`
+ (required; validated to be a valid metadata version)"""
+ name: _Validator[str] = _Validator()
+ """:external:ref:`core-metadata-name`
+ (required; validated using :func:`~packaging.utils.canonicalize_name` and its
+ *validate* parameter)"""
+ version: _Validator[version_module.Version] = _Validator()
+ """:external:ref:`core-metadata-version` (required)"""
+ dynamic: _Validator[list[str] | None] = _Validator(
+ added="2.2",
+ )
+ """:external:ref:`core-metadata-dynamic`
+ (validated against core metadata field names and lowercased)"""
+ platforms: _Validator[list[str] | None] = _Validator()
+ """:external:ref:`core-metadata-platform`"""
+ supported_platforms: _Validator[list[str] | None] = _Validator(added="1.1")
+ """:external:ref:`core-metadata-supported-platform`"""
+ summary: _Validator[str | None] = _Validator()
+ """:external:ref:`core-metadata-summary` (validated to contain no newlines)"""
+ description: _Validator[str | None] = _Validator() # TODO 2.1: can be in body
+ """:external:ref:`core-metadata-description`"""
+ description_content_type: _Validator[str | None] = _Validator(added="2.1")
+ """:external:ref:`core-metadata-description-content-type` (validated)"""
+ keywords: _Validator[list[str] | None] = _Validator()
+ """:external:ref:`core-metadata-keywords`"""
+ home_page: _Validator[str | None] = _Validator()
+ """:external:ref:`core-metadata-home-page`"""
+ download_url: _Validator[str | None] = _Validator(added="1.1")
+ """:external:ref:`core-metadata-download-url`"""
+ author: _Validator[str | None] = _Validator()
+ """:external:ref:`core-metadata-author`"""
+ author_email: _Validator[str | None] = _Validator()
+ """:external:ref:`core-metadata-author-email`"""
+ maintainer: _Validator[str | None] = _Validator(added="1.2")
+ """:external:ref:`core-metadata-maintainer`"""
+ maintainer_email: _Validator[str | None] = _Validator(added="1.2")
+ """:external:ref:`core-metadata-maintainer-email`"""
+ license: _Validator[str | None] = _Validator()
+ """:external:ref:`core-metadata-license`"""
+ classifiers: _Validator[list[str] | None] = _Validator(added="1.1")
+ """:external:ref:`core-metadata-classifier`"""
+ requires_dist: _Validator[list[requirements.Requirement] | None] = _Validator(
+ added="1.2"
+ )
+ """:external:ref:`core-metadata-requires-dist`"""
+ requires_python: _Validator[specifiers.SpecifierSet | None] = _Validator(
+ added="1.2"
+ )
+ """:external:ref:`core-metadata-requires-python`"""
+ # Because `Requires-External` allows for non-PEP 440 version specifiers, we
+ # don't do any processing on the values.
+ requires_external: _Validator[list[str] | None] = _Validator(added="1.2")
+ """:external:ref:`core-metadata-requires-external`"""
+ project_urls: _Validator[dict[str, str] | None] = _Validator(added="1.2")
+ """:external:ref:`core-metadata-project-url`"""
+ # PEP 685 lets us raise an error if an extra doesn't pass `Name` validation
+ # regardless of metadata version.
+ provides_extra: _Validator[list[utils.NormalizedName] | None] = _Validator(
+ added="2.1",
+ )
+ """:external:ref:`core-metadata-provides-extra`"""
+ provides_dist: _Validator[list[str] | None] = _Validator(added="1.2")
+ """:external:ref:`core-metadata-provides-dist`"""
+ obsoletes_dist: _Validator[list[str] | None] = _Validator(added="1.2")
+ """:external:ref:`core-metadata-obsoletes-dist`"""
+ requires: _Validator[list[str] | None] = _Validator(added="1.1")
+ """``Requires`` (deprecated)"""
+ provides: _Validator[list[str] | None] = _Validator(added="1.1")
+ """``Provides`` (deprecated)"""
+ obsoletes: _Validator[list[str] | None] = _Validator(added="1.1")
+ """``Obsoletes`` (deprecated)"""
diff --git a/contrib/python/pip/pip/_vendor/packaging/requirements.py b/contrib/python/pip/pip/_vendor/packaging/requirements.py
index 1eab7dd66d..4e068c9567 100644
--- a/contrib/python/pip/pip/_vendor/packaging/requirements.py
+++ b/contrib/python/pip/pip/_vendor/packaging/requirements.py
@@ -1,27 +1,15 @@
# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
+from __future__ import annotations
-import re
-import string
-import urllib.parse
-from typing import List, Optional as TOptional, Set
+from typing import Any, Iterator
-from pip._vendor.pyparsing import ( # noqa
- Combine,
- Literal as L,
- Optional,
- ParseException,
- Regex,
- Word,
- ZeroOrMore,
- originalTextFor,
- stringEnd,
- stringStart,
-)
-
-from .markers import MARKER_EXPR, Marker
-from .specifiers import LegacySpecifier, Specifier, SpecifierSet
+from ._parser import parse_requirement as _parse_requirement
+from ._tokenizer import ParserSyntaxError
+from .markers import Marker, _normalize_extra_values
+from .specifiers import SpecifierSet
+from .utils import canonicalize_name
class InvalidRequirement(ValueError):
@@ -30,60 +18,6 @@ class InvalidRequirement(ValueError):
"""
-ALPHANUM = Word(string.ascii_letters + string.digits)
-
-LBRACKET = L("[").suppress()
-RBRACKET = L("]").suppress()
-LPAREN = L("(").suppress()
-RPAREN = L(")").suppress()
-COMMA = L(",").suppress()
-SEMICOLON = L(";").suppress()
-AT = L("@").suppress()
-
-PUNCTUATION = Word("-_.")
-IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM)
-IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END))
-
-NAME = IDENTIFIER("name")
-EXTRA = IDENTIFIER
-
-URI = Regex(r"[^ ]+")("url")
-URL = AT + URI
-
-EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA)
-EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras")
-
-VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE)
-VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE)
-
-VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY
-VERSION_MANY = Combine(
- VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), joinString=",", adjacent=False
-)("_raw_spec")
-_VERSION_SPEC = Optional((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)
-_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or "")
-
-VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier")
-VERSION_SPEC.setParseAction(lambda s, l, t: t[1])
-
-MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker")
-MARKER_EXPR.setParseAction(
- lambda s, l, t: Marker(s[t._original_start : t._original_end])
-)
-MARKER_SEPARATOR = SEMICOLON
-MARKER = MARKER_SEPARATOR + MARKER_EXPR
-
-VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER)
-URL_AND_MARKER = URL + Optional(MARKER)
-
-NAMED_REQUIREMENT = NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER)
-
-REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd
-# pyparsing isn't thread safe during initialization, so we do it eagerly, see
-# issue #104
-REQUIREMENT.parseString("x[]")
-
-
class Requirement:
"""Parse a requirement.
@@ -99,48 +33,59 @@ class Requirement:
def __init__(self, requirement_string: str) -> None:
try:
- req = REQUIREMENT.parseString(requirement_string)
- except ParseException as e:
- raise InvalidRequirement(
- f'Parse error at "{ requirement_string[e.loc : e.loc + 8]!r}": {e.msg}'
- )
-
- self.name: str = req.name
- if req.url:
- parsed_url = urllib.parse.urlparse(req.url)
- if parsed_url.scheme == "file":
- if urllib.parse.urlunparse(parsed_url) != req.url:
- raise InvalidRequirement("Invalid URL given")
- elif not (parsed_url.scheme and parsed_url.netloc) or (
- not parsed_url.scheme and not parsed_url.netloc
- ):
- raise InvalidRequirement(f"Invalid URL: {req.url}")
- self.url: TOptional[str] = req.url
- else:
- self.url = None
- self.extras: Set[str] = set(req.extras.asList() if req.extras else [])
- self.specifier: SpecifierSet = SpecifierSet(req.specifier)
- self.marker: TOptional[Marker] = req.marker if req.marker else None
-
- def __str__(self) -> str:
- parts: List[str] = [self.name]
+ parsed = _parse_requirement(requirement_string)
+ except ParserSyntaxError as e:
+ raise InvalidRequirement(str(e)) from e
+
+ self.name: str = parsed.name
+ self.url: str | None = parsed.url or None
+ self.extras: set[str] = set(parsed.extras or [])
+ self.specifier: SpecifierSet = SpecifierSet(parsed.specifier)
+ self.marker: Marker | None = None
+ if parsed.marker is not None:
+ self.marker = Marker.__new__(Marker)
+ self.marker._markers = _normalize_extra_values(parsed.marker)
+
+ def _iter_parts(self, name: str) -> Iterator[str]:
+ yield name
if self.extras:
formatted_extras = ",".join(sorted(self.extras))
- parts.append(f"[{formatted_extras}]")
+ yield f"[{formatted_extras}]"
if self.specifier:
- parts.append(str(self.specifier))
+ yield str(self.specifier)
if self.url:
- parts.append(f"@ {self.url}")
+ yield f"@ {self.url}"
if self.marker:
- parts.append(" ")
+ yield " "
if self.marker:
- parts.append(f"; {self.marker}")
+ yield f"; {self.marker}"
- return "".join(parts)
+ def __str__(self) -> str:
+ return "".join(self._iter_parts(self.name))
def __repr__(self) -> str:
return f"<Requirement('{self}')>"
+
+ def __hash__(self) -> int:
+ return hash(
+ (
+ self.__class__.__name__,
+ *self._iter_parts(canonicalize_name(self.name)),
+ )
+ )
+
+ def __eq__(self, other: Any) -> bool:
+ if not isinstance(other, Requirement):
+ return NotImplemented
+
+ return (
+ canonicalize_name(self.name) == canonicalize_name(other.name)
+ and self.extras == other.extras
+ and self.specifier == other.specifier
+ and self.url == other.url
+ and self.marker == other.marker
+ )
diff --git a/contrib/python/pip/pip/_vendor/packaging/specifiers.py b/contrib/python/pip/pip/_vendor/packaging/specifiers.py
index 0e218a6f9f..f3ac480fa6 100644
--- a/contrib/python/pip/pip/_vendor/packaging/specifiers.py
+++ b/contrib/python/pip/pip/_vendor/packaging/specifiers.py
@@ -1,38 +1,43 @@
# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
+"""
+.. testsetup::
+
+ from pip._vendor.packaging.specifiers import Specifier, SpecifierSet, InvalidSpecifier
+ from pip._vendor.packaging.version import Version
+"""
+
+from __future__ import annotations
import abc
-import functools
import itertools
import re
-import warnings
-from typing import (
- Callable,
- Dict,
- Iterable,
- Iterator,
- List,
- Optional,
- Pattern,
- Set,
- Tuple,
- TypeVar,
- Union,
-)
+from typing import Callable, Iterable, Iterator, TypeVar, Union
from .utils import canonicalize_version
-from .version import LegacyVersion, Version, parse
+from .version import Version
+
+UnparsedVersion = Union[Version, str]
+UnparsedVersionVar = TypeVar("UnparsedVersionVar", bound=UnparsedVersion)
+CallableOperator = Callable[[Version, str], bool]
+
-ParsedVersion = Union[Version, LegacyVersion]
-UnparsedVersion = Union[Version, LegacyVersion, str]
-VersionTypeVar = TypeVar("VersionTypeVar", bound=UnparsedVersion)
-CallableOperator = Callable[[ParsedVersion, str], bool]
+def _coerce_version(version: UnparsedVersion) -> Version:
+ if not isinstance(version, Version):
+ version = Version(version)
+ return version
class InvalidSpecifier(ValueError):
"""
- An invalid specifier was found, users should refer to PEP 440.
+ Raised when attempting to create a :class:`Specifier` with a specifier
+ string that is invalid.
+
+ >>> Specifier("lolwat")
+ Traceback (most recent call last):
+ ...
+ packaging.specifiers.InvalidSpecifier: Invalid specifier: 'lolwat'
"""
@@ -40,266 +45,71 @@ class BaseSpecifier(metaclass=abc.ABCMeta):
@abc.abstractmethod
def __str__(self) -> str:
"""
- Returns the str representation of this Specifier like object. This
+ Returns the str representation of this Specifier-like object. This
should be representative of the Specifier itself.
"""
@abc.abstractmethod
def __hash__(self) -> int:
"""
- Returns a hash value for this Specifier like object.
+ Returns a hash value for this Specifier-like object.
"""
@abc.abstractmethod
def __eq__(self, other: object) -> bool:
"""
- Returns a boolean representing whether or not the two Specifier like
+ Returns a boolean representing whether or not the two Specifier-like
objects are equal.
- """
- @abc.abstractproperty
- def prereleases(self) -> Optional[bool]:
+ :param other: The other object to check against.
"""
- Returns whether or not pre-releases as a whole are allowed by this
- specifier.
+
+ @property
+ @abc.abstractmethod
+ def prereleases(self) -> bool | None:
+ """Whether or not pre-releases as a whole are allowed.
+
+ This can be set to either ``True`` or ``False`` to explicitly enable or disable
+ prereleases or it can be set to ``None`` (the default) to use default semantics.
"""
@prereleases.setter
def prereleases(self, value: bool) -> None:
- """
- Sets whether or not pre-releases as a whole are allowed by this
- specifier.
+ """Setter for :attr:`prereleases`.
+
+ :param value: The value to set.
"""
@abc.abstractmethod
- def contains(self, item: str, prereleases: Optional[bool] = None) -> bool:
+ def contains(self, item: str, prereleases: bool | None = None) -> bool:
"""
Determines if the given item is contained within this specifier.
"""
@abc.abstractmethod
def filter(
- self, iterable: Iterable[VersionTypeVar], prereleases: Optional[bool] = None
- ) -> Iterable[VersionTypeVar]:
+ self, iterable: Iterable[UnparsedVersionVar], prereleases: bool | None = None
+ ) -> Iterator[UnparsedVersionVar]:
"""
Takes an iterable of items and filters them so that only items which
are contained within this specifier are allowed in it.
"""
-class _IndividualSpecifier(BaseSpecifier):
-
- _operators: Dict[str, str] = {}
- _regex: Pattern[str]
-
- def __init__(self, spec: str = "", prereleases: Optional[bool] = None) -> None:
- match = self._regex.search(spec)
- if not match:
- raise InvalidSpecifier(f"Invalid specifier: '{spec}'")
-
- self._spec: Tuple[str, str] = (
- match.group("operator").strip(),
- match.group("version").strip(),
- )
-
- # Store whether or not this Specifier should accept prereleases
- self._prereleases = prereleases
-
- def __repr__(self) -> str:
- pre = (
- f", prereleases={self.prereleases!r}"
- if self._prereleases is not None
- else ""
- )
-
- return f"<{self.__class__.__name__}({str(self)!r}{pre})>"
-
- def __str__(self) -> str:
- return "{}{}".format(*self._spec)
-
- @property
- def _canonical_spec(self) -> Tuple[str, str]:
- return self._spec[0], canonicalize_version(self._spec[1])
-
- def __hash__(self) -> int:
- return hash(self._canonical_spec)
-
- def __eq__(self, other: object) -> bool:
- if isinstance(other, str):
- try:
- other = self.__class__(str(other))
- except InvalidSpecifier:
- return NotImplemented
- elif not isinstance(other, self.__class__):
- return NotImplemented
-
- return self._canonical_spec == other._canonical_spec
-
- def _get_operator(self, op: str) -> CallableOperator:
- operator_callable: CallableOperator = getattr(
- self, f"_compare_{self._operators[op]}"
- )
- return operator_callable
-
- def _coerce_version(self, version: UnparsedVersion) -> ParsedVersion:
- if not isinstance(version, (LegacyVersion, Version)):
- version = parse(version)
- return version
-
- @property
- def operator(self) -> str:
- return self._spec[0]
-
- @property
- def version(self) -> str:
- return self._spec[1]
-
- @property
- def prereleases(self) -> Optional[bool]:
- return self._prereleases
-
- @prereleases.setter
- def prereleases(self, value: bool) -> None:
- self._prereleases = value
-
- def __contains__(self, item: str) -> bool:
- return self.contains(item)
-
- def contains(
- self, item: UnparsedVersion, prereleases: Optional[bool] = None
- ) -> bool:
-
- # Determine if prereleases are to be allowed or not.
- if prereleases is None:
- prereleases = self.prereleases
-
- # Normalize item to a Version or LegacyVersion, this allows us to have
- # a shortcut for ``"2.0" in Specifier(">=2")
- normalized_item = self._coerce_version(item)
-
- # Determine if we should be supporting prereleases in this specifier
- # or not, if we do not support prereleases than we can short circuit
- # logic if this version is a prereleases.
- if normalized_item.is_prerelease and not prereleases:
- return False
-
- # Actually do the comparison to determine if this item is contained
- # within this Specifier or not.
- operator_callable: CallableOperator = self._get_operator(self.operator)
- return operator_callable(normalized_item, self.version)
-
- def filter(
- self, iterable: Iterable[VersionTypeVar], prereleases: Optional[bool] = None
- ) -> Iterable[VersionTypeVar]:
-
- yielded = False
- found_prereleases = []
-
- kw = {"prereleases": prereleases if prereleases is not None else True}
-
- # Attempt to iterate over all the values in the iterable and if any of
- # them match, yield them.
- for version in iterable:
- parsed_version = self._coerce_version(version)
-
- if self.contains(parsed_version, **kw):
- # If our version is a prerelease, and we were not set to allow
- # prereleases, then we'll store it for later in case nothing
- # else matches this specifier.
- if parsed_version.is_prerelease and not (
- prereleases or self.prereleases
- ):
- found_prereleases.append(version)
- # Either this is not a prerelease, or we should have been
- # accepting prereleases from the beginning.
- else:
- yielded = True
- yield version
-
- # Now that we've iterated over everything, determine if we've yielded
- # any values, and if we have not and we have any prereleases stored up
- # then we will go ahead and yield the prereleases.
- if not yielded and found_prereleases:
- for version in found_prereleases:
- yield version
-
-
-class LegacySpecifier(_IndividualSpecifier):
-
- _regex_str = r"""
- (?P<operator>(==|!=|<=|>=|<|>))
- \s*
- (?P<version>
- [^,;\s)]* # Since this is a "legacy" specifier, and the version
- # string can be just about anything, we match everything
- # except for whitespace, a semi-colon for marker support,
- # a closing paren since versions can be enclosed in
- # them, and a comma since it's a version separator.
- )
- """
-
- _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)
-
- _operators = {
- "==": "equal",
- "!=": "not_equal",
- "<=": "less_than_equal",
- ">=": "greater_than_equal",
- "<": "less_than",
- ">": "greater_than",
- }
-
- def __init__(self, spec: str = "", prereleases: Optional[bool] = None) -> None:
- super().__init__(spec, prereleases)
-
- warnings.warn(
- "Creating a LegacyVersion has been deprecated and will be "
- "removed in the next major release",
- DeprecationWarning,
- )
-
- def _coerce_version(self, version: UnparsedVersion) -> LegacyVersion:
- if not isinstance(version, LegacyVersion):
- version = LegacyVersion(str(version))
- return version
-
- def _compare_equal(self, prospective: LegacyVersion, spec: str) -> bool:
- return prospective == self._coerce_version(spec)
-
- def _compare_not_equal(self, prospective: LegacyVersion, spec: str) -> bool:
- return prospective != self._coerce_version(spec)
-
- def _compare_less_than_equal(self, prospective: LegacyVersion, spec: str) -> bool:
- return prospective <= self._coerce_version(spec)
-
- def _compare_greater_than_equal(
- self, prospective: LegacyVersion, spec: str
- ) -> bool:
- return prospective >= self._coerce_version(spec)
-
- def _compare_less_than(self, prospective: LegacyVersion, spec: str) -> bool:
- return prospective < self._coerce_version(spec)
-
- def _compare_greater_than(self, prospective: LegacyVersion, spec: str) -> bool:
- return prospective > self._coerce_version(spec)
+class Specifier(BaseSpecifier):
+ """This class abstracts handling of version specifiers.
+ .. tip::
-def _require_version_compare(
- fn: Callable[["Specifier", ParsedVersion, str], bool]
-) -> Callable[["Specifier", ParsedVersion, str], bool]:
- @functools.wraps(fn)
- def wrapped(self: "Specifier", prospective: ParsedVersion, spec: str) -> bool:
- if not isinstance(prospective, Version):
- return False
- return fn(self, prospective, spec)
-
- return wrapped
-
-
-class Specifier(_IndividualSpecifier):
+ It is generally not required to instantiate this manually. You should instead
+ prefer to work with :class:`SpecifierSet` instead, which can parse
+ comma-separated version specifiers (which is what package metadata contains).
+ """
- _regex_str = r"""
+ _operator_regex_str = r"""
(?P<operator>(~=|==|!=|<=|>=|<|>|===))
+ """
+ _version_regex_str = r"""
(?P<version>
(?:
# The identity operators allow for an escape hatch that will
@@ -309,8 +119,10 @@ class Specifier(_IndividualSpecifier):
# but included entirely as an escape hatch.
(?<====) # Only match for the identity operator
\s*
- [^\s]* # We just match everything, except for whitespace
- # since we are only testing for strict identity.
+ [^\s;)]* # The arbitrary version can be just about anything,
+ # we match everything except for whitespace, a
+ # semi-colon for marker support, and a closing paren
+ # since versions can be enclosed in them.
)
|
(?:
@@ -323,23 +135,23 @@ class Specifier(_IndividualSpecifier):
v?
(?:[0-9]+!)? # epoch
[0-9]+(?:\.[0-9]+)* # release
- (?: # pre release
- [-_\.]?
- (a|b|c|rc|alpha|beta|pre|preview)
- [-_\.]?
- [0-9]*
- )?
- (?: # post release
- (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
- )?
- # You cannot use a wild card and a dev or local version
- # together so group them with a | and make them optional.
+ # You cannot use a wild card and a pre-release, post-release, a dev or
+ # local version together so group them with a | and make them optional.
(?:
+ \.\* # Wild card syntax of .*
+ |
+ (?: # pre release
+ [-_\.]?
+ (alpha|beta|preview|pre|a|b|c|rc)
+ [-_\.]?
+ [0-9]*
+ )?
+ (?: # post release
+ (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
+ )?
(?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release
(?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local
- |
- \.\* # Wild card syntax of .*
)?
)
|
@@ -354,7 +166,7 @@ class Specifier(_IndividualSpecifier):
[0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *)
(?: # pre release
[-_\.]?
- (a|b|c|rc|alpha|beta|pre|preview)
+ (alpha|beta|preview|pre|a|b|c|rc)
[-_\.]?
[0-9]*
)?
@@ -379,7 +191,7 @@ class Specifier(_IndividualSpecifier):
[0-9]+(?:\.[0-9]+)* # release
(?: # pre release
[-_\.]?
- (a|b|c|rc|alpha|beta|pre|preview)
+ (alpha|beta|preview|pre|a|b|c|rc)
[-_\.]?
[0-9]*
)?
@@ -391,7 +203,10 @@ class Specifier(_IndividualSpecifier):
)
"""
- _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)
+ _regex = re.compile(
+ r"^\s*" + _operator_regex_str + _version_regex_str + r"\s*$",
+ re.VERBOSE | re.IGNORECASE,
+ )
_operators = {
"~=": "compatible",
@@ -404,9 +219,153 @@ class Specifier(_IndividualSpecifier):
"===": "arbitrary",
}
- @_require_version_compare
- def _compare_compatible(self, prospective: ParsedVersion, spec: str) -> bool:
+ def __init__(self, spec: str = "", prereleases: bool | None = None) -> None:
+ """Initialize a Specifier instance.
+
+ :param spec:
+ The string representation of a specifier which will be parsed and
+ normalized before use.
+ :param prereleases:
+ This tells the specifier if it should accept prerelease versions if
+ applicable or not. The default of ``None`` will autodetect it from the
+ given specifiers.
+ :raises InvalidSpecifier:
+ If the given specifier is invalid (i.e. bad syntax).
+ """
+ match = self._regex.search(spec)
+ if not match:
+ raise InvalidSpecifier(f"Invalid specifier: '{spec}'")
+
+ self._spec: tuple[str, str] = (
+ match.group("operator").strip(),
+ match.group("version").strip(),
+ )
+
+ # Store whether or not this Specifier should accept prereleases
+ self._prereleases = prereleases
+
+ # https://github.com/python/mypy/pull/13475#pullrequestreview-1079784515
+ @property # type: ignore[override]
+ def prereleases(self) -> bool:
+ # If there is an explicit prereleases set for this, then we'll just
+ # blindly use that.
+ if self._prereleases is not None:
+ return self._prereleases
+
+ # Look at all of our specifiers and determine if they are inclusive
+ # operators, and if they are if they are including an explicit
+ # prerelease.
+ operator, version = self._spec
+ if operator in ["==", ">=", "<=", "~=", "==="]:
+ # The == specifier can include a trailing .*, if it does we
+ # want to remove before parsing.
+ if operator == "==" and version.endswith(".*"):
+ version = version[:-2]
+
+ # Parse the version, and if it is a pre-release than this
+ # specifier allows pre-releases.
+ if Version(version).is_prerelease:
+ return True
+
+ return False
+
+ @prereleases.setter
+ def prereleases(self, value: bool) -> None:
+ self._prereleases = value
+
+ @property
+ def operator(self) -> str:
+ """The operator of this specifier.
+
+ >>> Specifier("==1.2.3").operator
+ '=='
+ """
+ return self._spec[0]
+
+ @property
+ def version(self) -> str:
+ """The version of this specifier.
+
+ >>> Specifier("==1.2.3").version
+ '1.2.3'
+ """
+ return self._spec[1]
+ def __repr__(self) -> str:
+ """A representation of the Specifier that shows all internal state.
+
+ >>> Specifier('>=1.0.0')
+ <Specifier('>=1.0.0')>
+ >>> Specifier('>=1.0.0', prereleases=False)
+ <Specifier('>=1.0.0', prereleases=False)>
+ >>> Specifier('>=1.0.0', prereleases=True)
+ <Specifier('>=1.0.0', prereleases=True)>
+ """
+ pre = (
+ f", prereleases={self.prereleases!r}"
+ if self._prereleases is not None
+ else ""
+ )
+
+ return f"<{self.__class__.__name__}({str(self)!r}{pre})>"
+
+ def __str__(self) -> str:
+ """A string representation of the Specifier that can be round-tripped.
+
+ >>> str(Specifier('>=1.0.0'))
+ '>=1.0.0'
+ >>> str(Specifier('>=1.0.0', prereleases=False))
+ '>=1.0.0'
+ """
+ return "{}{}".format(*self._spec)
+
+ @property
+ def _canonical_spec(self) -> tuple[str, str]:
+ canonical_version = canonicalize_version(
+ self._spec[1],
+ strip_trailing_zero=(self._spec[0] != "~="),
+ )
+ return self._spec[0], canonical_version
+
+ def __hash__(self) -> int:
+ return hash(self._canonical_spec)
+
+ def __eq__(self, other: object) -> bool:
+ """Whether or not the two Specifier-like objects are equal.
+
+ :param other: The other object to check against.
+
+ The value of :attr:`prereleases` is ignored.
+
+ >>> Specifier("==1.2.3") == Specifier("== 1.2.3.0")
+ True
+ >>> (Specifier("==1.2.3", prereleases=False) ==
+ ... Specifier("==1.2.3", prereleases=True))
+ True
+ >>> Specifier("==1.2.3") == "==1.2.3"
+ True
+ >>> Specifier("==1.2.3") == Specifier("==1.2.4")
+ False
+ >>> Specifier("==1.2.3") == Specifier("~=1.2.3")
+ False
+ """
+ if isinstance(other, str):
+ try:
+ other = self.__class__(str(other))
+ except InvalidSpecifier:
+ return NotImplemented
+ elif not isinstance(other, self.__class__):
+ return NotImplemented
+
+ return self._canonical_spec == other._canonical_spec
+
+ def _get_operator(self, op: str) -> CallableOperator:
+ operator_callable: CallableOperator = getattr(
+ self, f"_compare_{self._operators[op]}"
+ )
+ return operator_callable
+
+ def _compare_compatible(self, prospective: Version, spec: str) -> bool:
# Compatible releases have an equivalent combination of >= and ==. That
# is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to
# implement this in terms of the other specifiers instead of
@@ -415,7 +374,7 @@ class Specifier(_IndividualSpecifier):
# We want everything but the last item in the version, but we want to
# ignore suffix segments.
- prefix = ".".join(
+ prefix = _version_join(
list(itertools.takewhile(_is_not_suffix, _version_split(spec)))[:-1]
)
@@ -426,34 +385,34 @@ class Specifier(_IndividualSpecifier):
prospective, prefix
)
- @_require_version_compare
- def _compare_equal(self, prospective: ParsedVersion, spec: str) -> bool:
-
+ def _compare_equal(self, prospective: Version, spec: str) -> bool:
# We need special logic to handle prefix matching
if spec.endswith(".*"):
# In the case of prefix matching we want to ignore local segment.
- prospective = Version(prospective.public)
- # Split the spec out by dots, and pretend that there is an implicit
- # dot in between a release segment and a pre-release segment.
- split_spec = _version_split(spec[:-2]) # Remove the trailing .*
+ normalized_prospective = canonicalize_version(
+ prospective.public, strip_trailing_zero=False
+ )
+ # Get the normalized version string ignoring the trailing .*
+ normalized_spec = canonicalize_version(spec[:-2], strip_trailing_zero=False)
+ # Split the spec out by bangs and dots, and pretend that there is
+ # an implicit dot in between a release segment and a pre-release segment.
+ split_spec = _version_split(normalized_spec)
- # Split the prospective version out by dots, and pretend that there
- # is an implicit dot in between a release segment and a pre-release
- # segment.
- split_prospective = _version_split(str(prospective))
+ # Split the prospective version out by bangs and dots, and pretend
+ # that there is an implicit dot in between a release segment and
+ # a pre-release segment.
+ split_prospective = _version_split(normalized_prospective)
+
+ # 0-pad the prospective version before shortening it to get the correct
+ # shortened version.
+ padded_prospective, _ = _pad_version(split_prospective, split_spec)
# Shorten the prospective version to be the same length as the spec
# so that we can determine if the specifier is a prefix of the
# prospective version or not.
- shortened_prospective = split_prospective[: len(split_spec)]
-
- # Pad out our two sides with zeros so that they both equal the same
- # length.
- padded_spec, padded_prospective = _pad_version(
- split_spec, shortened_prospective
- )
+ shortened_prospective = padded_prospective[: len(split_spec)]
- return padded_prospective == padded_spec
+ return shortened_prospective == split_spec
else:
# Convert our spec string into a Version
spec_version = Version(spec)
@@ -466,31 +425,22 @@ class Specifier(_IndividualSpecifier):
return prospective == spec_version
- @_require_version_compare
- def _compare_not_equal(self, prospective: ParsedVersion, spec: str) -> bool:
+ def _compare_not_equal(self, prospective: Version, spec: str) -> bool:
return not self._compare_equal(prospective, spec)
- @_require_version_compare
- def _compare_less_than_equal(self, prospective: ParsedVersion, spec: str) -> bool:
-
+ def _compare_less_than_equal(self, prospective: Version, spec: str) -> bool:
# NB: Local version identifiers are NOT permitted in the version
# specifier, so local version labels can be universally removed from
# the prospective version.
return Version(prospective.public) <= Version(spec)
- @_require_version_compare
- def _compare_greater_than_equal(
- self, prospective: ParsedVersion, spec: str
- ) -> bool:
-
+ def _compare_greater_than_equal(self, prospective: Version, spec: str) -> bool:
# NB: Local version identifiers are NOT permitted in the version
# specifier, so local version labels can be universally removed from
# the prospective version.
return Version(prospective.public) >= Version(spec)
- @_require_version_compare
- def _compare_less_than(self, prospective: ParsedVersion, spec_str: str) -> bool:
-
+ def _compare_less_than(self, prospective: Version, spec_str: str) -> bool:
# Convert our spec to a Version instance, since we'll want to work with
# it as a version.
spec = Version(spec_str)
@@ -514,9 +464,7 @@ class Specifier(_IndividualSpecifier):
# version in the spec.
return True
- @_require_version_compare
- def _compare_greater_than(self, prospective: ParsedVersion, spec_str: str) -> bool:
-
+ def _compare_greater_than(self, prospective: Version, spec_str: str) -> bool:
# Convert our spec to a Version instance, since we'll want to work with
# it as a version.
spec = Version(spec_str)
@@ -549,42 +497,150 @@ class Specifier(_IndividualSpecifier):
def _compare_arbitrary(self, prospective: Version, spec: str) -> bool:
return str(prospective).lower() == str(spec).lower()
- @property
- def prereleases(self) -> bool:
+ def __contains__(self, item: str | Version) -> bool:
+ """Return whether or not the item is contained in this specifier.
- # If there is an explicit prereleases set for this, then we'll just
- # blindly use that.
- if self._prereleases is not None:
- return self._prereleases
+ :param item: The item to check for.
- # Look at all of our specifiers and determine if they are inclusive
- # operators, and if they are if they are including an explicit
- # prerelease.
- operator, version = self._spec
- if operator in ["==", ">=", "<=", "~=", "==="]:
- # The == specifier can include a trailing .*, if it does we
- # want to remove before parsing.
- if operator == "==" and version.endswith(".*"):
- version = version[:-2]
+ This is used for the ``in`` operator and behaves the same as
+ :meth:`contains` with no ``prereleases`` argument passed.
- # Parse the version, and if it is a pre-release than this
- # specifier allows pre-releases.
- if parse(version).is_prerelease:
- return True
+ >>> "1.2.3" in Specifier(">=1.2.3")
+ True
+ >>> Version("1.2.3") in Specifier(">=1.2.3")
+ True
+ >>> "1.0.0" in Specifier(">=1.2.3")
+ False
+ >>> "1.3.0a1" in Specifier(">=1.2.3")
+ False
+ >>> "1.3.0a1" in Specifier(">=1.2.3", prereleases=True)
+ True
+ """
+ return self.contains(item)
- return False
+ def contains(self, item: UnparsedVersion, prereleases: bool | None = None) -> bool:
+ """Return whether or not the item is contained in this specifier.
+
+ :param item:
+ The item to check for, which can be a version string or a
+ :class:`Version` instance.
+ :param prereleases:
+ Whether or not to match prereleases with this Specifier. If set to
+ ``None`` (the default), it uses :attr:`prereleases` to determine
+ whether or not prereleases are allowed.
+
+ >>> Specifier(">=1.2.3").contains("1.2.3")
+ True
+ >>> Specifier(">=1.2.3").contains(Version("1.2.3"))
+ True
+ >>> Specifier(">=1.2.3").contains("1.0.0")
+ False
+ >>> Specifier(">=1.2.3").contains("1.3.0a1")
+ False
+ >>> Specifier(">=1.2.3", prereleases=True).contains("1.3.0a1")
+ True
+ >>> Specifier(">=1.2.3").contains("1.3.0a1", prereleases=True)
+ True
+ """
- @prereleases.setter
- def prereleases(self, value: bool) -> None:
- self._prereleases = value
+ # Determine if prereleases are to be allowed or not.
+ if prereleases is None:
+ prereleases = self.prereleases
+
+ # Normalize item to a Version, this allows us to have a shortcut for
+ # "2.0" in Specifier(">=2")
+ normalized_item = _coerce_version(item)
+
+ # Determine if we should be supporting prereleases in this specifier
+ # or not, if we do not support prereleases than we can short circuit
+ # logic if this version is a prereleases.
+ if normalized_item.is_prerelease and not prereleases:
+ return False
+
+ # Actually do the comparison to determine if this item is contained
+ # within this Specifier or not.
+ operator_callable: CallableOperator = self._get_operator(self.operator)
+ return operator_callable(normalized_item, self.version)
+
+ def filter(
+ self, iterable: Iterable[UnparsedVersionVar], prereleases: bool | None = None
+ ) -> Iterator[UnparsedVersionVar]:
+ """Filter items in the given iterable, that match the specifier.
+
+ :param iterable:
+ An iterable that can contain version strings and :class:`Version` instances.
+ The items in the iterable will be filtered according to the specifier.
+ :param prereleases:
+ Whether or not to allow prereleases in the returned iterator. If set to
+ ``None`` (the default), it will be intelligently decide whether to allow
+ prereleases or not (based on the :attr:`prereleases` attribute, and
+ whether the only versions matching are prereleases).
+
+ This method is smarter than just ``filter(Specifier().contains, [...])``
+ because it implements the rule from :pep:`440` that a prerelease item
+ SHOULD be accepted if no other versions match the given specifier.
+
+ >>> list(Specifier(">=1.2.3").filter(["1.2", "1.3", "1.5a1"]))
+ ['1.3']
+ >>> list(Specifier(">=1.2.3").filter(["1.2", "1.2.3", "1.3", Version("1.4")]))
+ ['1.2.3', '1.3', <Version('1.4')>]
+ >>> list(Specifier(">=1.2.3").filter(["1.2", "1.5a1"]))
+ ['1.5a1']
+ >>> list(Specifier(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True))
+ ['1.3', '1.5a1']
+ >>> list(Specifier(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"]))
+ ['1.3', '1.5a1']
+ """
+
+ yielded = False
+ found_prereleases = []
+
+ kw = {"prereleases": prereleases if prereleases is not None else True}
+
+ # Attempt to iterate over all the values in the iterable and if any of
+ # them match, yield them.
+ for version in iterable:
+ parsed_version = _coerce_version(version)
+
+ if self.contains(parsed_version, **kw):
+ # If our version is a prerelease, and we were not set to allow
+ # prereleases, then we'll store it for later in case nothing
+ # else matches this specifier.
+ if parsed_version.is_prerelease and not (
+ prereleases or self.prereleases
+ ):
+ found_prereleases.append(version)
+ # Either this is not a prerelease, or we should have been
+ # accepting prereleases from the beginning.
+ else:
+ yielded = True
+ yield version
+
+ # Now that we've iterated over everything, determine if we've yielded
+ # any values, and if we have not and we have any prereleases stored up
+ # then we will go ahead and yield the prereleases.
+ if not yielded and found_prereleases:
+ for version in found_prereleases:
+ yield version
_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$")
-def _version_split(version: str) -> List[str]:
- result: List[str] = []
- for item in version.split("."):
+def _version_split(version: str) -> list[str]:
+ """Split version into components.
+
+ The split components are intended for version comparison. The logic does
+ not attempt to retain the original version string, so joining the
+ components back with :func:`_version_join` may not produce the original
+ version string.
+ """
+ result: list[str] = []
+
+ epoch, _, rest = version.rpartition("!")
+ result.append(epoch or "0")
+
+ for item in rest.split("."):
match = _prefix_regex.search(item)
if match:
result.extend(match.groups())
@@ -593,13 +649,24 @@ def _version_split(version: str) -> List[str]:
return result
+def _version_join(components: list[str]) -> str:
+ """Join split version components into a version string.
+
+ This function assumes the input came from :func:`_version_split`, where the
+ first component must be the epoch (either empty or numeric), and all other
+ components numeric.
+ """
+ epoch, *rest = components
+ return f"{epoch}!{'.'.join(rest)}"
+
+
def _is_not_suffix(segment: str) -> bool:
return not any(
segment.startswith(prefix) for prefix in ("dev", "a", "b", "rc", "post")
)
-def _pad_version(left: List[str], right: List[str]) -> Tuple[List[str], List[str]]:
+def _pad_version(left: list[str], right: list[str]) -> tuple[list[str], list[str]]:
left_split, right_split = [], []
# Get the release segment of our versions
@@ -614,35 +681,80 @@ def _pad_version(left: List[str], right: List[str]) -> Tuple[List[str], List[str
left_split.insert(1, ["0"] * max(0, len(right_split[0]) - len(left_split[0])))
right_split.insert(1, ["0"] * max(0, len(left_split[0]) - len(right_split[0])))
- return (list(itertools.chain(*left_split)), list(itertools.chain(*right_split)))
+ return (
+ list(itertools.chain.from_iterable(left_split)),
+ list(itertools.chain.from_iterable(right_split)),
+ )
class SpecifierSet(BaseSpecifier):
- def __init__(
- self, specifiers: str = "", prereleases: Optional[bool] = None
- ) -> None:
+ """This class abstracts handling of a set of version specifiers.
+
+ It can be passed a single specifier (``>=3.0``), a comma-separated list of
+ specifiers (``>=3.0,!=3.1``), or no specifier at all.
+ """
+
+ def __init__(self, specifiers: str = "", prereleases: bool | None = None) -> None:
+ """Initialize a SpecifierSet instance.
+
+ :param specifiers:
+ The string representation of a specifier or a comma-separated list of
+ specifiers which will be parsed and normalized before use.
+ :param prereleases:
+ This tells the SpecifierSet if it should accept prerelease versions if
+ applicable or not. The default of ``None`` will autodetect it from the
+ given specifiers.
+
+ :raises InvalidSpecifier:
+ If the given ``specifiers`` are not parseable than this exception will be
+ raised.
+ """
- # Split on , to break each individual specifier into it's own item, and
+ # Split on `,` to break each individual specifier into it's own item, and
# strip each item to remove leading/trailing whitespace.
split_specifiers = [s.strip() for s in specifiers.split(",") if s.strip()]
- # Parsed each individual specifier, attempting first to make it a
- # Specifier and falling back to a LegacySpecifier.
- parsed: Set[_IndividualSpecifier] = set()
- for specifier in split_specifiers:
- try:
- parsed.add(Specifier(specifier))
- except InvalidSpecifier:
- parsed.add(LegacySpecifier(specifier))
-
- # Turn our parsed specifiers into a frozen set and save them for later.
- self._specs = frozenset(parsed)
+ # Make each individual specifier a Specifier and save in a frozen set for later.
+ self._specs = frozenset(map(Specifier, split_specifiers))
# Store our prereleases value so we can use it later to determine if
# we accept prereleases or not.
self._prereleases = prereleases
+ @property
+ def prereleases(self) -> bool | None:
+ # If we have been given an explicit prerelease modifier, then we'll
+ # pass that through here.
+ if self._prereleases is not None:
+ return self._prereleases
+
+ # If we don't have any specifiers, and we don't have a forced value,
+ # then we'll just return None since we don't know if this should have
+ # pre-releases or not.
+ if not self._specs:
+ return None
+
+ # Otherwise we'll see if any of the given specifiers accept
+ # prereleases, if any of them do we'll return True, otherwise False.
+ return any(s.prereleases for s in self._specs)
+
+ @prereleases.setter
+ def prereleases(self, value: bool) -> None:
+ self._prereleases = value
+
def __repr__(self) -> str:
+ """A representation of the specifier set that shows all internal state.
+
+ Note that the ordering of the individual specifiers within the set may not
+ match the input string.
+
+ >>> SpecifierSet('>=1.0.0,!=2.0.0')
+ <SpecifierSet('!=2.0.0,>=1.0.0')>
+ >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=False)
+ <SpecifierSet('!=2.0.0,>=1.0.0', prereleases=False)>
+ >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=True)
+ <SpecifierSet('!=2.0.0,>=1.0.0', prereleases=True)>
+ """
pre = (
f", prereleases={self.prereleases!r}"
if self._prereleases is not None
@@ -652,12 +764,31 @@ class SpecifierSet(BaseSpecifier):
return f"<SpecifierSet({str(self)!r}{pre})>"
def __str__(self) -> str:
+ """A string representation of the specifier set that can be round-tripped.
+
+ Note that the ordering of the individual specifiers within the set may not
+ match the input string.
+
+ >>> str(SpecifierSet(">=1.0.0,!=1.0.1"))
+ '!=1.0.1,>=1.0.0'
+ >>> str(SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False))
+ '!=1.0.1,>=1.0.0'
+ """
return ",".join(sorted(str(s) for s in self._specs))
def __hash__(self) -> int:
return hash(self._specs)
- def __and__(self, other: Union["SpecifierSet", str]) -> "SpecifierSet":
+ def __and__(self, other: SpecifierSet | str) -> SpecifierSet:
+ """Return a SpecifierSet which is a combination of the two sets.
+
+ :param other: The other object to combine with.
+
+ >>> SpecifierSet(">=1.0.0,!=1.0.1") & '<=2.0.0,!=2.0.1'
+ <SpecifierSet('!=1.0.1,!=2.0.1,<=2.0.0,>=1.0.0')>
+ >>> SpecifierSet(">=1.0.0,!=1.0.1") & SpecifierSet('<=2.0.0,!=2.0.1')
+ <SpecifierSet('!=1.0.1,!=2.0.1,<=2.0.0,>=1.0.0')>
+ """
if isinstance(other, str):
other = SpecifierSet(other)
elif not isinstance(other, SpecifierSet):
@@ -681,7 +812,25 @@ class SpecifierSet(BaseSpecifier):
return specifier
def __eq__(self, other: object) -> bool:
- if isinstance(other, (str, _IndividualSpecifier)):
+ """Whether or not the two SpecifierSet-like objects are equal.
+
+ :param other: The other object to check against.
+
+ The value of :attr:`prereleases` is ignored.
+
+ >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.1")
+ True
+ >>> (SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False) ==
+ ... SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True))
+ True
+ >>> SpecifierSet(">=1.0.0,!=1.0.1") == ">=1.0.0,!=1.0.1"
+ True
+ >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0")
+ False
+ >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.2")
+ False
+ """
+ if isinstance(other, (str, Specifier)):
other = SpecifierSet(str(other))
elif not isinstance(other, SpecifierSet):
return NotImplemented
@@ -689,43 +838,72 @@ class SpecifierSet(BaseSpecifier):
return self._specs == other._specs
def __len__(self) -> int:
+ """Returns the number of specifiers in this specifier set."""
return len(self._specs)
- def __iter__(self) -> Iterator[_IndividualSpecifier]:
- return iter(self._specs)
-
- @property
- def prereleases(self) -> Optional[bool]:
-
- # If we have been given an explicit prerelease modifier, then we'll
- # pass that through here.
- if self._prereleases is not None:
- return self._prereleases
-
- # If we don't have any specifiers, and we don't have a forced value,
- # then we'll just return None since we don't know if this should have
- # pre-releases or not.
- if not self._specs:
- return None
-
- # Otherwise we'll see if any of the given specifiers accept
- # prereleases, if any of them do we'll return True, otherwise False.
- return any(s.prereleases for s in self._specs)
+ def __iter__(self) -> Iterator[Specifier]:
+ """
+ Returns an iterator over all the underlying :class:`Specifier` instances
+ in this specifier set.
- @prereleases.setter
- def prereleases(self, value: bool) -> None:
- self._prereleases = value
+ >>> sorted(SpecifierSet(">=1.0.0,!=1.0.1"), key=str)
+ [<Specifier('!=1.0.1')>, <Specifier('>=1.0.0')>]
+ """
+ return iter(self._specs)
def __contains__(self, item: UnparsedVersion) -> bool:
+ """Return whether or not the item is contained in this specifier.
+
+ :param item: The item to check for.
+
+ This is used for the ``in`` operator and behaves the same as
+ :meth:`contains` with no ``prereleases`` argument passed.
+
+ >>> "1.2.3" in SpecifierSet(">=1.0.0,!=1.0.1")
+ True
+ >>> Version("1.2.3") in SpecifierSet(">=1.0.0,!=1.0.1")
+ True
+ >>> "1.0.1" in SpecifierSet(">=1.0.0,!=1.0.1")
+ False
+ >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1")
+ False
+ >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True)
+ True
+ """
return self.contains(item)
def contains(
- self, item: UnparsedVersion, prereleases: Optional[bool] = None
+ self,
+ item: UnparsedVersion,
+ prereleases: bool | None = None,
+ installed: bool | None = None,
) -> bool:
-
- # Ensure that our item is a Version or LegacyVersion instance.
- if not isinstance(item, (LegacyVersion, Version)):
- item = parse(item)
+ """Return whether or not the item is contained in this SpecifierSet.
+
+ :param item:
+ The item to check for, which can be a version string or a
+ :class:`Version` instance.
+ :param prereleases:
+ Whether or not to match prereleases with this SpecifierSet. If set to
+ ``None`` (the default), it uses :attr:`prereleases` to determine
+ whether or not prereleases are allowed.
+
+ >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.2.3")
+ True
+ >>> SpecifierSet(">=1.0.0,!=1.0.1").contains(Version("1.2.3"))
+ True
+ >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.0.1")
+ False
+ >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1")
+ False
+ >>> SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True).contains("1.3.0a1")
+ True
+ >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1", prereleases=True)
+ True
+ """
+ # Ensure that our item is a Version instance.
+ if not isinstance(item, Version):
+ item = Version(item)
# Determine if we're forcing a prerelease or not, if we're not forcing
# one for this particular filter call, then we'll use whatever the
@@ -742,6 +920,9 @@ class SpecifierSet(BaseSpecifier):
if not prereleases and item.is_prerelease:
return False
+ if installed and item.is_prerelease:
+ item = Version(item.base_version)
+
# We simply dispatch to the underlying specs here to make sure that the
# given version is contained within all of them.
# Note: This use of all() here means that an empty set of specifiers
@@ -749,9 +930,46 @@ class SpecifierSet(BaseSpecifier):
return all(s.contains(item, prereleases=prereleases) for s in self._specs)
def filter(
- self, iterable: Iterable[VersionTypeVar], prereleases: Optional[bool] = None
- ) -> Iterable[VersionTypeVar]:
-
+ self, iterable: Iterable[UnparsedVersionVar], prereleases: bool | None = None
+ ) -> Iterator[UnparsedVersionVar]:
+ """Filter items in the given iterable, that match the specifiers in this set.
+
+ :param iterable:
+ An iterable that can contain version strings and :class:`Version` instances.
+ The items in the iterable will be filtered according to the specifier.
+ :param prereleases:
+ Whether or not to allow prereleases in the returned iterator. If set to
+ ``None`` (the default), it will be intelligently decide whether to allow
+ prereleases or not (based on the :attr:`prereleases` attribute, and
+ whether the only versions matching are prereleases).
+
+ This method is smarter than just ``filter(SpecifierSet(...).contains, [...])``
+ because it implements the rule from :pep:`440` that a prerelease item
+ SHOULD be accepted if no other versions match the given specifier.
+
+ >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", "1.5a1"]))
+ ['1.3']
+ >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", Version("1.4")]))
+ ['1.3', <Version('1.4')>]
+ >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.5a1"]))
+ []
+ >>> list(SpecifierSet(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True))
+ ['1.3', '1.5a1']
+ >>> list(SpecifierSet(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"]))
+ ['1.3', '1.5a1']
+
+ An "empty" SpecifierSet will filter items based on the presence of prerelease
+ versions in the set.
+
+ >>> list(SpecifierSet("").filter(["1.3", "1.5a1"]))
+ ['1.3']
+ >>> list(SpecifierSet("").filter(["1.5a1"]))
+ ['1.5a1']
+ >>> list(SpecifierSet("", prereleases=True).filter(["1.3", "1.5a1"]))
+ ['1.3', '1.5a1']
+ >>> list(SpecifierSet("").filter(["1.3", "1.5a1"], prereleases=True))
+ ['1.3', '1.5a1']
+ """
# Determine if we're forcing a prerelease or not, if we're not forcing
# one for this particular filter call, then we'll use whatever the
# SpecifierSet thinks for whether or not we should support prereleases.
@@ -764,27 +982,16 @@ class SpecifierSet(BaseSpecifier):
if self._specs:
for spec in self._specs:
iterable = spec.filter(iterable, prereleases=bool(prereleases))
- return iterable
+ return iter(iterable)
# If we do not have any specifiers, then we need to have a rough filter
# which will filter out any pre-releases, unless there are no final
- # releases, and which will filter out LegacyVersion in general.
+ # releases.
else:
- filtered: List[VersionTypeVar] = []
- found_prereleases: List[VersionTypeVar] = []
-
- item: UnparsedVersion
- parsed_version: Union[Version, LegacyVersion]
+ filtered: list[UnparsedVersionVar] = []
+ found_prereleases: list[UnparsedVersionVar] = []
for item in iterable:
- # Ensure that we some kind of Version class for this item.
- if not isinstance(item, (LegacyVersion, Version)):
- parsed_version = parse(item)
- else:
- parsed_version = item
-
- # Filter out any item which is parsed as a LegacyVersion
- if isinstance(parsed_version, LegacyVersion):
- continue
+ parsed_version = _coerce_version(item)
# Store any item which is a pre-release for later unless we've
# already found a final version or we are accepting prereleases
@@ -797,6 +1004,6 @@ class SpecifierSet(BaseSpecifier):
# If we've found no items except for pre-releases, then we'll go
# ahead and use the pre-releases
if not filtered and found_prereleases and prereleases is None:
- return found_prereleases
+ return iter(found_prereleases)
- return filtered
+ return iter(filtered)
diff --git a/contrib/python/pip/pip/_vendor/packaging/tags.py b/contrib/python/pip/pip/_vendor/packaging/tags.py
index 9a3d25a71c..6667d29908 100644
--- a/contrib/python/pip/pip/_vendor/packaging/tags.py
+++ b/contrib/python/pip/pip/_vendor/packaging/tags.py
@@ -2,21 +2,21 @@
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
+from __future__ import annotations
+
import logging
import platform
+import re
+import struct
+import subprocess
import sys
import sysconfig
from importlib.machinery import EXTENSION_SUFFIXES
from typing import (
- Dict,
- FrozenSet,
Iterable,
Iterator,
- List,
- Optional,
Sequence,
Tuple,
- Union,
cast,
)
@@ -27,7 +27,7 @@ logger = logging.getLogger(__name__)
PythonVersion = Sequence[int]
MacVersion = Tuple[int, int]
-INTERPRETER_SHORT_NAMES: Dict[str, str] = {
+INTERPRETER_SHORT_NAMES: dict[str, str] = {
"python": "py", # Generic.
"cpython": "cp",
"pypy": "pp",
@@ -36,7 +36,7 @@ INTERPRETER_SHORT_NAMES: Dict[str, str] = {
}
-_32_BIT_INTERPRETER = sys.maxsize <= 2 ** 32
+_32_BIT_INTERPRETER = struct.calcsize("P") == 4
class Tag:
@@ -93,7 +93,7 @@ class Tag:
return f"<{self} @ {id(self)}>"
-def parse_tag(tag: str) -> FrozenSet[Tag]:
+def parse_tag(tag: str) -> frozenset[Tag]:
"""
Parses the provided tag (e.g. `py3-none-any`) into a frozenset of Tag instances.
@@ -109,8 +109,8 @@ def parse_tag(tag: str) -> FrozenSet[Tag]:
return frozenset(tags)
-def _get_config_var(name: str, warn: bool = False) -> Union[int, str, None]:
- value = sysconfig.get_config_var(name)
+def _get_config_var(name: str, warn: bool = False) -> int | str | None:
+ value: int | str | None = sysconfig.get_config_var(name)
if value is None and warn:
logger.debug(
"Config variable '%s' is unset, Python ABI tag may be incorrect", name
@@ -119,23 +119,40 @@ def _get_config_var(name: str, warn: bool = False) -> Union[int, str, None]:
def _normalize_string(string: str) -> str:
- return string.replace(".", "_").replace("-", "_")
+ return string.replace(".", "_").replace("-", "_").replace(" ", "_")
+
+def _is_threaded_cpython(abis: list[str]) -> bool:
+ """
+ Determine if the ABI corresponds to a threaded (`--disable-gil`) build.
-def _abi3_applies(python_version: PythonVersion) -> bool:
+ The threaded builds are indicated by a "t" in the abiflags.
+ """
+ if len(abis) == 0:
+ return False
+ # expect e.g., cp313
+ m = re.match(r"cp\d+(.*)", abis[0])
+ if not m:
+ return False
+ abiflags = m.group(1)
+ return "t" in abiflags
+
+
+def _abi3_applies(python_version: PythonVersion, threading: bool) -> bool:
"""
Determine if the Python version supports abi3.
- PEP 384 was first implemented in Python 3.2.
+ PEP 384 was first implemented in Python 3.2. The threaded (`--disable-gil`)
+ builds do not support abi3.
"""
- return len(python_version) > 1 and tuple(python_version) >= (3, 2)
+ return len(python_version) > 1 and tuple(python_version) >= (3, 2) and not threading
-def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> List[str]:
+def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> list[str]:
py_version = tuple(py_version) # To allow for version comparison.
abis = []
version = _version_nodot(py_version[:2])
- debug = pymalloc = ucs4 = ""
+ threading = debug = pymalloc = ucs4 = ""
with_debug = _get_config_var("Py_DEBUG", warn)
has_refcount = hasattr(sys, "gettotalrefcount")
# Windows doesn't set Py_DEBUG, so checking for support of debug-compiled
@@ -144,6 +161,8 @@ def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> List[str]:
has_ext = "_d.pyd" in EXTENSION_SUFFIXES
if with_debug or (with_debug is None and (has_refcount or has_ext)):
debug = "d"
+ if py_version >= (3, 13) and _get_config_var("Py_GIL_DISABLED", warn):
+ threading = "t"
if py_version < (3, 8):
with_pymalloc = _get_config_var("WITH_PYMALLOC", warn)
if with_pymalloc or with_pymalloc is None:
@@ -157,20 +176,15 @@ def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> List[str]:
elif debug:
# Debug builds can also load "normal" extension modules.
# We can also assume no UCS-4 or pymalloc requirement.
- abis.append(f"cp{version}")
- abis.insert(
- 0,
- "cp{version}{debug}{pymalloc}{ucs4}".format(
- version=version, debug=debug, pymalloc=pymalloc, ucs4=ucs4
- ),
- )
+ abis.append(f"cp{version}{threading}")
+ abis.insert(0, f"cp{version}{threading}{debug}{pymalloc}{ucs4}")
return abis
def cpython_tags(
- python_version: Optional[PythonVersion] = None,
- abis: Optional[Iterable[str]] = None,
- platforms: Optional[Iterable[str]] = None,
+ python_version: PythonVersion | None = None,
+ abis: Iterable[str] | None = None,
+ platforms: Iterable[str] | None = None,
*,
warn: bool = False,
) -> Iterator[Tag]:
@@ -211,11 +225,14 @@ def cpython_tags(
for abi in abis:
for platform_ in platforms:
yield Tag(interpreter, abi, platform_)
- if _abi3_applies(python_version):
+
+ threading = _is_threaded_cpython(abis)
+ use_abi3 = _abi3_applies(python_version, threading)
+ if use_abi3:
yield from (Tag(interpreter, "abi3", platform_) for platform_ in platforms)
yield from (Tag(interpreter, "none", platform_) for platform_ in platforms)
- if _abi3_applies(python_version):
+ if use_abi3:
for minor_version in range(python_version[1] - 1, 1, -1):
for platform_ in platforms:
interpreter = "cp{version}".format(
@@ -224,16 +241,51 @@ def cpython_tags(
yield Tag(interpreter, "abi3", platform_)
-def _generic_abi() -> Iterator[str]:
- abi = sysconfig.get_config_var("SOABI")
- if abi:
- yield _normalize_string(abi)
+def _generic_abi() -> list[str]:
+ """
+ Return the ABI tag based on EXT_SUFFIX.
+ """
+ # The following are examples of `EXT_SUFFIX`.
+ # We want to keep the parts which are related to the ABI and remove the
+ # parts which are related to the platform:
+ # - linux: '.cpython-310-x86_64-linux-gnu.so' => cp310
+ # - mac: '.cpython-310-darwin.so' => cp310
+ # - win: '.cp310-win_amd64.pyd' => cp310
+ # - win: '.pyd' => cp37 (uses _cpython_abis())
+ # - pypy: '.pypy38-pp73-x86_64-linux-gnu.so' => pypy38_pp73
+ # - graalpy: '.graalpy-38-native-x86_64-darwin.dylib'
+ # => graalpy_38_native
+
+ ext_suffix = _get_config_var("EXT_SUFFIX", warn=True)
+ if not isinstance(ext_suffix, str) or ext_suffix[0] != ".":
+ raise SystemError("invalid sysconfig.get_config_var('EXT_SUFFIX')")
+ parts = ext_suffix.split(".")
+ if len(parts) < 3:
+ # CPython3.7 and earlier uses ".pyd" on Windows.
+ return _cpython_abis(sys.version_info[:2])
+ soabi = parts[1]
+ if soabi.startswith("cpython"):
+ # non-windows
+ abi = "cp" + soabi.split("-")[1]
+ elif soabi.startswith("cp"):
+ # windows
+ abi = soabi.split("-")[0]
+ elif soabi.startswith("pypy"):
+ abi = "-".join(soabi.split("-")[:2])
+ elif soabi.startswith("graalpy"):
+ abi = "-".join(soabi.split("-")[:3])
+ elif soabi:
+ # pyston, ironpython, others?
+ abi = soabi
+ else:
+ return []
+ return [_normalize_string(abi)]
def generic_tags(
- interpreter: Optional[str] = None,
- abis: Optional[Iterable[str]] = None,
- platforms: Optional[Iterable[str]] = None,
+ interpreter: str | None = None,
+ abis: Iterable[str] | None = None,
+ platforms: Iterable[str] | None = None,
*,
warn: bool = False,
) -> Iterator[Tag]:
@@ -251,8 +303,9 @@ def generic_tags(
interpreter = "".join([interp_name, interp_version])
if abis is None:
abis = _generic_abi()
+ else:
+ abis = list(abis)
platforms = list(platforms or platform_tags())
- abis = list(abis)
if "none" not in abis:
abis.append("none")
for abi in abis:
@@ -276,9 +329,9 @@ def _py_interpreter_range(py_version: PythonVersion) -> Iterator[str]:
def compatible_tags(
- python_version: Optional[PythonVersion] = None,
- interpreter: Optional[str] = None,
- platforms: Optional[Iterable[str]] = None,
+ python_version: PythonVersion | None = None,
+ interpreter: str | None = None,
+ platforms: Iterable[str] | None = None,
) -> Iterator[Tag]:
"""
Yields the sequence of tags that are compatible with a specific version of Python.
@@ -310,7 +363,7 @@ def _mac_arch(arch: str, is_32bit: bool = _32_BIT_INTERPRETER) -> str:
return "i386"
-def _mac_binary_formats(version: MacVersion, cpu_arch: str) -> List[str]:
+def _mac_binary_formats(version: MacVersion, cpu_arch: str) -> list[str]:
formats = [cpu_arch]
if cpu_arch == "x86_64":
if version < (10, 4):
@@ -343,7 +396,7 @@ def _mac_binary_formats(version: MacVersion, cpu_arch: str) -> List[str]:
def mac_platforms(
- version: Optional[MacVersion] = None, arch: Optional[str] = None
+ version: MacVersion | None = None, arch: str | None = None
) -> Iterator[str]:
"""
Yields the platform tags for a macOS system.
@@ -356,6 +409,22 @@ def mac_platforms(
version_str, _, cpu_arch = platform.mac_ver()
if version is None:
version = cast("MacVersion", tuple(map(int, version_str.split(".")[:2])))
+ if version == (10, 16):
+ # When built against an older macOS SDK, Python will report macOS 10.16
+ # instead of the real version.
+ version_str = subprocess.run(
+ [
+ sys.executable,
+ "-sS",
+ "-c",
+ "import platform; print(platform.mac_ver()[0])",
+ ],
+ check=True,
+ env={"SYSTEM_VERSION_COMPAT": "0"},
+ stdout=subprocess.PIPE,
+ text=True,
+ ).stdout
+ version = cast("MacVersion", tuple(map(int, version_str.split(".")[:2])))
else:
version = version
if arch is None:
@@ -416,15 +485,21 @@ def mac_platforms(
def _linux_platforms(is_32bit: bool = _32_BIT_INTERPRETER) -> Iterator[str]:
linux = _normalize_string(sysconfig.get_platform())
+ if not linux.startswith("linux_"):
+ # we should never be here, just yield the sysconfig one and return
+ yield linux
+ return
if is_32bit:
if linux == "linux_x86_64":
linux = "linux_i686"
elif linux == "linux_aarch64":
- linux = "linux_armv7l"
+ linux = "linux_armv8l"
_, arch = linux.split("_", 1)
- yield from _manylinux.platform_tags(linux, arch)
- yield from _musllinux.platform_tags(arch)
- yield linux
+ archs = {"armv8l": ["armv8l", "armv7l"]}.get(arch, [arch])
+ yield from _manylinux.platform_tags(archs)
+ yield from _musllinux.platform_tags(archs)
+ for arch in archs:
+ yield f"linux_{arch}"
def _generic_platforms() -> Iterator[str]:
@@ -446,6 +521,9 @@ def platform_tags() -> Iterator[str]:
def interpreter_name() -> str:
"""
Returns the name of the running interpreter.
+
+ Some implementations have a reserved, two-letter abbreviation which will
+ be returned when appropriate.
"""
name = sys.implementation.name
return INTERPRETER_SHORT_NAMES.get(name) or name
@@ -482,6 +560,9 @@ def sys_tags(*, warn: bool = False) -> Iterator[Tag]:
yield from generic_tags()
if interp_name == "pp":
- yield from compatible_tags(interpreter="pp3")
+ interp = "pp3"
+ elif interp_name == "cp":
+ interp = "cp" + interpreter_version(warn=warn)
else:
- yield from compatible_tags()
+ interp = None
+ yield from compatible_tags(interpreter=interp)
diff --git a/contrib/python/pip/pip/_vendor/packaging/utils.py b/contrib/python/pip/pip/_vendor/packaging/utils.py
index bab11b80c6..d33da5bb8b 100644
--- a/contrib/python/pip/pip/_vendor/packaging/utils.py
+++ b/contrib/python/pip/pip/_vendor/packaging/utils.py
@@ -2,8 +2,10 @@
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
+from __future__ import annotations
+
import re
-from typing import FrozenSet, NewType, Tuple, Union, cast
+from typing import NewType, Tuple, Union, cast
from .tags import Tag, parse_tag
from .version import InvalidVersion, Version
@@ -12,6 +14,12 @@ BuildTag = Union[Tuple[()], Tuple[int, str]]
NormalizedName = NewType("NormalizedName", str)
+class InvalidName(ValueError):
+ """
+ An invalid distribution name; users should refer to the packaging user guide.
+ """
+
+
class InvalidWheelFilename(ValueError):
"""
An invalid wheel filename was found, users should refer to PEP 427.
@@ -24,18 +32,31 @@ class InvalidSdistFilename(ValueError):
"""
+# Core metadata spec for `Name`
+_validate_regex = re.compile(
+ r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", re.IGNORECASE
+)
_canonicalize_regex = re.compile(r"[-_.]+")
+_normalized_regex = re.compile(r"^([a-z0-9]|[a-z0-9]([a-z0-9-](?!--))*[a-z0-9])$")
# PEP 427: The build number must start with a digit.
_build_tag_regex = re.compile(r"(\d+)(.*)")
-def canonicalize_name(name: str) -> NormalizedName:
+def canonicalize_name(name: str, *, validate: bool = False) -> NormalizedName:
+ if validate and not _validate_regex.match(name):
+ raise InvalidName(f"name is invalid: {name!r}")
# This is taken from PEP 503.
value = _canonicalize_regex.sub("-", name).lower()
return cast(NormalizedName, value)
-def canonicalize_version(version: Union[Version, str]) -> str:
+def is_normalized_name(name: str) -> bool:
+ return _normalized_regex.match(name) is not None
+
+
+def canonicalize_version(
+ version: Version | str, *, strip_trailing_zero: bool = True
+) -> str:
"""
This is very similar to Version.__str__, but has one subtle difference
with the way it handles the release segment.
@@ -56,8 +77,11 @@ def canonicalize_version(version: Union[Version, str]) -> str:
parts.append(f"{parsed.epoch}!")
# Release segment
- # NB: This strips trailing '.0's to normalize
- parts.append(re.sub(r"(\.0)+$", "", ".".join(str(x) for x in parsed.release)))
+ release_segment = ".".join(str(x) for x in parsed.release)
+ if strip_trailing_zero:
+ # NB: This strips trailing '.0's to normalize
+ release_segment = re.sub(r"(\.0)+$", "", release_segment)
+ parts.append(release_segment)
# Pre-release
if parsed.pre is not None:
@@ -80,7 +104,7 @@ def canonicalize_version(version: Union[Version, str]) -> str:
def parse_wheel_filename(
filename: str,
-) -> Tuple[NormalizedName, Version, BuildTag, FrozenSet[Tag]]:
+) -> tuple[NormalizedName, Version, BuildTag, frozenset[Tag]]:
if not filename.endswith(".whl"):
raise InvalidWheelFilename(
f"Invalid wheel filename (extension must be '.whl'): {filename}"
@@ -95,11 +119,18 @@ def parse_wheel_filename(
parts = filename.split("-", dashes - 2)
name_part = parts[0]
- # See PEP 427 for the rules on escaping the project name
+ # See PEP 427 for the rules on escaping the project name.
if "__" in name_part or re.match(r"^[\w\d._]*$", name_part, re.UNICODE) is None:
raise InvalidWheelFilename(f"Invalid project name: {filename}")
name = canonicalize_name(name_part)
- version = Version(parts[1])
+
+ try:
+ version = Version(parts[1])
+ except InvalidVersion as e:
+ raise InvalidWheelFilename(
+ f"Invalid wheel filename (invalid version): {filename}"
+ ) from e
+
if dashes == 5:
build_part = parts[2]
build_match = _build_tag_regex.match(build_part)
@@ -114,7 +145,7 @@ def parse_wheel_filename(
return (name, version, build, tags)
-def parse_sdist_filename(filename: str) -> Tuple[NormalizedName, Version]:
+def parse_sdist_filename(filename: str) -> tuple[NormalizedName, Version]:
if filename.endswith(".tar.gz"):
file_stem = filename[: -len(".tar.gz")]
elif filename.endswith(".zip"):
@@ -132,5 +163,12 @@ def parse_sdist_filename(filename: str) -> Tuple[NormalizedName, Version]:
raise InvalidSdistFilename(f"Invalid sdist filename: {filename}")
name = canonicalize_name(name_part)
- version = Version(version_part)
+
+ try:
+ version = Version(version_part)
+ except InvalidVersion as e:
+ raise InvalidSdistFilename(
+ f"Invalid sdist filename (invalid version): {filename}"
+ ) from e
+
return (name, version)
diff --git a/contrib/python/pip/pip/_vendor/packaging/version.py b/contrib/python/pip/pip/_vendor/packaging/version.py
index de9a09a4ed..8b0a040848 100644
--- a/contrib/python/pip/pip/_vendor/packaging/version.py
+++ b/contrib/python/pip/pip/_vendor/packaging/version.py
@@ -1,64 +1,73 @@
# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
+"""
+.. testsetup::
+
+ from pip._vendor.packaging.version import parse, Version
+"""
+
+from __future__ import annotations
-import collections
import itertools
import re
-import warnings
-from typing import Callable, Iterator, List, Optional, SupportsInt, Tuple, Union
+from typing import Any, Callable, NamedTuple, SupportsInt, Tuple, Union
from ._structures import Infinity, InfinityType, NegativeInfinity, NegativeInfinityType
-__all__ = ["parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"]
+__all__ = ["VERSION_PATTERN", "parse", "Version", "InvalidVersion"]
+
+LocalType = Tuple[Union[int, str], ...]
-InfiniteTypes = Union[InfinityType, NegativeInfinityType]
-PrePostDevType = Union[InfiniteTypes, Tuple[str, int]]
-SubLocalType = Union[InfiniteTypes, int, str]
-LocalType = Union[
+CmpPrePostDevType = Union[InfinityType, NegativeInfinityType, Tuple[str, int]]
+CmpLocalType = Union[
NegativeInfinityType,
- Tuple[
- Union[
- SubLocalType,
- Tuple[SubLocalType, str],
- Tuple[NegativeInfinityType, SubLocalType],
- ],
- ...,
- ],
+ Tuple[Union[Tuple[int, str], Tuple[NegativeInfinityType, Union[int, str]]], ...],
]
CmpKey = Tuple[
- int, Tuple[int, ...], PrePostDevType, PrePostDevType, PrePostDevType, LocalType
-]
-LegacyCmpKey = Tuple[int, Tuple[str, ...]]
-VersionComparisonMethod = Callable[
- [Union[CmpKey, LegacyCmpKey], Union[CmpKey, LegacyCmpKey]], bool
+ int,
+ Tuple[int, ...],
+ CmpPrePostDevType,
+ CmpPrePostDevType,
+ CmpPrePostDevType,
+ CmpLocalType,
]
+VersionComparisonMethod = Callable[[CmpKey, CmpKey], bool]
-_Version = collections.namedtuple(
- "_Version", ["epoch", "release", "dev", "pre", "post", "local"]
-)
+class _Version(NamedTuple):
+ epoch: int
+ release: tuple[int, ...]
+ dev: tuple[str, int] | None
+ pre: tuple[str, int] | None
+ post: tuple[str, int] | None
+ local: LocalType | None
-def parse(version: str) -> Union["LegacyVersion", "Version"]:
- """
- Parse the given version string and return either a :class:`Version` object
- or a :class:`LegacyVersion` object depending on if the given version is
- a valid PEP 440 version or a legacy version.
+
+def parse(version: str) -> Version:
+ """Parse the given version string.
+
+ >>> parse('1.0.dev1')
+ <Version('1.0.dev1')>
+
+ :param version: The version string to parse.
+ :raises InvalidVersion: When the version string is not a valid version.
"""
- try:
- return Version(version)
- except InvalidVersion:
- return LegacyVersion(version)
+ return Version(version)
class InvalidVersion(ValueError):
- """
- An invalid version was found, users should refer to PEP 440.
+ """Raised when a version string is not a valid version.
+
+ >>> Version("invalid")
+ Traceback (most recent call last):
+ ...
+ packaging.version.InvalidVersion: Invalid version: 'invalid'
"""
class _BaseVersion:
- _key: Union[CmpKey, LegacyCmpKey]
+ _key: tuple[Any, ...]
def __hash__(self) -> int:
return hash(self._key)
@@ -66,13 +75,13 @@ class _BaseVersion:
# Please keep the duplicated `isinstance` check
# in the six comparisons hereunder
# unless you find a way to avoid adding overhead function calls.
- def __lt__(self, other: "_BaseVersion") -> bool:
+ def __lt__(self, other: _BaseVersion) -> bool:
if not isinstance(other, _BaseVersion):
return NotImplemented
return self._key < other._key
- def __le__(self, other: "_BaseVersion") -> bool:
+ def __le__(self, other: _BaseVersion) -> bool:
if not isinstance(other, _BaseVersion):
return NotImplemented
@@ -84,13 +93,13 @@ class _BaseVersion:
return self._key == other._key
- def __ge__(self, other: "_BaseVersion") -> bool:
+ def __ge__(self, other: _BaseVersion) -> bool:
if not isinstance(other, _BaseVersion):
return NotImplemented
return self._key >= other._key
- def __gt__(self, other: "_BaseVersion") -> bool:
+ def __gt__(self, other: _BaseVersion) -> bool:
if not isinstance(other, _BaseVersion):
return NotImplemented
@@ -103,133 +112,16 @@ class _BaseVersion:
return self._key != other._key
-class LegacyVersion(_BaseVersion):
- def __init__(self, version: str) -> None:
- self._version = str(version)
- self._key = _legacy_cmpkey(self._version)
-
- warnings.warn(
- "Creating a LegacyVersion has been deprecated and will be "
- "removed in the next major release",
- DeprecationWarning,
- )
-
- def __str__(self) -> str:
- return self._version
-
- def __repr__(self) -> str:
- return f"<LegacyVersion('{self}')>"
-
- @property
- def public(self) -> str:
- return self._version
-
- @property
- def base_version(self) -> str:
- return self._version
-
- @property
- def epoch(self) -> int:
- return -1
-
- @property
- def release(self) -> None:
- return None
-
- @property
- def pre(self) -> None:
- return None
-
- @property
- def post(self) -> None:
- return None
-
- @property
- def dev(self) -> None:
- return None
-
- @property
- def local(self) -> None:
- return None
-
- @property
- def is_prerelease(self) -> bool:
- return False
-
- @property
- def is_postrelease(self) -> bool:
- return False
-
- @property
- def is_devrelease(self) -> bool:
- return False
-
-
-_legacy_version_component_re = re.compile(r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE)
-
-_legacy_version_replacement_map = {
- "pre": "c",
- "preview": "c",
- "-": "final-",
- "rc": "c",
- "dev": "@",
-}
-
-
-def _parse_version_parts(s: str) -> Iterator[str]:
- for part in _legacy_version_component_re.split(s):
- part = _legacy_version_replacement_map.get(part, part)
-
- if not part or part == ".":
- continue
-
- if part[:1] in "0123456789":
- # pad for numeric comparison
- yield part.zfill(8)
- else:
- yield "*" + part
-
- # ensure that alpha/beta/candidate are before final
- yield "*final"
-
-
-def _legacy_cmpkey(version: str) -> LegacyCmpKey:
-
- # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch
- # greater than or equal to 0. This will effectively put the LegacyVersion,
- # which uses the defacto standard originally implemented by setuptools,
- # as before all PEP 440 versions.
- epoch = -1
-
- # This scheme is taken from pkg_resources.parse_version setuptools prior to
- # it's adoption of the packaging library.
- parts: List[str] = []
- for part in _parse_version_parts(version.lower()):
- if part.startswith("*"):
- # remove "-" before a prerelease tag
- if part < "*final":
- while parts and parts[-1] == "*final-":
- parts.pop()
-
- # remove trailing zeros from each series of numeric parts
- while parts and parts[-1] == "00000000":
- parts.pop()
-
- parts.append(part)
-
- return epoch, tuple(parts)
-
-
# Deliberately not anchored to the start and end of the string, to make it
# easier for 3rd party code to reuse
-VERSION_PATTERN = r"""
+_VERSION_PATTERN = r"""
v?
(?:
(?:(?P<epoch>[0-9]+)!)? # epoch
(?P<release>[0-9]+(?:\.[0-9]+)*) # release segment
(?P<pre> # pre-release
[-_\.]?
- (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview))
+ (?P<pre_l>alpha|a|beta|b|preview|pre|c|rc)
[-_\.]?
(?P<pre_n>[0-9]+)?
)?
@@ -253,12 +145,56 @@ VERSION_PATTERN = r"""
(?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version
"""
+VERSION_PATTERN = _VERSION_PATTERN
+"""
+A string containing the regular expression used to match a valid version.
+
+The pattern is not anchored at either end, and is intended for embedding in larger
+expressions (for example, matching a version number as part of a file name). The
+regular expression should be compiled with the ``re.VERBOSE`` and ``re.IGNORECASE``
+flags set.
+
+:meta hide-value:
+"""
+
class Version(_BaseVersion):
+ """This class abstracts handling of a project's versions.
+
+ A :class:`Version` instance is comparison aware and can be compared and
+ sorted using the standard Python interfaces.
+
+ >>> v1 = Version("1.0a5")
+ >>> v2 = Version("1.0")
+ >>> v1
+ <Version('1.0a5')>
+ >>> v2
+ <Version('1.0')>
+ >>> v1 < v2
+ True
+ >>> v1 == v2
+ False
+ >>> v1 > v2
+ False
+ >>> v1 >= v2
+ False
+ >>> v1 <= v2
+ True
+ """
_regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE)
+ _key: CmpKey
def __init__(self, version: str) -> None:
+ """Initialize a Version object.
+
+ :param version:
+ The string representation of a version which will be parsed and normalized
+ before use.
+ :raises InvalidVersion:
+ If the ``version`` does not conform to PEP 440 in any way then this
+ exception will be raised.
+ """
# Validate the version and parse it into pieces
match = self._regex.search(version)
@@ -288,9 +224,19 @@ class Version(_BaseVersion):
)
def __repr__(self) -> str:
+ """A representation of the Version that shows all internal state.
+
+ >>> Version('1.0.0')
+ <Version('1.0.0')>
+ """
return f"<Version('{self}')>"
def __str__(self) -> str:
+ """A string representation of the version that can be rounded-tripped.
+
+ >>> str(Version("1.0a5"))
+ '1.0a5'
+ """
parts = []
# Epoch
@@ -320,29 +266,77 @@ class Version(_BaseVersion):
@property
def epoch(self) -> int:
- _epoch: int = self._version.epoch
- return _epoch
+ """The epoch of the version.
+
+ >>> Version("2.0.0").epoch
+ 0
+ >>> Version("1!2.0.0").epoch
+ 1
+ """
+ return self._version.epoch
@property
- def release(self) -> Tuple[int, ...]:
- _release: Tuple[int, ...] = self._version.release
- return _release
+ def release(self) -> tuple[int, ...]:
+ """The components of the "release" segment of the version.
+
+ >>> Version("1.2.3").release
+ (1, 2, 3)
+ >>> Version("2.0.0").release
+ (2, 0, 0)
+ >>> Version("1!2.0.0.post0").release
+ (2, 0, 0)
+
+ Includes trailing zeroes but not the epoch or any pre-release / development /
+ post-release suffixes.
+ """
+ return self._version.release
@property
- def pre(self) -> Optional[Tuple[str, int]]:
- _pre: Optional[Tuple[str, int]] = self._version.pre
- return _pre
+ def pre(self) -> tuple[str, int] | None:
+ """The pre-release segment of the version.
+
+ >>> print(Version("1.2.3").pre)
+ None
+ >>> Version("1.2.3a1").pre
+ ('a', 1)
+ >>> Version("1.2.3b1").pre
+ ('b', 1)
+ >>> Version("1.2.3rc1").pre
+ ('rc', 1)
+ """
+ return self._version.pre
@property
- def post(self) -> Optional[int]:
+ def post(self) -> int | None:
+ """The post-release number of the version.
+
+ >>> print(Version("1.2.3").post)
+ None
+ >>> Version("1.2.3.post1").post
+ 1
+ """
return self._version.post[1] if self._version.post else None
@property
- def dev(self) -> Optional[int]:
+ def dev(self) -> int | None:
+ """The development number of the version.
+
+ >>> print(Version("1.2.3").dev)
+ None
+ >>> Version("1.2.3.dev1").dev
+ 1
+ """
return self._version.dev[1] if self._version.dev else None
@property
- def local(self) -> Optional[str]:
+ def local(self) -> str | None:
+ """The local version segment of the version.
+
+ >>> print(Version("1.2.3").local)
+ None
+ >>> Version("1.2.3+abc").local
+ 'abc'
+ """
if self._version.local:
return ".".join(str(x) for x in self._version.local)
else:
@@ -350,10 +344,31 @@ class Version(_BaseVersion):
@property
def public(self) -> str:
+ """The public portion of the version.
+
+ >>> Version("1.2.3").public
+ '1.2.3'
+ >>> Version("1.2.3+abc").public
+ '1.2.3'
+ >>> Version("1.2.3+abc.dev1").public
+ '1.2.3'
+ """
return str(self).split("+", 1)[0]
@property
def base_version(self) -> str:
+ """The "base version" of the version.
+
+ >>> Version("1.2.3").base_version
+ '1.2.3'
+ >>> Version("1.2.3+abc").base_version
+ '1.2.3'
+ >>> Version("1!1.2.3+abc.dev1").base_version
+ '1!1.2.3'
+
+ The "base version" is the public version of the project without any pre or post
+ release markers.
+ """
parts = []
# Epoch
@@ -367,33 +382,78 @@ class Version(_BaseVersion):
@property
def is_prerelease(self) -> bool:
+ """Whether this version is a pre-release.
+
+ >>> Version("1.2.3").is_prerelease
+ False
+ >>> Version("1.2.3a1").is_prerelease
+ True
+ >>> Version("1.2.3b1").is_prerelease
+ True
+ >>> Version("1.2.3rc1").is_prerelease
+ True
+ >>> Version("1.2.3dev1").is_prerelease
+ True
+ """
return self.dev is not None or self.pre is not None
@property
def is_postrelease(self) -> bool:
+ """Whether this version is a post-release.
+
+ >>> Version("1.2.3").is_postrelease
+ False
+ >>> Version("1.2.3.post1").is_postrelease
+ True
+ """
return self.post is not None
@property
def is_devrelease(self) -> bool:
+ """Whether this version is a development release.
+
+ >>> Version("1.2.3").is_devrelease
+ False
+ >>> Version("1.2.3.dev1").is_devrelease
+ True
+ """
return self.dev is not None
@property
def major(self) -> int:
+ """The first item of :attr:`release` or ``0`` if unavailable.
+
+ >>> Version("1.2.3").major
+ 1
+ """
return self.release[0] if len(self.release) >= 1 else 0
@property
def minor(self) -> int:
+ """The second item of :attr:`release` or ``0`` if unavailable.
+
+ >>> Version("1.2.3").minor
+ 2
+ >>> Version("1").minor
+ 0
+ """
return self.release[1] if len(self.release) >= 2 else 0
@property
def micro(self) -> int:
+ """The third item of :attr:`release` or ``0`` if unavailable.
+
+ >>> Version("1.2.3").micro
+ 3
+ >>> Version("1").micro
+ 0
+ """
return self.release[2] if len(self.release) >= 3 else 0
def _parse_letter_version(
- letter: str, number: Union[str, bytes, SupportsInt]
-) -> Optional[Tuple[str, int]]:
-
+ letter: str | None, number: str | bytes | SupportsInt | None
+) -> tuple[str, int] | None:
if letter:
# We consider there to be an implicit 0 in a pre-release if there is
# not a numeral associated with it.
@@ -429,7 +489,7 @@ def _parse_letter_version(
_local_version_separators = re.compile(r"[\._-]")
-def _parse_local_version(local: str) -> Optional[LocalType]:
+def _parse_local_version(local: str | None) -> LocalType | None:
"""
Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
"""
@@ -443,13 +503,12 @@ def _parse_local_version(local: str) -> Optional[LocalType]:
def _cmpkey(
epoch: int,
- release: Tuple[int, ...],
- pre: Optional[Tuple[str, int]],
- post: Optional[Tuple[str, int]],
- dev: Optional[Tuple[str, int]],
- local: Optional[Tuple[SubLocalType]],
+ release: tuple[int, ...],
+ pre: tuple[str, int] | None,
+ post: tuple[str, int] | None,
+ dev: tuple[str, int] | None,
+ local: LocalType | None,
) -> CmpKey:
-
# When we compare a release version, we want to compare it with all of the
# trailing zeros removed. So we'll use a reverse the list, drop all the now
# leading zeros until we come to something non zero, then take the rest
@@ -464,7 +523,7 @@ def _cmpkey(
# if there is not a pre or a post segment. If we have one of those then
# the normal sorting rules will handle this case correctly.
if pre is None and post is None and dev is not None:
- _pre: PrePostDevType = NegativeInfinity
+ _pre: CmpPrePostDevType = NegativeInfinity
# Versions without a pre-release (except as noted above) should sort after
# those with one.
elif pre is None:
@@ -474,21 +533,21 @@ def _cmpkey(
# Versions without a post segment should sort before those with one.
if post is None:
- _post: PrePostDevType = NegativeInfinity
+ _post: CmpPrePostDevType = NegativeInfinity
else:
_post = post
# Versions without a development segment should sort after those with one.
if dev is None:
- _dev: PrePostDevType = Infinity
+ _dev: CmpPrePostDevType = Infinity
else:
_dev = dev
if local is None:
# Versions without a local segment should sort before those with one.
- _local: LocalType = NegativeInfinity
+ _local: CmpLocalType = NegativeInfinity
else:
# Versions with a local segment need that segment parsed to implement
# the sorting rules in PEP440.
diff --git a/contrib/python/pip/pip/_vendor/pkg_resources/__init__.py b/contrib/python/pip/pip/_vendor/pkg_resources/__init__.py
index ad2794077b..417a537d6f 100644
--- a/contrib/python/pip/pip/_vendor/pkg_resources/__init__.py
+++ b/contrib/python/pip/pip/_vendor/pkg_resources/__init__.py
@@ -18,11 +18,16 @@ This module is deprecated. Users are directed to :mod:`importlib.resources`,
"""
import sys
+
+if sys.version_info < (3, 8):
+ raise RuntimeError("Python 3.8 or later is required")
+
import os
import io
import time
import re
import types
+from typing import List, Protocol
import zipfile
import zipimport
import warnings
@@ -41,18 +46,10 @@ import inspect
import ntpath
import posixpath
import importlib
+import importlib.machinery
from pkgutil import get_importer
-try:
- import _imp
-except ImportError:
- # Python 3.2 compatibility
- import imp as _imp
-
-try:
- FileExistsError
-except NameError:
- FileExistsError = OSError
+import _imp
# capture these to bypass sandboxing
from os import utime
@@ -68,14 +65,6 @@ except ImportError:
from os import open as os_open
from os.path import isdir, split
-try:
- import importlib.machinery as importlib_machinery
-
- # access attribute to force import under delayed import mechanisms.
- importlib_machinery.__name__
-except ImportError:
- importlib_machinery = None
-
from pip._internal.utils._jaraco_text import (
yield_lines,
drop_comment,
@@ -91,17 +80,12 @@ __import__('pip._vendor.packaging.requirements')
__import__('pip._vendor.packaging.markers')
__import__('pip._vendor.packaging.utils')
-if sys.version_info < (3, 5):
- raise RuntimeError("Python 3.5 or later is required")
-
# declare some globals that will be defined later to
# satisfy the linters.
require = None
working_set = None
add_activation_listener = None
-resources_stream = None
cleanup_resources = None
-resource_dir = None
resource_stream = None
set_extraction_path = None
resource_isdir = None
@@ -119,7 +103,7 @@ warnings.warn(
"pkg_resources is deprecated as an API. "
"See https://setuptools.pypa.io/en/latest/pkg_resources.html",
DeprecationWarning,
- stacklevel=2
+ stacklevel=2,
)
@@ -407,20 +391,18 @@ def get_provider(moduleOrReq):
return _find_adapter(_provider_factories, loader)(module)
-def _macos_vers(_cache=[]):
- if not _cache:
- version = platform.mac_ver()[0]
- # fallback for MacPorts
- if version == '':
- plist = '/System/Library/CoreServices/SystemVersion.plist'
- if os.path.exists(plist):
- if hasattr(plistlib, 'readPlist'):
- plist_content = plistlib.readPlist(plist)
- if 'ProductVersion' in plist_content:
- version = plist_content['ProductVersion']
-
- _cache.append(version.split('.'))
- return _cache[0]
+@functools.lru_cache(maxsize=None)
+def _macos_vers():
+ version = platform.mac_ver()[0]
+ # fallback for MacPorts
+ if version == '':
+ plist = '/System/Library/CoreServices/SystemVersion.plist'
+ if os.path.exists(plist):
+ with open(plist, 'rb') as fh:
+ plist_content = plistlib.load(fh)
+ if 'ProductVersion' in plist_content:
+ version = plist_content['ProductVersion']
+ return version.split('.')
def _macos_arch(machine):
@@ -507,19 +489,6 @@ def compatible_platforms(provided, required):
return False
-def run_script(dist_spec, script_name):
- """Locate distribution `dist_spec` and run its `script_name` script"""
- ns = sys._getframe(1).f_globals
- name = ns['__name__']
- ns.clear()
- ns['__name__'] = name
- require(dist_spec)[0].run_script(script_name, ns)
-
-
-# backward compatibility
-run_main = run_script
-
-
def get_distribution(dist):
"""Return a current distribution object for a Requirement or string"""
if isinstance(dist, str):
@@ -546,54 +515,54 @@ def get_entry_info(dist, group, name):
return get_distribution(dist).get_entry_info(group, name)
-class IMetadataProvider:
- def has_metadata(name):
+class IMetadataProvider(Protocol):
+ def has_metadata(self, name) -> bool:
"""Does the package's distribution contain the named metadata?"""
- def get_metadata(name):
+ def get_metadata(self, name):
"""The named metadata resource as a string"""
- def get_metadata_lines(name):
+ def get_metadata_lines(self, name):
"""Yield named metadata resource as list of non-blank non-comment lines
Leading and trailing whitespace is stripped from each line, and lines
with ``#`` as the first non-blank character are omitted."""
- def metadata_isdir(name):
+ def metadata_isdir(self, name) -> bool:
"""Is the named metadata a directory? (like ``os.path.isdir()``)"""
- def metadata_listdir(name):
+ def metadata_listdir(self, name):
"""List of metadata names in the directory (like ``os.listdir()``)"""
- def run_script(script_name, namespace):
+ def run_script(self, script_name, namespace):
"""Execute the named script in the supplied namespace dictionary"""
-class IResourceProvider(IMetadataProvider):
+class IResourceProvider(IMetadataProvider, Protocol):
"""An object that provides access to package resources"""
- def get_resource_filename(manager, resource_name):
+ def get_resource_filename(self, manager, resource_name):
"""Return a true filesystem path for `resource_name`
`manager` must be an ``IResourceManager``"""
- def get_resource_stream(manager, resource_name):
+ def get_resource_stream(self, manager, resource_name):
"""Return a readable file-like object for `resource_name`
`manager` must be an ``IResourceManager``"""
- def get_resource_string(manager, resource_name):
- """Return a string containing the contents of `resource_name`
+ def get_resource_string(self, manager, resource_name) -> bytes:
+ """Return the contents of `resource_name` as :obj:`bytes`
`manager` must be an ``IResourceManager``"""
- def has_resource(resource_name):
+ def has_resource(self, resource_name):
"""Does the package contain the named resource?"""
- def resource_isdir(resource_name):
+ def resource_isdir(self, resource_name):
"""Is the named resource a directory? (like ``os.path.isdir()``)"""
- def resource_listdir(resource_name):
+ def resource_listdir(self, resource_name):
"""List of resource names in the directory (like ``os.listdir()``)"""
@@ -1143,8 +1112,7 @@ class Environment:
None is returned instead. This method is a hook that allows subclasses
to attempt other ways of obtaining a distribution before falling back
to the `installer` argument."""
- if installer is not None:
- return installer(requirement)
+ return installer(requirement) if installer else None
def __iter__(self):
"""Yield the unique project names of the available distributions"""
@@ -1220,8 +1188,8 @@ class ResourceManager:
self, resource_name
)
- def resource_string(self, package_or_requirement, resource_name):
- """Return specified resource as a string"""
+ def resource_string(self, package_or_requirement, resource_name) -> bytes:
+ """Return specified resource as :obj:`bytes`"""
return get_provider(package_or_requirement).get_resource_string(
self, resource_name
)
@@ -1356,7 +1324,7 @@ class ResourceManager:
self.extraction_path = path
- def cleanup_resources(self, force=False):
+ def cleanup_resources(self, force=False) -> List[str]:
"""
Delete all extracted resource files and directories, returning a list
of the file and directory names that could not be successfully removed.
@@ -1368,6 +1336,7 @@ class ResourceManager:
directory used for extractions.
"""
# XXX
+ return []
def get_default_cache():
@@ -1418,7 +1387,7 @@ def _forgiving_version(version):
match = _PEP440_FALLBACK.search(version)
if match:
safe = match["safe"]
- rest = version[len(safe):]
+ rest = version[len(safe) :]
else:
safe = "0"
rest = version
@@ -1496,7 +1465,7 @@ class NullProvider:
def get_resource_stream(self, manager, resource_name):
return io.BytesIO(self.get_resource_string(manager, resource_name))
- def get_resource_string(self, manager, resource_name):
+ def get_resource_string(self, manager, resource_name) -> bytes:
return self._get(self._fn(self.module_path, resource_name))
def has_resource(self, resource_name):
@@ -1505,9 +1474,9 @@ class NullProvider:
def _get_metadata_path(self, name):
return self._fn(self.egg_info, name)
- def has_metadata(self, name):
+ def has_metadata(self, name) -> bool:
if not self.egg_info:
- return self.egg_info
+ return False
path = self._get_metadata_path(name)
return self._has(path)
@@ -1531,8 +1500,8 @@ class NullProvider:
def resource_isdir(self, resource_name):
return self._isdir(self._fn(self.module_path, resource_name))
- def metadata_isdir(self, name):
- return self.egg_info and self._isdir(self._fn(self.egg_info, name))
+ def metadata_isdir(self, name) -> bool:
+ return bool(self.egg_info and self._isdir(self._fn(self.egg_info, name)))
def resource_listdir(self, resource_name):
return self._listdir(self._fn(self.module_path, resource_name))
@@ -1571,12 +1540,12 @@ class NullProvider:
script_code = compile(script_text, script_filename, 'exec')
exec(script_code, namespace, namespace)
- def _has(self, path):
+ def _has(self, path) -> bool:
raise NotImplementedError(
"Can't perform this operation for unregistered loader type"
)
- def _isdir(self, path):
+ def _isdir(self, path) -> bool:
raise NotImplementedError(
"Can't perform this operation for unregistered loader type"
)
@@ -1666,7 +1635,7 @@ is not allowed.
DeprecationWarning,
)
- def _get(self, path):
+ def _get(self, path) -> bytes:
if hasattr(self.loader, 'get_data'):
return self.loader.get_data(path)
raise NotImplementedError(
@@ -1711,10 +1680,10 @@ class EggProvider(NullProvider):
class DefaultProvider(EggProvider):
"""Provides access to package resources in the filesystem"""
- def _has(self, path):
+ def _has(self, path) -> bool:
return os.path.exists(path)
- def _isdir(self, path):
+ def _isdir(self, path) -> bool:
return os.path.isdir(path)
def _listdir(self, path):
@@ -1723,7 +1692,7 @@ class DefaultProvider(EggProvider):
def get_resource_stream(self, manager, resource_name):
return open(self._fn(self.module_path, resource_name), 'rb')
- def _get(self, path):
+ def _get(self, path) -> bytes:
with open(path, 'rb') as stream:
return stream.read()
@@ -1734,7 +1703,7 @@ class DefaultProvider(EggProvider):
'SourcelessFileLoader',
)
for name in loader_names:
- loader_cls = getattr(importlib_machinery, name, type(None))
+ loader_cls = getattr(importlib.machinery, name, type(None))
register_loader_type(loader_cls, cls)
@@ -1748,8 +1717,8 @@ class EmptyProvider(NullProvider):
_isdir = _has = lambda self, path: False
- def _get(self, path):
- return ''
+ def _get(self, path) -> bytes:
+ return b''
def _listdir(self, path):
return []
@@ -1874,7 +1843,7 @@ class ZipProvider(EggProvider):
timestamp, size = self._get_date_and_size(self.zipinfo[zip_path])
if not WRITE_SUPPORT:
- raise IOError(
+ raise OSError(
'"os.rename" and "os.unlink" are not supported ' 'on this platform'
)
try:
@@ -1895,7 +1864,7 @@ class ZipProvider(EggProvider):
try:
rename(tmpnam, real_path)
- except os.error:
+ except OSError:
if os.path.isfile(real_path):
if self._is_current(real_path, zip_path):
# the file became current since it was checked above,
@@ -1908,7 +1877,7 @@ class ZipProvider(EggProvider):
return real_path
raise
- except os.error:
+ except OSError:
# report a user-friendly error
manager.extraction_error()
@@ -1956,11 +1925,11 @@ class ZipProvider(EggProvider):
self._dirindex = ind
return ind
- def _has(self, fspath):
+ def _has(self, fspath) -> bool:
zip_path = self._zipinfo_name(fspath)
return zip_path in self.zipinfo or zip_path in self._index()
- def _isdir(self, fspath):
+ def _isdir(self, fspath) -> bool:
return self._zipinfo_name(fspath) in self._index()
def _listdir(self, fspath):
@@ -1994,14 +1963,14 @@ class FileMetadata(EmptyProvider):
def _get_metadata_path(self, name):
return self.path
- def has_metadata(self, name):
+ def has_metadata(self, name) -> bool:
return name == 'PKG-INFO' and os.path.isfile(self.path)
def get_metadata(self, name):
if name != 'PKG-INFO':
raise KeyError("No metadata except PKG-INFO is available")
- with io.open(self.path, encoding='utf-8', errors="replace") as f:
+ with open(self.path, encoding='utf-8', errors="replace") as f:
metadata = f.read()
self._warn_on_replacement(metadata)
return metadata
@@ -2095,8 +2064,7 @@ def find_eggs_in_zip(importer, path_item, only=False):
if _is_egg_path(subitem):
subpath = os.path.join(path_item, subitem)
dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath)
- for dist in dists:
- yield dist
+ yield from dists
elif subitem.lower().endswith(('.dist-info', '.egg-info')):
subpath = os.path.join(path_item, subitem)
submeta = EggMetadata(zipimport.zipimporter(subpath))
@@ -2131,8 +2099,7 @@ def find_on_path(importer, path_item, only=False):
for entry in sorted(entries):
fullpath = os.path.join(path_item, entry)
factory = dist_factory(path_item, entry, only)
- for dist in factory(fullpath):
- yield dist
+ yield from factory(fullpath)
def dist_factory(path_item, entry, only):
@@ -2231,7 +2198,7 @@ def resolve_egg_link(path):
if hasattr(pkgutil, 'ImpImporter'):
register_finder(pkgutil.ImpImporter, find_on_path)
-register_finder(importlib_machinery.FileFinder, find_on_path)
+register_finder(importlib.machinery.FileFinder, find_on_path)
_declare_state('dict', _namespace_handlers={})
_declare_state('dict', _namespace_packages={})
@@ -2398,7 +2365,7 @@ if hasattr(pkgutil, 'ImpImporter'):
register_namespace_handler(pkgutil.ImpImporter, file_ns_handler)
register_namespace_handler(zipimport.zipimporter, file_ns_handler)
-register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler)
+register_namespace_handler(importlib.machinery.FileFinder, file_ns_handler)
def null_ns_handler(importer, path_item, packageName, module):
@@ -2424,12 +2391,9 @@ def _cygwin_patch(filename): # pragma: nocover
return os.path.abspath(filename) if sys.platform == 'cygwin' else filename
-def _normalize_cached(filename, _cache={}):
- try:
- return _cache[filename]
- except KeyError:
- _cache[filename] = result = normalize_path(filename)
- return result
+@functools.lru_cache(maxsize=None)
+def _normalize_cached(filename):
+ return normalize_path(filename)
def _is_egg_path(path):
@@ -2850,14 +2814,11 @@ class Distribution:
def _get_metadata(self, name):
if self.has_metadata(name):
- for line in self.get_metadata_lines(name):
- yield line
+ yield from self.get_metadata_lines(name)
def _get_version(self):
lines = self._get_metadata(self.PKG_INFO)
- version = _version_from_file(lines)
-
- return version
+ return _version_from_file(lines)
def activate(self, path=None, replace=False):
"""Ensure distribution is importable on `path` (default=sys.path)"""
@@ -2904,7 +2865,7 @@ class Distribution:
def __dir__(self):
return list(
- set(super(Distribution, self).__dir__())
+ set(super().__dir__())
| set(attr for attr in self._provider.__dir__() if not attr.startswith('_'))
)
@@ -3171,7 +3132,7 @@ class RequirementParseError(packaging.requirements.InvalidRequirement):
class Requirement(packaging.requirements.Requirement):
def __init__(self, requirement_string):
"""DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!"""
- super(Requirement, self).__init__(requirement_string)
+ super().__init__(requirement_string)
self.unsafe_name = self.name
project_name = safe_name(self.name)
self.project_name, self.key = project_name, project_name.lower()
@@ -3232,6 +3193,9 @@ def _find_adapter(registry, ob):
for t in types:
if t in registry:
return registry[t]
+ # _find_adapter would previously return None, and immediately be called.
+ # So we're raising a TypeError to keep backward compatibility if anyone depended on that behaviour.
+ raise TypeError(f"Could not find adapter for {registry} and {ob}")
def ensure_directory(path):
@@ -3243,7 +3207,7 @@ def ensure_directory(path):
def _bypass_ensure_directory(path):
"""Sandbox-bypassing version of ensure_directory()"""
if not WRITE_SUPPORT:
- raise IOError('"os.mkdir" not supported on this platform.')
+ raise OSError('"os.mkdir" not supported on this platform.')
dirname, filename = split(path)
if dirname and filename and not isdir(dirname):
_bypass_ensure_directory(dirname)
diff --git a/contrib/python/pip/pip/_vendor/platformdirs/__init__.py b/contrib/python/pip/pip/_vendor/platformdirs/__init__.py
index 5ebf5957b4..d58dd2b7dd 100644
--- a/contrib/python/pip/pip/_vendor/platformdirs/__init__.py
+++ b/contrib/python/pip/pip/_vendor/platformdirs/__init__.py
@@ -1,7 +1,10 @@
"""
-Utilities for determining application-specific dirs. See <https://github.com/platformdirs/platformdirs> for details and
-usage.
+Utilities for determining application-specific dirs.
+
+See <https://github.com/platformdirs/platformdirs> for details and usage.
+
"""
+
from __future__ import annotations
import os
@@ -14,31 +17,27 @@ from .version import __version_tuple__ as __version_info__
if TYPE_CHECKING:
from pathlib import Path
-
- if sys.version_info >= (3, 8): # pragma: no cover (py38+)
- from typing import Literal
- else: # pragma: no cover (py38+)
- from pip._vendor.typing_extensions import Literal
+ from typing import Literal
def _set_platform_dir_class() -> type[PlatformDirsABC]:
if sys.platform == "win32":
- from pip._vendor.platformdirs.windows import Windows as Result
+ from pip._vendor.platformdirs.windows import Windows as Result # noqa: PLC0415
elif sys.platform == "darwin":
- from pip._vendor.platformdirs.macos import MacOS as Result
+ from pip._vendor.platformdirs.macos import MacOS as Result # noqa: PLC0415
else:
- from pip._vendor.platformdirs.unix import Unix as Result
+ from pip._vendor.platformdirs.unix import Unix as Result # noqa: PLC0415
if os.getenv("ANDROID_DATA") == "/data" and os.getenv("ANDROID_ROOT") == "/system":
if os.getenv("SHELL") or os.getenv("PREFIX"):
return Result
- from pip._vendor.platformdirs.android import _android_folder
+ from pip._vendor.platformdirs.android import _android_folder # noqa: PLC0415
if _android_folder() is not None:
- from pip._vendor.platformdirs.android import Android
+ from pip._vendor.platformdirs.android import Android # noqa: PLC0415
- return Android # return to avoid redefinition of result
+ return Android # return to avoid redefinition of a result
return Result
@@ -264,6 +263,11 @@ def user_music_dir() -> str:
return PlatformDirs().user_music_dir
+def user_desktop_dir() -> str:
+ """:returns: desktop directory tied to the user"""
+ return PlatformDirs().user_desktop_dir
+
+
def user_runtime_dir(
appname: str | None = None,
appauthor: str | None | Literal[False] = None,
@@ -288,6 +292,30 @@ def user_runtime_dir(
).user_runtime_dir
+def site_runtime_dir(
+ appname: str | None = None,
+ appauthor: str | None | Literal[False] = None,
+ version: str | None = None,
+ opinion: bool = True, # noqa: FBT001, FBT002
+ ensure_exists: bool = False, # noqa: FBT001, FBT002
+) -> str:
+ """
+ :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`.
+ :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`.
+ :param version: See `version <platformdirs.api.PlatformDirsABC.version>`.
+ :param opinion: See `opinion <platformdirs.api.PlatformDirsABC.opinion>`.
+ :param ensure_exists: See `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`.
+ :returns: runtime directory shared by users
+ """
+ return PlatformDirs(
+ appname=appname,
+ appauthor=appauthor,
+ version=version,
+ opinion=opinion,
+ ensure_exists=ensure_exists,
+ ).site_runtime_dir
+
+
def user_data_path(
appname: str | None = None,
appauthor: str | None | Literal[False] = None,
@@ -481,7 +509,7 @@ def user_log_path(
def user_documents_path() -> Path:
- """:returns: documents path tied to the user"""
+ """:returns: documents a path tied to the user"""
return PlatformDirs().user_documents_path
@@ -505,6 +533,11 @@ def user_music_path() -> Path:
return PlatformDirs().user_music_path
+def user_desktop_path() -> Path:
+ """:returns: desktop path tied to the user"""
+ return PlatformDirs().user_desktop_path
+
+
def user_runtime_path(
appname: str | None = None,
appauthor: str | None | Literal[False] = None,
@@ -529,38 +562,66 @@ def user_runtime_path(
).user_runtime_path
+def site_runtime_path(
+ appname: str | None = None,
+ appauthor: str | None | Literal[False] = None,
+ version: str | None = None,
+ opinion: bool = True, # noqa: FBT001, FBT002
+ ensure_exists: bool = False, # noqa: FBT001, FBT002
+) -> Path:
+ """
+ :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`.
+ :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`.
+ :param version: See `version <platformdirs.api.PlatformDirsABC.version>`.
+ :param opinion: See `opinion <platformdirs.api.PlatformDirsABC.opinion>`.
+ :param ensure_exists: See `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`.
+ :returns: runtime path shared by users
+ """
+ return PlatformDirs(
+ appname=appname,
+ appauthor=appauthor,
+ version=version,
+ opinion=opinion,
+ ensure_exists=ensure_exists,
+ ).site_runtime_path
+
+
__all__ = [
- "__version__",
- "__version_info__",
- "PlatformDirs",
"AppDirs",
+ "PlatformDirs",
"PlatformDirsABC",
- "user_data_dir",
- "user_config_dir",
+ "__version__",
+ "__version_info__",
+ "site_cache_dir",
+ "site_cache_path",
+ "site_config_dir",
+ "site_config_path",
+ "site_data_dir",
+ "site_data_path",
+ "site_runtime_dir",
+ "site_runtime_path",
"user_cache_dir",
- "user_state_dir",
- "user_log_dir",
+ "user_cache_path",
+ "user_config_dir",
+ "user_config_path",
+ "user_data_dir",
+ "user_data_path",
+ "user_desktop_dir",
+ "user_desktop_path",
"user_documents_dir",
+ "user_documents_path",
"user_downloads_dir",
- "user_pictures_dir",
- "user_videos_dir",
+ "user_downloads_path",
+ "user_log_dir",
+ "user_log_path",
"user_music_dir",
+ "user_music_path",
+ "user_pictures_dir",
+ "user_pictures_path",
"user_runtime_dir",
- "site_data_dir",
- "site_config_dir",
- "site_cache_dir",
- "user_data_path",
- "user_config_path",
- "user_cache_path",
+ "user_runtime_path",
+ "user_state_dir",
"user_state_path",
- "user_log_path",
- "user_documents_path",
- "user_downloads_path",
- "user_pictures_path",
+ "user_videos_dir",
"user_videos_path",
- "user_music_path",
- "user_runtime_path",
- "site_data_path",
- "site_config_path",
- "site_cache_path",
]
diff --git a/contrib/python/pip/pip/_vendor/platformdirs/__main__.py b/contrib/python/pip/pip/_vendor/platformdirs/__main__.py
index 6a0d6dd12e..fa8a677a33 100644
--- a/contrib/python/pip/pip/_vendor/platformdirs/__main__.py
+++ b/contrib/python/pip/pip/_vendor/platformdirs/__main__.py
@@ -1,4 +1,5 @@
"""Main entry point."""
+
from __future__ import annotations
from pip._vendor.platformdirs import PlatformDirs, __version__
@@ -18,11 +19,12 @@ PROPS = (
"site_data_dir",
"site_config_dir",
"site_cache_dir",
+ "site_runtime_dir",
)
def main() -> None:
- """Run main entry point."""
+ """Run the main entry point."""
app_name = "MyApp"
app_author = "MyCompany"
diff --git a/contrib/python/pip/pip/_vendor/platformdirs/android.py b/contrib/python/pip/pip/_vendor/platformdirs/android.py
index 76527dda41..fefafd3297 100644
--- a/contrib/python/pip/pip/_vendor/platformdirs/android.py
+++ b/contrib/python/pip/pip/_vendor/platformdirs/android.py
@@ -1,4 +1,5 @@
"""Android."""
+
from __future__ import annotations
import os
@@ -12,10 +13,11 @@ from .api import PlatformDirsABC
class Android(PlatformDirsABC):
"""
- Follows the guidance `from here <https://android.stackexchange.com/a/216132>`_. Makes use of the
- `appname <platformdirs.api.PlatformDirsABC.appname>`,
- `version <platformdirs.api.PlatformDirsABC.version>`,
- `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`.
+ Follows the guidance `from here <https://android.stackexchange.com/a/216132>`_.
+
+ Makes use of the `appname <platformdirs.api.PlatformDirsABC.appname>`, `version
+ <platformdirs.api.PlatformDirsABC.version>`, `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`.
+
"""
@property
@@ -43,7 +45,7 @@ class Android(PlatformDirsABC):
@property
def user_cache_dir(self) -> str:
- """:return: cache directory tied to the user, e.g. e.g. ``/data/user/<userid>/<packagename>/cache/<AppName>``"""
+ """:return: cache directory tied to the user, e.g.,``/data/user/<userid>/<packagename>/cache/<AppName>``"""
return self._append_app_name_and_version(cast(str, _android_folder()), "cache")
@property
@@ -93,6 +95,11 @@ class Android(PlatformDirsABC):
return _android_music_folder()
@property
+ def user_desktop_dir(self) -> str:
+ """:return: desktop directory tied to the user e.g. ``/storage/emulated/0/Desktop``"""
+ return "/storage/emulated/0/Desktop"
+
+ @property
def user_runtime_dir(self) -> str:
"""
:return: runtime directory tied to the user, same as `user_cache_dir` if not opinionated else ``tmp`` in it,
@@ -103,18 +110,23 @@ class Android(PlatformDirsABC):
path = os.path.join(path, "tmp") # noqa: PTH118
return path
+ @property
+ def site_runtime_dir(self) -> str:
+ """:return: runtime directory shared by users, same as `user_runtime_dir`"""
+ return self.user_runtime_dir
+
@lru_cache(maxsize=1)
def _android_folder() -> str | None:
""":return: base folder for the Android OS or None if it cannot be found"""
try:
- # First try to get path to android app via pyjnius
- from jnius import autoclass
+ # First try to get a path to android app via pyjnius
+ from jnius import autoclass # noqa: PLC0415
context = autoclass("android.content.Context")
result: str | None = context.getFilesDir().getParentFile().getAbsolutePath()
except Exception: # noqa: BLE001
- # if fails find an android folder looking path on the sys.path
+ # if fails find an android folder looking a path on the sys.path
pattern = re.compile(r"/data/(data|user/\d+)/(.+)/files")
for path in sys.path:
if pattern.match(path):
@@ -130,7 +142,7 @@ def _android_documents_folder() -> str:
""":return: documents folder for the Android OS"""
# Get directories with pyjnius
try:
- from jnius import autoclass
+ from jnius import autoclass # noqa: PLC0415
context = autoclass("android.content.Context")
environment = autoclass("android.os.Environment")
@@ -146,7 +158,7 @@ def _android_downloads_folder() -> str:
""":return: downloads folder for the Android OS"""
# Get directories with pyjnius
try:
- from jnius import autoclass
+ from jnius import autoclass # noqa: PLC0415
context = autoclass("android.content.Context")
environment = autoclass("android.os.Environment")
@@ -162,7 +174,7 @@ def _android_pictures_folder() -> str:
""":return: pictures folder for the Android OS"""
# Get directories with pyjnius
try:
- from jnius import autoclass
+ from jnius import autoclass # noqa: PLC0415
context = autoclass("android.content.Context")
environment = autoclass("android.os.Environment")
@@ -178,7 +190,7 @@ def _android_videos_folder() -> str:
""":return: videos folder for the Android OS"""
# Get directories with pyjnius
try:
- from jnius import autoclass
+ from jnius import autoclass # noqa: PLC0415
context = autoclass("android.content.Context")
environment = autoclass("android.os.Environment")
@@ -194,7 +206,7 @@ def _android_music_folder() -> str:
""":return: music folder for the Android OS"""
# Get directories with pyjnius
try:
- from jnius import autoclass
+ from jnius import autoclass # noqa: PLC0415
context = autoclass("android.content.Context")
environment = autoclass("android.os.Environment")
diff --git a/contrib/python/pip/pip/_vendor/platformdirs/api.py b/contrib/python/pip/pip/_vendor/platformdirs/api.py
index d64ebb9d45..c50caa648a 100644
--- a/contrib/python/pip/pip/_vendor/platformdirs/api.py
+++ b/contrib/python/pip/pip/_vendor/platformdirs/api.py
@@ -1,4 +1,5 @@
"""Base API."""
+
from __future__ import annotations
import os
@@ -7,18 +8,13 @@ from pathlib import Path
from typing import TYPE_CHECKING
if TYPE_CHECKING:
- import sys
-
- if sys.version_info >= (3, 8): # pragma: no cover (py38+)
- from typing import Literal
- else: # pragma: no cover (py38+)
- from pip._vendor.typing_extensions import Literal
+ from typing import Iterator, Literal
-class PlatformDirsABC(ABC):
+class PlatformDirsABC(ABC): # noqa: PLR0904
"""Abstract base class for platform directories."""
- def __init__( # noqa: PLR0913
+ def __init__( # noqa: PLR0913, PLR0917
self,
appname: str | None = None,
appauthor: str | None | Literal[False] = None,
@@ -38,34 +34,47 @@ class PlatformDirsABC(ABC):
:param multipath: See `multipath`.
:param opinion: See `opinion`.
:param ensure_exists: See `ensure_exists`.
+
"""
self.appname = appname #: The name of application.
self.appauthor = appauthor
"""
- The name of the app author or distributing body for this application. Typically, it is the owning company name.
- Defaults to `appname`. You may pass ``False`` to disable it.
+ The name of the app author or distributing body for this application.
+
+ Typically, it is the owning company name. Defaults to `appname`. You may pass ``False`` to disable it.
+
"""
self.version = version
"""
- An optional version path element to append to the path. You might want to use this if you want multiple versions
- of your app to be able to run independently. If used, this would typically be ``<major>.<minor>``.
+ An optional version path element to append to the path.
+
+ You might want to use this if you want multiple versions of your app to be able to run independently. If used,
+ this would typically be ``<major>.<minor>``.
+
"""
self.roaming = roaming
"""
- Whether to use the roaming appdata directory on Windows. That means that for users on a Windows network setup
- for roaming profiles, this user data will be synced on login (see
- `here <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>`_).
+ Whether to use the roaming appdata directory on Windows.
+
+ That means that for users on a Windows network setup for roaming profiles, this user data will be synced on
+ login (see
+ `here <https://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>`_).
+
"""
self.multipath = multipath
"""
- An optional parameter only applicable to Unix/Linux which indicates that the entire list of data dirs should be
- returned. By default, the first item would only be returned.
+ An optional parameter which indicates that the entire list of data dirs should be returned.
+
+ By default, the first item would only be returned.
+
"""
self.opinion = opinion #: A flag to indicating to use opinionated values.
self.ensure_exists = ensure_exists
"""
Optionally create the directory (and any missing parents) upon access if it does not exist.
+
By default, no directories are created.
+
"""
def _append_app_name_and_version(self, *base: str) -> str:
@@ -149,10 +158,20 @@ class PlatformDirsABC(ABC):
@property
@abstractmethod
+ def user_desktop_dir(self) -> str:
+ """:return: desktop directory tied to the user"""
+
+ @property
+ @abstractmethod
def user_runtime_dir(self) -> str:
""":return: runtime directory tied to the user"""
@property
+ @abstractmethod
+ def site_runtime_dir(self) -> str:
+ """:return: runtime directory shared by users"""
+
+ @property
def user_data_path(self) -> Path:
""":return: data path tied to the user"""
return Path(self.user_data_dir)
@@ -194,7 +213,7 @@ class PlatformDirsABC(ABC):
@property
def user_documents_path(self) -> Path:
- """:return: documents path tied to the user"""
+ """:return: documents a path tied to the user"""
return Path(self.user_documents_dir)
@property
@@ -218,6 +237,56 @@ class PlatformDirsABC(ABC):
return Path(self.user_music_dir)
@property
+ def user_desktop_path(self) -> Path:
+ """:return: desktop path tied to the user"""
+ return Path(self.user_desktop_dir)
+
+ @property
def user_runtime_path(self) -> Path:
""":return: runtime path tied to the user"""
return Path(self.user_runtime_dir)
+
+ @property
+ def site_runtime_path(self) -> Path:
+ """:return: runtime path shared by users"""
+ return Path(self.site_runtime_dir)
+
+ def iter_config_dirs(self) -> Iterator[str]:
+ """:yield: all user and site configuration directories."""
+ yield self.user_config_dir
+ yield self.site_config_dir
+
+ def iter_data_dirs(self) -> Iterator[str]:
+ """:yield: all user and site data directories."""
+ yield self.user_data_dir
+ yield self.site_data_dir
+
+ def iter_cache_dirs(self) -> Iterator[str]:
+ """:yield: all user and site cache directories."""
+ yield self.user_cache_dir
+ yield self.site_cache_dir
+
+ def iter_runtime_dirs(self) -> Iterator[str]:
+ """:yield: all user and site runtime directories."""
+ yield self.user_runtime_dir
+ yield self.site_runtime_dir
+
+ def iter_config_paths(self) -> Iterator[Path]:
+ """:yield: all user and site configuration paths."""
+ for path in self.iter_config_dirs():
+ yield Path(path)
+
+ def iter_data_paths(self) -> Iterator[Path]:
+ """:yield: all user and site data paths."""
+ for path in self.iter_data_dirs():
+ yield Path(path)
+
+ def iter_cache_paths(self) -> Iterator[Path]:
+ """:yield: all user and site cache paths."""
+ for path in self.iter_cache_dirs():
+ yield Path(path)
+
+ def iter_runtime_paths(self) -> Iterator[Path]:
+ """:yield: all user and site runtime paths."""
+ for path in self.iter_runtime_dirs():
+ yield Path(path)
diff --git a/contrib/python/pip/pip/_vendor/platformdirs/macos.py b/contrib/python/pip/pip/_vendor/platformdirs/macos.py
index a753e2a3aa..eb1ba5df1d 100644
--- a/contrib/python/pip/pip/_vendor/platformdirs/macos.py
+++ b/contrib/python/pip/pip/_vendor/platformdirs/macos.py
@@ -1,18 +1,23 @@
"""macOS."""
+
from __future__ import annotations
import os.path
+import sys
from .api import PlatformDirsABC
class MacOS(PlatformDirsABC):
"""
- Platform directories for the macOS operating system. Follows the guidance from `Apple documentation
- <https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/MacOSXDirectories/MacOSXDirectories.html>`_.
+ Platform directories for the macOS operating system.
+
+ Follows the guidance from
+ `Apple documentation <https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/MacOSXDirectories/MacOSXDirectories.html>`_.
Makes use of the `appname <platformdirs.api.PlatformDirsABC.appname>`,
`version <platformdirs.api.PlatformDirsABC.version>`,
`ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`.
+
"""
@property
@@ -22,8 +27,20 @@ class MacOS(PlatformDirsABC):
@property
def site_data_dir(self) -> str:
- """:return: data directory shared by users, e.g. ``/Library/Application Support/$appname/$version``"""
- return self._append_app_name_and_version("/Library/Application Support")
+ """
+ :return: data directory shared by users, e.g. ``/Library/Application Support/$appname/$version``.
+ If we're using a Python binary managed by `Homebrew <https://brew.sh>`_, the directory
+ will be under the Homebrew prefix, e.g. ``/opt/homebrew/share/$appname/$version``.
+ If `multipath <platformdirs.api.PlatformDirsABC.multipath>` is enabled, and we're in Homebrew,
+ the response is a multi-path string separated by ":", e.g.
+ ``/opt/homebrew/share/$appname/$version:/Library/Application Support/$appname/$version``
+ """
+ is_homebrew = sys.prefix.startswith("/opt/homebrew")
+ path_list = [self._append_app_name_and_version("/opt/homebrew/share")] if is_homebrew else []
+ path_list.append(self._append_app_name_and_version("/Library/Application Support"))
+ if self.multipath:
+ return os.pathsep.join(path_list)
+ return path_list[0]
@property
def user_config_dir(self) -> str:
@@ -42,8 +59,20 @@ class MacOS(PlatformDirsABC):
@property
def site_cache_dir(self) -> str:
- """:return: cache directory shared by users, e.g. ``/Library/Caches/$appname/$version``"""
- return self._append_app_name_and_version("/Library/Caches")
+ """
+ :return: cache directory shared by users, e.g. ``/Library/Caches/$appname/$version``.
+ If we're using a Python binary managed by `Homebrew <https://brew.sh>`_, the directory
+ will be under the Homebrew prefix, e.g. ``/opt/homebrew/var/cache/$appname/$version``.
+ If `multipath <platformdirs.api.PlatformDirsABC.multipath>` is enabled, and we're in Homebrew,
+ the response is a multi-path string separated by ":", e.g.
+ ``/opt/homebrew/var/cache/$appname/$version:/Library/Caches/$appname/$version``
+ """
+ is_homebrew = sys.prefix.startswith("/opt/homebrew")
+ path_list = [self._append_app_name_and_version("/opt/homebrew/var/cache")] if is_homebrew else []
+ path_list.append(self._append_app_name_and_version("/Library/Caches"))
+ if self.multipath:
+ return os.pathsep.join(path_list)
+ return path_list[0]
@property
def user_state_dir(self) -> str:
@@ -81,10 +110,20 @@ class MacOS(PlatformDirsABC):
return os.path.expanduser("~/Music") # noqa: PTH111
@property
+ def user_desktop_dir(self) -> str:
+ """:return: desktop directory tied to the user, e.g. ``~/Desktop``"""
+ return os.path.expanduser("~/Desktop") # noqa: PTH111
+
+ @property
def user_runtime_dir(self) -> str:
""":return: runtime directory tied to the user, e.g. ``~/Library/Caches/TemporaryItems/$appname/$version``"""
return self._append_app_name_and_version(os.path.expanduser("~/Library/Caches/TemporaryItems")) # noqa: PTH111
+ @property
+ def site_runtime_dir(self) -> str:
+ """:return: runtime directory shared by users, same as `user_runtime_dir`"""
+ return self.user_runtime_dir
+
__all__ = [
"MacOS",
diff --git a/contrib/python/pip/pip/_vendor/platformdirs/unix.py b/contrib/python/pip/pip/_vendor/platformdirs/unix.py
index 468b0ab495..9500ade614 100644
--- a/contrib/python/pip/pip/_vendor/platformdirs/unix.py
+++ b/contrib/python/pip/pip/_vendor/platformdirs/unix.py
@@ -1,16 +1,18 @@
"""Unix."""
+
from __future__ import annotations
import os
import sys
from configparser import ConfigParser
from pathlib import Path
+from typing import Iterator, NoReturn
from .api import PlatformDirsABC
if sys.platform == "win32":
- def getuid() -> int:
+ def getuid() -> NoReturn:
msg = "should only be used on Unix"
raise RuntimeError(msg)
@@ -18,17 +20,17 @@ else:
from os import getuid
-class Unix(PlatformDirsABC):
+class Unix(PlatformDirsABC): # noqa: PLR0904
"""
- On Unix/Linux, we follow the
- `XDG Basedir Spec <https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html>`_. The spec allows
- overriding directories with environment variables. The examples show are the default values, alongside the name of
- the environment variable that overrides them. Makes use of the
- `appname <platformdirs.api.PlatformDirsABC.appname>`,
- `version <platformdirs.api.PlatformDirsABC.version>`,
- `multipath <platformdirs.api.PlatformDirsABC.multipath>`,
- `opinion <platformdirs.api.PlatformDirsABC.opinion>`,
- `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`.
+ On Unix/Linux, we follow the `XDG Basedir Spec <https://specifications.freedesktop.org/basedir-spec/basedir-spec-
+ latest.html>`_.
+
+ The spec allows overriding directories with environment variables. The examples shown are the default values,
+ alongside the name of the environment variable that overrides them. Makes use of the `appname
+ <platformdirs.api.PlatformDirsABC.appname>`, `version <platformdirs.api.PlatformDirsABC.version>`, `multipath
+ <platformdirs.api.PlatformDirsABC.multipath>`, `opinion <platformdirs.api.PlatformDirsABC.opinion>`, `ensure_exists
+ <platformdirs.api.PlatformDirsABC.ensure_exists>`.
+
"""
@property
@@ -43,24 +45,24 @@ class Unix(PlatformDirsABC):
return self._append_app_name_and_version(path)
@property
+ def _site_data_dirs(self) -> list[str]:
+ path = os.environ.get("XDG_DATA_DIRS", "")
+ if not path.strip():
+ path = f"/usr/local/share{os.pathsep}/usr/share"
+ return [self._append_app_name_and_version(p) for p in path.split(os.pathsep)]
+
+ @property
def site_data_dir(self) -> str:
"""
:return: data directories shared by users (if `multipath <platformdirs.api.PlatformDirsABC.multipath>` is
- enabled and ``XDG_DATA_DIR`` is set and a multi path the response is also a multi path separated by the OS
- path separator), e.g. ``/usr/local/share/$appname/$version`` or ``/usr/share/$appname/$version``
+ enabled and ``XDG_DATA_DIRS`` is set and a multi path the response is also a multi path separated by the
+ OS path separator), e.g. ``/usr/local/share/$appname/$version`` or ``/usr/share/$appname/$version``
"""
# XDG default for $XDG_DATA_DIRS; only first, if multipath is False
- path = os.environ.get("XDG_DATA_DIRS", "")
- if not path.strip():
- path = f"/usr/local/share{os.pathsep}/usr/share"
- return self._with_multi_path(path)
-
- def _with_multi_path(self, path: str) -> str:
- path_list = path.split(os.pathsep)
+ dirs = self._site_data_dirs
if not self.multipath:
- path_list = path_list[0:1]
- path_list = [self._append_app_name_and_version(os.path.expanduser(p)) for p in path_list] # noqa: PTH111
- return os.pathsep.join(path_list)
+ return dirs[0]
+ return os.pathsep.join(dirs)
@property
def user_config_dir(self) -> str:
@@ -74,17 +76,24 @@ class Unix(PlatformDirsABC):
return self._append_app_name_and_version(path)
@property
+ def _site_config_dirs(self) -> list[str]:
+ path = os.environ.get("XDG_CONFIG_DIRS", "")
+ if not path.strip():
+ path = "/etc/xdg"
+ return [self._append_app_name_and_version(p) for p in path.split(os.pathsep)]
+
+ @property
def site_config_dir(self) -> str:
"""
:return: config directories shared by users (if `multipath <platformdirs.api.PlatformDirsABC.multipath>`
- is enabled and ``XDG_DATA_DIR`` is set and a multi path the response is also a multi path separated by the OS
- path separator), e.g. ``/etc/xdg/$appname/$version``
+ is enabled and ``XDG_CONFIG_DIRS`` is set and a multi path the response is also a multi path separated by
+ the OS path separator), e.g. ``/etc/xdg/$appname/$version``
"""
# XDG default for $XDG_CONFIG_DIRS only first, if multipath is False
- path = os.environ.get("XDG_CONFIG_DIRS", "")
- if not path.strip():
- path = "/etc/xdg"
- return self._with_multi_path(path)
+ dirs = self._site_config_dirs
+ if not self.multipath:
+ return dirs[0]
+ return os.pathsep.join(dirs)
@property
def user_cache_dir(self) -> str:
@@ -99,8 +108,8 @@ class Unix(PlatformDirsABC):
@property
def site_cache_dir(self) -> str:
- """:return: cache directory shared by users, e.g. ``/var/tmp/$appname/$version``"""
- return self._append_app_name_and_version("/var/tmp") # noqa: S108
+ """:return: cache directory shared by users, e.g. ``/var/cache/$appname/$version``"""
+ return self._append_app_name_and_version("/var/cache")
@property
def user_state_dir(self) -> str:
@@ -119,6 +128,7 @@ class Unix(PlatformDirsABC):
path = self.user_state_dir
if self.opinion:
path = os.path.join(path, "log") # noqa: PTH118
+ self._optionally_create_directory(path)
return path
@property
@@ -147,6 +157,11 @@ class Unix(PlatformDirsABC):
return _get_user_media_dir("XDG_MUSIC_DIR", "~/Music")
@property
+ def user_desktop_dir(self) -> str:
+ """:return: desktop directory tied to the user, e.g. ``~/Desktop``"""
+ return _get_user_media_dir("XDG_DESKTOP_DIR", "~/Desktop")
+
+ @property
def user_runtime_dir(self) -> str:
"""
:return: runtime directory tied to the user, e.g. ``/run/user/$(id -u)/$appname/$version`` or
@@ -167,18 +182,40 @@ class Unix(PlatformDirsABC):
return self._append_app_name_and_version(path)
@property
+ def site_runtime_dir(self) -> str:
+ """
+ :return: runtime directory shared by users, e.g. ``/run/$appname/$version`` or \
+ ``$XDG_RUNTIME_DIR/$appname/$version``.
+
+ Note that this behaves almost exactly like `user_runtime_dir` if ``$XDG_RUNTIME_DIR`` is set, but will
+ fall back to paths associated to the root user instead of a regular logged-in user if it's not set.
+
+ If you wish to ensure that a logged-in root user path is returned e.g. ``/run/user/0``, use `user_runtime_dir`
+ instead.
+
+ For FreeBSD/OpenBSD/NetBSD, it would return ``/var/run/$appname/$version`` if ``$XDG_RUNTIME_DIR`` is not set.
+ """
+ path = os.environ.get("XDG_RUNTIME_DIR", "")
+ if not path.strip():
+ if sys.platform.startswith(("freebsd", "openbsd", "netbsd")):
+ path = "/var/run"
+ else:
+ path = "/run"
+ return self._append_app_name_and_version(path)
+
+ @property
def site_data_path(self) -> Path:
- """:return: data path shared by users. Only return first item, even if ``multipath`` is set to ``True``"""
+ """:return: data path shared by users. Only return the first item, even if ``multipath`` is set to ``True``"""
return self._first_item_as_path_if_multipath(self.site_data_dir)
@property
def site_config_path(self) -> Path:
- """:return: config path shared by the users. Only return first item, even if ``multipath`` is set to ``True``"""
+ """:return: config path shared by the users, returns the first item, even if ``multipath`` is set to ``True``"""
return self._first_item_as_path_if_multipath(self.site_config_dir)
@property
def site_cache_path(self) -> Path:
- """:return: cache path shared by users. Only return first item, even if ``multipath`` is set to ``True``"""
+ """:return: cache path shared by users. Only return the first item, even if ``multipath`` is set to ``True``"""
return self._first_item_as_path_if_multipath(self.site_cache_dir)
def _first_item_as_path_if_multipath(self, directory: str) -> Path:
@@ -187,6 +224,16 @@ class Unix(PlatformDirsABC):
directory = directory.split(os.pathsep)[0]
return Path(directory)
+ def iter_config_dirs(self) -> Iterator[str]:
+ """:yield: all user and site configuration directories."""
+ yield self.user_config_dir
+ yield from self._site_config_dirs
+
+ def iter_data_dirs(self) -> Iterator[str]:
+ """:yield: all user and site data directories."""
+ yield self.user_data_dir
+ yield from self._site_data_dirs
+
def _get_user_media_dir(env_var: str, fallback_tilde_path: str) -> str:
media_dir = _get_user_dirs_folder(env_var)
@@ -199,7 +246,12 @@ def _get_user_media_dir(env_var: str, fallback_tilde_path: str) -> str:
def _get_user_dirs_folder(key: str) -> str | None:
- """Return directory from user-dirs.dirs config file. See https://freedesktop.org/wiki/Software/xdg-user-dirs/."""
+ """
+ Return directory from user-dirs.dirs config file.
+
+ See https://freedesktop.org/wiki/Software/xdg-user-dirs/.
+
+ """
user_dirs_config_path = Path(Unix().user_config_dir) / "user-dirs.dirs"
if user_dirs_config_path.exists():
parser = ConfigParser()
diff --git a/contrib/python/pip/pip/_vendor/platformdirs/version.py b/contrib/python/pip/pip/_vendor/platformdirs/version.py
index dc8c44cf7b..c418cd0c9a 100644
--- a/contrib/python/pip/pip/_vendor/platformdirs/version.py
+++ b/contrib/python/pip/pip/_vendor/platformdirs/version.py
@@ -1,4 +1,16 @@
# file generated by setuptools_scm
# don't change, don't track in version control
-__version__ = version = '3.8.1'
-__version_tuple__ = version_tuple = (3, 8, 1)
+TYPE_CHECKING = False
+if TYPE_CHECKING:
+ from typing import Tuple, Union
+ VERSION_TUPLE = Tuple[Union[int, str], ...]
+else:
+ VERSION_TUPLE = object
+
+version: str
+__version__: str
+__version_tuple__: VERSION_TUPLE
+version_tuple: VERSION_TUPLE
+
+__version__ = version = '4.2.1'
+__version_tuple__ = version_tuple = (4, 2, 1)
diff --git a/contrib/python/pip/pip/_vendor/platformdirs/windows.py b/contrib/python/pip/pip/_vendor/platformdirs/windows.py
index b52c9c6ea8..d7bc96091a 100644
--- a/contrib/python/pip/pip/_vendor/platformdirs/windows.py
+++ b/contrib/python/pip/pip/_vendor/platformdirs/windows.py
@@ -1,7 +1,7 @@
"""Windows."""
+
from __future__ import annotations
-import ctypes
import os
import sys
from functools import lru_cache
@@ -15,15 +15,13 @@ if TYPE_CHECKING:
class Windows(PlatformDirsABC):
"""
- `MSDN on where to store app data files
- <http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120>`_.
- Makes use of the
- `appname <platformdirs.api.PlatformDirsABC.appname>`,
- `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`,
- `version <platformdirs.api.PlatformDirsABC.version>`,
- `roaming <platformdirs.api.PlatformDirsABC.roaming>`,
- `opinion <platformdirs.api.PlatformDirsABC.opinion>`,
- `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`.
+ `MSDN on where to store app data files <https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid>`_.
+
+ Makes use of the `appname <platformdirs.api.PlatformDirsABC.appname>`, `appauthor
+ <platformdirs.api.PlatformDirsABC.appauthor>`, `version <platformdirs.api.PlatformDirsABC.version>`, `roaming
+ <platformdirs.api.PlatformDirsABC.roaming>`, `opinion <platformdirs.api.PlatformDirsABC.opinion>`, `ensure_exists
+ <platformdirs.api.PlatformDirsABC.ensure_exists>`.
+
"""
@property
@@ -123,6 +121,11 @@ class Windows(PlatformDirsABC):
return os.path.normpath(get_win_folder("CSIDL_MYMUSIC"))
@property
+ def user_desktop_dir(self) -> str:
+ """:return: desktop directory tied to the user, e.g. ``%USERPROFILE%\\Desktop``"""
+ return os.path.normpath(get_win_folder("CSIDL_DESKTOPDIRECTORY"))
+
+ @property
def user_runtime_dir(self) -> str:
"""
:return: runtime directory tied to the user, e.g.
@@ -131,6 +134,11 @@ class Windows(PlatformDirsABC):
path = os.path.normpath(os.path.join(get_win_folder("CSIDL_LOCAL_APPDATA"), "Temp")) # noqa: PTH118
return self._append_parts(path)
+ @property
+ def site_runtime_dir(self) -> str:
+ """:return: runtime directory shared by users, same as `user_runtime_dir`"""
+ return self.user_runtime_dir
+
def get_win_folder_from_env_vars(csidl_name: str) -> str:
"""Get folder from environment variables."""
@@ -154,7 +162,7 @@ def get_win_folder_from_env_vars(csidl_name: str) -> str:
def get_win_folder_if_csidl_name_not_env_var(csidl_name: str) -> str | None:
- """Get folder for a CSIDL name that does not exist as an environment variable."""
+ """Get a folder for a CSIDL name that does not exist as an environment variable."""
if csidl_name == "CSIDL_PERSONAL":
return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Documents") # noqa: PTH118
@@ -178,6 +186,7 @@ def get_win_folder_from_registry(csidl_name: str) -> str:
This is a fallback technique at best. I'm not sure if using the registry for these guarantees us the correct answer
for all CSIDL_* names.
+
"""
shell_folder_name = {
"CSIDL_APPDATA": "AppData",
@@ -194,7 +203,7 @@ def get_win_folder_from_registry(csidl_name: str) -> str:
raise ValueError(msg)
if sys.platform != "win32": # only needed for mypy type checker to know that this code runs only on Windows
raise NotImplementedError
- import winreg
+ import winreg # noqa: PLC0415
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders")
directory, _ = winreg.QueryValueEx(key, shell_folder_name)
@@ -207,6 +216,8 @@ def get_win_folder_via_ctypes(csidl_name: str) -> str:
# Use 'CSIDL_PROFILE' (40) and append the default folder 'Downloads' instead.
# https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid
+ import ctypes # noqa: PLC0415
+
csidl_const = {
"CSIDL_APPDATA": 26,
"CSIDL_COMMON_APPDATA": 35,
@@ -216,6 +227,7 @@ def get_win_folder_via_ctypes(csidl_name: str) -> str:
"CSIDL_MYVIDEO": 14,
"CSIDL_MYMUSIC": 13,
"CSIDL_DOWNLOADS": 40,
+ "CSIDL_DESKTOPDIRECTORY": 16,
}.get(csidl_name)
if csidl_const is None:
msg = f"Unknown CSIDL name: {csidl_name}"
@@ -225,7 +237,7 @@ def get_win_folder_via_ctypes(csidl_name: str) -> str:
windll = getattr(ctypes, "windll") # noqa: B009 # using getattr to avoid false positive with mypy type checker
windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf)
- # Downgrade to short path name if it has highbit chars.
+ # Downgrade to short path name if it has high-bit chars.
if any(ord(c) > 255 for c in buf): # noqa: PLR2004
buf2 = ctypes.create_unicode_buffer(1024)
if windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024):
@@ -238,10 +250,15 @@ def get_win_folder_via_ctypes(csidl_name: str) -> str:
def _pick_get_win_folder() -> Callable[[str], str]:
- if hasattr(ctypes, "windll"):
- return get_win_folder_via_ctypes
try:
- import winreg # noqa: F401
+ import ctypes # noqa: PLC0415
+ except ImportError:
+ pass
+ else:
+ if hasattr(ctypes, "windll"):
+ return get_win_folder_via_ctypes
+ try:
+ import winreg # noqa: PLC0415, F401
except ImportError:
return get_win_folder_from_env_vars
else:
diff --git a/contrib/python/pip/pip/_vendor/pygments/__init__.py b/contrib/python/pip/pip/_vendor/pygments/__init__.py
index 39c84aae5d..5b8a3f9548 100644
--- a/contrib/python/pip/pip/_vendor/pygments/__init__.py
+++ b/contrib/python/pip/pip/_vendor/pygments/__init__.py
@@ -26,7 +26,7 @@
"""
from io import StringIO, BytesIO
-__version__ = '2.15.1'
+__version__ = '2.17.2'
__docformat__ = 'restructuredtext'
__all__ = ['lex', 'format', 'highlight']
diff --git a/contrib/python/pip/pip/_vendor/pygments/cmdline.py b/contrib/python/pip/pip/_vendor/pygments/cmdline.py
index eec1775ba5..29b5608f33 100644
--- a/contrib/python/pip/pip/_vendor/pygments/cmdline.py
+++ b/contrib/python/pip/pip/_vendor/pygments/cmdline.py
@@ -469,11 +469,11 @@ def main_inner(parser, argns):
outfile = UnclosingTextIOWrapper(outfile, encoding=fmter.encoding)
fmter.encoding = None
try:
- import pip._vendor.colorama.initialise as colorama_initialise
+ import colorama.initialise
except ImportError:
pass
else:
- outfile = colorama_initialise.wrap_stream(
+ outfile = colorama.initialise.wrap_stream(
outfile, convert=None, strip=None, autoreset=False, wrap=True)
# When using the LaTeX formatter and the option `escapeinside` is
diff --git a/contrib/python/pip/pip/_vendor/pygments/formatters/__init__.py b/contrib/python/pip/pip/_vendor/pygments/formatters/__init__.py
index 39db84262d..6abb45ac71 100644
--- a/contrib/python/pip/pip/_vendor/pygments/formatters/__init__.py
+++ b/contrib/python/pip/pip/_vendor/pygments/formatters/__init__.py
@@ -131,7 +131,7 @@ def get_formatter_for_filename(fn, **options):
if name not in _formatter_cache:
_load_formatters(modname)
return _formatter_cache[name](**options)
- for cls in find_plugin_formatters():
+ for _name, cls in find_plugin_formatters():
for filename in cls.filenames:
if _fn_matches(fn, filename):
return cls(**options)
diff --git a/contrib/python/pip/pip/_vendor/pygments/formatters/html.py b/contrib/python/pip/pip/_vendor/pygments/formatters/html.py
index 931d7c3fe2..0cadcb228e 100644
--- a/contrib/python/pip/pip/_vendor/pygments/formatters/html.py
+++ b/contrib/python/pip/pip/_vendor/pygments/formatters/html.py
@@ -323,6 +323,7 @@ class HtmlFormatter(Formatter):
If set to the path of a ctags file, wrap names in anchor tags that
link to their definitions. `lineanchors` should be used, and the
tags file should specify line numbers (see the `-n` option to ctags).
+ The tags file is assumed to be encoded in UTF-8.
.. versionadded:: 1.6
@@ -908,7 +909,7 @@ class HtmlFormatter(Formatter):
def _lookup_ctag(self, token):
entry = ctags.TagEntry()
if self._ctags.find(entry, token.encode(), 0):
- return entry['file'], entry['lineNumber']
+ return entry['file'].decode(), entry['lineNumber']
else:
return None, None
diff --git a/contrib/python/pip/pip/_vendor/pygments/formatters/img.py b/contrib/python/pip/pip/_vendor/pygments/formatters/img.py
index a338c1588f..9e66b66916 100644
--- a/contrib/python/pip/pip/_vendor/pygments/formatters/img.py
+++ b/contrib/python/pip/pip/_vendor/pygments/formatters/img.py
@@ -7,7 +7,6 @@
:copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
-
import os
import sys
@@ -68,6 +67,15 @@ class FontManager:
self.font_size = font_size
self.fonts = {}
self.encoding = None
+ self.variable = False
+ if hasattr(font_name, 'read') or os.path.isfile(font_name):
+ font = ImageFont.truetype(font_name, self.font_size)
+ self.variable = True
+ for style in STYLES:
+ self.fonts[style] = font
+
+ return
+
if sys.platform.startswith('win'):
if not font_name:
self.font_name = DEFAULT_FONT_NAME_WIN
@@ -223,14 +231,43 @@ class FontManager:
Get the font based on bold and italic flags.
"""
if bold and oblique:
+ if self.variable:
+ return self.get_style('BOLDITALIC')
+
return self.fonts['BOLDITALIC']
elif bold:
+ if self.variable:
+ return self.get_style('BOLD')
+
return self.fonts['BOLD']
elif oblique:
+ if self.variable:
+ return self.get_style('ITALIC')
+
return self.fonts['ITALIC']
else:
+ if self.variable:
+ return self.get_style('NORMAL')
+
return self.fonts['NORMAL']
+ def get_style(self, style):
+ """
+ Get the specified style of the font if it is a variable font.
+ If not found, return the normal font.
+ """
+ font = self.fonts[style]
+ for style_name in STYLES[style]:
+ try:
+ font.set_variation_by_name(style_name)
+ return font
+ except ValueError:
+ pass
+ except OSError:
+ return font
+
+ return font
+
class ImageFormatter(Formatter):
"""
@@ -258,6 +295,8 @@ class ImageFormatter(Formatter):
The font name to be used as the base font from which others, such as
bold and italic fonts will be generated. This really should be a
monospace font to look sane.
+ If a filename or a file-like object is specified, the user must
+ provide different styles of the font.
Default: "Courier New" on Windows, "Menlo" on Mac OS, and
"DejaVu Sans Mono" on \\*nix
diff --git a/contrib/python/pip/pip/_vendor/pygments/lexer.py b/contrib/python/pip/pip/_vendor/pygments/lexer.py
index eb2c1b46b6..26c5fb31ff 100644
--- a/contrib/python/pip/pip/_vendor/pygments/lexer.py
+++ b/contrib/python/pip/pip/_vendor/pygments/lexer.py
@@ -72,6 +72,11 @@ class Lexer(metaclass=LexerMeta):
.. autoattribute:: url
:no-value:
+ Lexers included in Pygments may have additional attributes:
+
+ .. autoattribute:: _example
+ :no-value:
+
You can pass options to the constructor. The basic options recognized
by all lexers and processed by the base `Lexer` class are:
@@ -128,6 +133,10 @@ class Lexer(metaclass=LexerMeta):
#: documentation.
url = None
+ #: Example file name. Relative to the ``tests/examplefiles`` directory.
+ #: This is used by the documentation generator to show an example.
+ _example = None
+
def __init__(self, **options):
"""
This constructor takes arbitrary options as keyword arguments.
@@ -190,26 +199,17 @@ class Lexer(metaclass=LexerMeta):
it's the same as if the return values was ``0.0``.
"""
- def get_tokens(self, text, unfiltered=False):
- """
- This method is the basic interface of a lexer. It is called by
- the `highlight()` function. It must process the text and return an
- iterable of ``(tokentype, value)`` pairs from `text`.
+ def _preprocess_lexer_input(self, text):
+ """Apply preprocessing such as decoding the input, removing BOM and normalizing newlines."""
- Normally, you don't need to override this method. The default
- implementation processes the options recognized by all lexers
- (`stripnl`, `stripall` and so on), and then yields all tokens
- from `get_tokens_unprocessed()`, with the ``index`` dropped.
-
- If `unfiltered` is set to `True`, the filtering mechanism is
- bypassed even if filters are defined.
- """
if not isinstance(text, str):
if self.encoding == 'guess':
text, _ = guess_decode(text)
elif self.encoding == 'chardet':
try:
- from pip._vendor import chardet
+ # pip vendoring note: this code is not reachable by pip,
+ # removed import of chardet to make it clear.
+ raise ImportError('chardet is not vendored by pip')
except ImportError as e:
raise ImportError('To enable chardet encoding guessing, '
'please install the chardet library '
@@ -246,6 +246,24 @@ class Lexer(metaclass=LexerMeta):
if self.ensurenl and not text.endswith('\n'):
text += '\n'
+ return text
+
+ def get_tokens(self, text, unfiltered=False):
+ """
+ This method is the basic interface of a lexer. It is called by
+ the `highlight()` function. It must process the text and return an
+ iterable of ``(tokentype, value)`` pairs from `text`.
+
+ Normally, you don't need to override this method. The default
+ implementation processes the options recognized by all lexers
+ (`stripnl`, `stripall` and so on), and then yields all tokens
+ from `get_tokens_unprocessed()`, with the ``index`` dropped.
+
+ If `unfiltered` is set to `True`, the filtering mechanism is
+ bypassed even if filters are defined.
+ """
+ text = self._preprocess_lexer_input(text)
+
def streamer():
for _, t, v in self.get_tokens_unprocessed(text):
yield t, v
diff --git a/contrib/python/pip/pip/_vendor/pygments/lexers/__init__.py b/contrib/python/pip/pip/_vendor/pygments/lexers/__init__.py
index d97c3e395e..0c176dfbfd 100644
--- a/contrib/python/pip/pip/_vendor/pygments/lexers/__init__.py
+++ b/contrib/python/pip/pip/_vendor/pygments/lexers/__init__.py
@@ -22,6 +22,7 @@ from pip._vendor.pygments.util import ClassNotFound, guess_decode
COMPAT = {
'Python3Lexer': 'PythonLexer',
'Python3TracebackLexer': 'PythonTracebackLexer',
+ 'LeanLexer': 'Lean3Lexer',
}
__all__ = ['get_lexer_by_name', 'get_lexer_for_filename', 'find_lexer_class',
diff --git a/contrib/python/pip/pip/_vendor/pygments/lexers/_mapping.py b/contrib/python/pip/pip/_vendor/pygments/lexers/_mapping.py
index de6a0153b7..1ff2b282a1 100644
--- a/contrib/python/pip/pip/_vendor/pygments/lexers/_mapping.py
+++ b/contrib/python/pip/pip/_vendor/pygments/lexers/_mapping.py
@@ -31,7 +31,8 @@ LEXERS = {
'ArduinoLexer': ('pip._vendor.pygments.lexers.c_like', 'Arduino', ('arduino',), ('*.ino',), ('text/x-arduino',)),
'ArrowLexer': ('pip._vendor.pygments.lexers.arrow', 'Arrow', ('arrow',), ('*.arw',), ()),
'ArturoLexer': ('pip._vendor.pygments.lexers.arturo', 'Arturo', ('arturo', 'art'), ('*.art',), ()),
- 'AscLexer': ('pip._vendor.pygments.lexers.asc', 'ASCII armored', ('asc', 'pem'), ('*.asc', '*.pem', 'id_dsa', 'id_ecdsa', 'id_ecdsa_sk', 'id_ed25519', 'id_ed25519_sk', 'id_rsa'), ('application/pgp-keys', 'application/pgp-encrypted', 'application/pgp-signature')),
+ 'AscLexer': ('pip._vendor.pygments.lexers.asc', 'ASCII armored', ('asc', 'pem'), ('*.asc', '*.pem', 'id_dsa', 'id_ecdsa', 'id_ecdsa_sk', 'id_ed25519', 'id_ed25519_sk', 'id_rsa'), ('application/pgp-keys', 'application/pgp-encrypted', 'application/pgp-signature', 'application/pem-certificate-chain')),
+ 'Asn1Lexer': ('pip._vendor.pygments.lexers.asn1', 'ASN.1', ('asn1',), ('*.asn1',), ()),
'AspectJLexer': ('pip._vendor.pygments.lexers.jvm', 'AspectJ', ('aspectj',), ('*.aj',), ('text/x-aspectj',)),
'AsymptoteLexer': ('pip._vendor.pygments.lexers.graphics', 'Asymptote', ('asymptote', 'asy'), ('*.asy',), ('text/x-asymptote',)),
'AugeasLexer': ('pip._vendor.pygments.lexers.configs', 'Augeas', ('augeas',), ('*.aug',), ()),
@@ -41,6 +42,7 @@ LEXERS = {
'BBCBasicLexer': ('pip._vendor.pygments.lexers.basic', 'BBC Basic', ('bbcbasic',), ('*.bbc',), ()),
'BBCodeLexer': ('pip._vendor.pygments.lexers.markup', 'BBCode', ('bbcode',), (), ('text/x-bbcode',)),
'BCLexer': ('pip._vendor.pygments.lexers.algebra', 'BC', ('bc',), ('*.bc',), ()),
+ 'BQNLexer': ('pip._vendor.pygments.lexers.bqn', 'BQN', ('bqn',), ('*.bqn',), ()),
'BSTLexer': ('pip._vendor.pygments.lexers.bibtex', 'BST', ('bst', 'bst-pybtex'), ('*.bst',), ()),
'BareLexer': ('pip._vendor.pygments.lexers.bare', 'BARE', ('bare',), ('*.bare',), ()),
'BaseMakefileLexer': ('pip._vendor.pygments.lexers.make', 'Base Makefile', ('basemake',), (), ()),
@@ -53,6 +55,7 @@ LEXERS = {
'BibTeXLexer': ('pip._vendor.pygments.lexers.bibtex', 'BibTeX', ('bibtex', 'bib'), ('*.bib',), ('text/x-bibtex',)),
'BlitzBasicLexer': ('pip._vendor.pygments.lexers.basic', 'BlitzBasic', ('blitzbasic', 'b3d', 'bplus'), ('*.bb', '*.decls'), ('text/x-bb',)),
'BlitzMaxLexer': ('pip._vendor.pygments.lexers.basic', 'BlitzMax', ('blitzmax', 'bmax'), ('*.bmx',), ('text/x-bmx',)),
+ 'BlueprintLexer': ('pip._vendor.pygments.lexers.blueprint', 'Blueprint', ('blueprint',), ('*.blp',), ('text/x-blueprint',)),
'BnfLexer': ('pip._vendor.pygments.lexers.grammar_notation', 'BNF', ('bnf',), ('*.bnf',), ('text/x-bnf',)),
'BoaLexer': ('pip._vendor.pygments.lexers.boa', 'Boa', ('boa',), ('*.boa',), ()),
'BooLexer': ('pip._vendor.pygments.lexers.dotnet', 'Boo', ('boo',), ('*.boo',), ('text/x-boo',)),
@@ -125,10 +128,12 @@ LEXERS = {
'DaxLexer': ('pip._vendor.pygments.lexers.dax', 'Dax', ('dax',), ('*.dax',), ()),
'DebianControlLexer': ('pip._vendor.pygments.lexers.installers', 'Debian Control file', ('debcontrol', 'control'), ('control',), ()),
'DelphiLexer': ('pip._vendor.pygments.lexers.pascal', 'Delphi', ('delphi', 'pas', 'pascal', 'objectpascal'), ('*.pas', '*.dpr'), ('text/x-pascal',)),
+ 'DesktopLexer': ('pip._vendor.pygments.lexers.configs', 'Desktop file', ('desktop',), ('*.desktop',), ()),
'DevicetreeLexer': ('pip._vendor.pygments.lexers.devicetree', 'Devicetree', ('devicetree', 'dts'), ('*.dts', '*.dtsi'), ('text/x-c',)),
'DgLexer': ('pip._vendor.pygments.lexers.python', 'dg', ('dg',), ('*.dg',), ('text/x-dg',)),
'DiffLexer': ('pip._vendor.pygments.lexers.diff', 'Diff', ('diff', 'udiff'), ('*.diff', '*.patch'), ('text/x-diff', 'text/x-patch')),
'DjangoLexer': ('pip._vendor.pygments.lexers.templates', 'Django/Jinja', ('django', 'jinja'), (), ('application/x-django-templating', 'application/x-jinja')),
+ 'DnsZoneLexer': ('pip._vendor.pygments.lexers.dns', 'Zone', ('zone',), ('*.zone',), ('text/dns',)),
'DockerLexer': ('pip._vendor.pygments.lexers.configs', 'Docker', ('docker', 'dockerfile'), ('Dockerfile', '*.docker'), ('text/x-dockerfile-config',)),
'DtdLexer': ('pip._vendor.pygments.lexers.html', 'DTD', ('dtd',), ('*.dtd',), ('application/xml-dtd',)),
'DuelLexer': ('pip._vendor.pygments.lexers.webmisc', 'Duel', ('duel', 'jbst', 'jsonml+bst'), ('*.duel', '*.jbst'), ('text/x-duel', 'text/x-jbst')),
@@ -190,6 +195,7 @@ LEXERS = {
'GoodDataCLLexer': ('pip._vendor.pygments.lexers.business', 'GoodData-CL', ('gooddata-cl',), ('*.gdc',), ('text/x-gooddata-cl',)),
'GosuLexer': ('pip._vendor.pygments.lexers.jvm', 'Gosu', ('gosu',), ('*.gs', '*.gsx', '*.gsp', '*.vark'), ('text/x-gosu',)),
'GosuTemplateLexer': ('pip._vendor.pygments.lexers.jvm', 'Gosu Template', ('gst',), ('*.gst',), ('text/x-gosu-template',)),
+ 'GraphQLLexer': ('pip._vendor.pygments.lexers.graphql', 'GraphQL', ('graphql',), ('*.graphql',), ()),
'GraphvizLexer': ('pip._vendor.pygments.lexers.graphviz', 'Graphviz', ('graphviz', 'dot'), ('*.gv', '*.dot'), ('text/x-graphviz', 'text/vnd.graphviz')),
'GroffLexer': ('pip._vendor.pygments.lexers.markup', 'Groff', ('groff', 'nroff', 'man'), ('*.[1-9]', '*.man', '*.1p', '*.3pm'), ('application/x-troff', 'text/troff')),
'GroovyLexer': ('pip._vendor.pygments.lexers.jvm', 'Groovy', ('groovy',), ('*.groovy', '*.gradle'), ('text/x-groovy',)),
@@ -219,7 +225,7 @@ LEXERS = {
'Inform6Lexer': ('pip._vendor.pygments.lexers.int_fiction', 'Inform 6', ('inform6', 'i6'), ('*.inf',), ()),
'Inform6TemplateLexer': ('pip._vendor.pygments.lexers.int_fiction', 'Inform 6 template', ('i6t',), ('*.i6t',), ()),
'Inform7Lexer': ('pip._vendor.pygments.lexers.int_fiction', 'Inform 7', ('inform7', 'i7'), ('*.ni', '*.i7x'), ()),
- 'IniLexer': ('pip._vendor.pygments.lexers.configs', 'INI', ('ini', 'cfg', 'dosini'), ('*.ini', '*.cfg', '*.inf', '.editorconfig', '*.service', '*.socket', '*.device', '*.mount', '*.automount', '*.swap', '*.target', '*.path', '*.timer', '*.slice', '*.scope'), ('text/x-ini', 'text/inf')),
+ 'IniLexer': ('pip._vendor.pygments.lexers.configs', 'INI', ('ini', 'cfg', 'dosini'), ('*.ini', '*.cfg', '*.inf', '.editorconfig'), ('text/x-ini', 'text/inf')),
'IoLexer': ('pip._vendor.pygments.lexers.iolang', 'Io', ('io',), ('*.io',), ('text/x-iosrc',)),
'IokeLexer': ('pip._vendor.pygments.lexers.jvm', 'Ioke', ('ioke', 'ik'), ('*.ik',), ('text/x-iokesrc',)),
'IrcLogsLexer': ('pip._vendor.pygments.lexers.textfmts', 'IRC logs', ('irc',), ('*.weechatlog',), ('text/x-irclog',)),
@@ -241,9 +247,10 @@ LEXERS = {
'JsgfLexer': ('pip._vendor.pygments.lexers.grammar_notation', 'JSGF', ('jsgf',), ('*.jsgf',), ('application/jsgf', 'application/x-jsgf', 'text/jsgf')),
'JsonBareObjectLexer': ('pip._vendor.pygments.lexers.data', 'JSONBareObject', (), (), ()),
'JsonLdLexer': ('pip._vendor.pygments.lexers.data', 'JSON-LD', ('jsonld', 'json-ld'), ('*.jsonld',), ('application/ld+json',)),
- 'JsonLexer': ('pip._vendor.pygments.lexers.data', 'JSON', ('json', 'json-object'), ('*.json', 'Pipfile.lock'), ('application/json', 'application/json-object')),
+ 'JsonLexer': ('pip._vendor.pygments.lexers.data', 'JSON', ('json', 'json-object'), ('*.json', '*.jsonl', '*.ndjson', 'Pipfile.lock'), ('application/json', 'application/json-object', 'application/x-ndjson', 'application/jsonl', 'application/json-seq')),
'JsonnetLexer': ('pip._vendor.pygments.lexers.jsonnet', 'Jsonnet', ('jsonnet',), ('*.jsonnet', '*.libsonnet'), ()),
'JspLexer': ('pip._vendor.pygments.lexers.templates', 'Java Server Page', ('jsp',), ('*.jsp',), ('application/x-jsp',)),
+ 'JsxLexer': ('pip._vendor.pygments.lexers.jsx', 'JSX', ('jsx', 'react'), ('*.jsx', '*.react'), ('text/jsx', 'text/typescript-jsx')),
'JuliaConsoleLexer': ('pip._vendor.pygments.lexers.julia', 'Julia console', ('jlcon', 'julia-repl'), (), ()),
'JuliaLexer': ('pip._vendor.pygments.lexers.julia', 'Julia', ('julia', 'jl'), ('*.jl',), ('text/x-julia', 'application/x-julia')),
'JuttleLexer': ('pip._vendor.pygments.lexers.javascript', 'Juttle', ('juttle',), ('*.juttle',), ('application/juttle', 'application/x-juttle', 'text/x-juttle', 'text/juttle')),
@@ -254,13 +261,16 @@ LEXERS = {
'KokaLexer': ('pip._vendor.pygments.lexers.haskell', 'Koka', ('koka',), ('*.kk', '*.kki'), ('text/x-koka',)),
'KotlinLexer': ('pip._vendor.pygments.lexers.jvm', 'Kotlin', ('kotlin',), ('*.kt', '*.kts'), ('text/x-kotlin',)),
'KuinLexer': ('pip._vendor.pygments.lexers.kuin', 'Kuin', ('kuin',), ('*.kn',), ()),
+ 'KustoLexer': ('pip._vendor.pygments.lexers.kusto', 'Kusto', ('kql', 'kusto'), ('*.kql', '*.kusto', '.csl'), ()),
'LSLLexer': ('pip._vendor.pygments.lexers.scripting', 'LSL', ('lsl',), ('*.lsl',), ('text/x-lsl',)),
'LassoCssLexer': ('pip._vendor.pygments.lexers.templates', 'CSS+Lasso', ('css+lasso',), (), ('text/css+lasso',)),
'LassoHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Lasso', ('html+lasso',), (), ('text/html+lasso', 'application/x-httpd-lasso', 'application/x-httpd-lasso[89]')),
'LassoJavascriptLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+Lasso', ('javascript+lasso', 'js+lasso'), (), ('application/x-javascript+lasso', 'text/x-javascript+lasso', 'text/javascript+lasso')),
'LassoLexer': ('pip._vendor.pygments.lexers.javascript', 'Lasso', ('lasso', 'lassoscript'), ('*.lasso', '*.lasso[89]'), ('text/x-lasso',)),
'LassoXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Lasso', ('xml+lasso',), (), ('application/xml+lasso',)),
- 'LeanLexer': ('pip._vendor.pygments.lexers.theorem', 'Lean', ('lean',), ('*.lean',), ('text/x-lean',)),
+ 'LdaprcLexer': ('pip._vendor.pygments.lexers.ldap', 'LDAP configuration file', ('ldapconf', 'ldaprc'), ('.ldaprc', 'ldaprc', 'ldap.conf'), ('text/x-ldapconf',)),
+ 'LdifLexer': ('pip._vendor.pygments.lexers.ldap', 'LDIF', ('ldif',), ('*.ldif',), ('text/x-ldif',)),
+ 'Lean3Lexer': ('pip._vendor.pygments.lexers.lean', 'Lean', ('lean', 'lean3'), ('*.lean',), ('text/x-lean', 'text/x-lean3')),
'LessCssLexer': ('pip._vendor.pygments.lexers.css', 'LessCss', ('less',), ('*.less',), ('text/x-less-css',)),
'LighttpdConfLexer': ('pip._vendor.pygments.lexers.configs', 'Lighttpd configuration file', ('lighttpd', 'lighty'), ('lighttpd.conf',), ('text/x-lighttpd-conf',)),
'LilyPondLexer': ('pip._vendor.pygments.lexers.lilypond', 'LilyPond', ('lilypond',), ('*.ly',), ()),
@@ -351,6 +361,7 @@ LEXERS = {
'OocLexer': ('pip._vendor.pygments.lexers.ooc', 'Ooc', ('ooc',), ('*.ooc',), ('text/x-ooc',)),
'OpaLexer': ('pip._vendor.pygments.lexers.ml', 'Opa', ('opa',), ('*.opa',), ('text/x-opa',)),
'OpenEdgeLexer': ('pip._vendor.pygments.lexers.business', 'OpenEdge ABL', ('openedge', 'abl', 'progress'), ('*.p', '*.cls'), ('text/x-openedge', 'application/x-openedge')),
+ 'OpenScadLexer': ('pip._vendor.pygments.lexers.openscad', 'OpenSCAD', ('openscad',), ('*.scad',), ('application/x-openscad',)),
'OutputLexer': ('pip._vendor.pygments.lexers.special', 'Text output', ('output',), (), ()),
'PacmanConfLexer': ('pip._vendor.pygments.lexers.configs', 'PacmanConf', ('pacmanconf',), ('pacman.conf',), ()),
'PanLexer': ('pip._vendor.pygments.lexers.dsls', 'Pan', ('pan',), ('*.pan',), ()),
@@ -381,14 +392,16 @@ LEXERS = {
'PromQLLexer': ('pip._vendor.pygments.lexers.promql', 'PromQL', ('promql',), ('*.promql',), ()),
'PropertiesLexer': ('pip._vendor.pygments.lexers.configs', 'Properties', ('properties', 'jproperties'), ('*.properties',), ('text/x-java-properties',)),
'ProtoBufLexer': ('pip._vendor.pygments.lexers.dsls', 'Protocol Buffer', ('protobuf', 'proto'), ('*.proto',), ()),
+ 'PrqlLexer': ('pip._vendor.pygments.lexers.prql', 'PRQL', ('prql',), ('*.prql',), ('application/prql', 'application/x-prql')),
'PsyshConsoleLexer': ('pip._vendor.pygments.lexers.php', 'PsySH console session for PHP', ('psysh',), (), ()),
+ 'PtxLexer': ('pip._vendor.pygments.lexers.ptx', 'PTX', ('ptx',), ('*.ptx',), ('text/x-ptx',)),
'PugLexer': ('pip._vendor.pygments.lexers.html', 'Pug', ('pug', 'jade'), ('*.pug', '*.jade'), ('text/x-pug', 'text/x-jade')),
'PuppetLexer': ('pip._vendor.pygments.lexers.dsls', 'Puppet', ('puppet',), ('*.pp',), ()),
'PyPyLogLexer': ('pip._vendor.pygments.lexers.console', 'PyPy Log', ('pypylog', 'pypy'), ('*.pypylog',), ('application/x-pypylog',)),
'Python2Lexer': ('pip._vendor.pygments.lexers.python', 'Python 2.x', ('python2', 'py2'), (), ('text/x-python2', 'application/x-python2')),
'Python2TracebackLexer': ('pip._vendor.pygments.lexers.python', 'Python 2.x Traceback', ('py2tb',), ('*.py2tb',), ('text/x-python2-traceback',)),
'PythonConsoleLexer': ('pip._vendor.pygments.lexers.python', 'Python console session', ('pycon',), (), ('text/x-python-doctest',)),
- 'PythonLexer': ('pip._vendor.pygments.lexers.python', 'Python', ('python', 'py', 'sage', 'python3', 'py3'), ('*.py', '*.pyw', '*.pyi', '*.jy', '*.sage', '*.sc', 'SConstruct', 'SConscript', '*.bzl', 'BUCK', 'BUILD', 'BUILD.bazel', 'WORKSPACE', '*.tac'), ('text/x-python', 'application/x-python', 'text/x-python3', 'application/x-python3')),
+ 'PythonLexer': ('pip._vendor.pygments.lexers.python', 'Python', ('python', 'py', 'sage', 'python3', 'py3', 'bazel', 'starlark'), ('*.py', '*.pyw', '*.pyi', '*.jy', '*.sage', '*.sc', 'SConstruct', 'SConscript', '*.bzl', 'BUCK', 'BUILD', 'BUILD.bazel', 'WORKSPACE', '*.tac'), ('text/x-python', 'application/x-python', 'text/x-python3', 'application/x-python3')),
'PythonTracebackLexer': ('pip._vendor.pygments.lexers.python', 'Python Traceback', ('pytb', 'py3tb'), ('*.pytb', '*.py3tb'), ('text/x-python-traceback', 'text/x-python3-traceback')),
'PythonUL4Lexer': ('pip._vendor.pygments.lexers.ul4', 'Python+UL4', ('py+ul4',), ('*.pyul4',), ()),
'QBasicLexer': ('pip._vendor.pygments.lexers.basic', 'QBasic', ('qbasic', 'basic'), ('*.BAS', '*.bas'), ('text/basic',)),
@@ -477,9 +490,10 @@ LEXERS = {
'SwiftLexer': ('pip._vendor.pygments.lexers.objective', 'Swift', ('swift',), ('*.swift',), ('text/x-swift',)),
'SwigLexer': ('pip._vendor.pygments.lexers.c_like', 'SWIG', ('swig',), ('*.swg', '*.i'), ('text/swig',)),
'SystemVerilogLexer': ('pip._vendor.pygments.lexers.hdl', 'systemverilog', ('systemverilog', 'sv'), ('*.sv', '*.svh'), ('text/x-systemverilog',)),
+ 'SystemdLexer': ('pip._vendor.pygments.lexers.configs', 'Systemd', ('systemd',), ('*.service', '*.socket', '*.device', '*.mount', '*.automount', '*.swap', '*.target', '*.path', '*.timer', '*.slice', '*.scope'), ()),
'TAPLexer': ('pip._vendor.pygments.lexers.testing', 'TAP', ('tap',), ('*.tap',), ()),
'TNTLexer': ('pip._vendor.pygments.lexers.tnt', 'Typographic Number Theory', ('tnt',), ('*.tnt',), ()),
- 'TOMLLexer': ('pip._vendor.pygments.lexers.configs', 'TOML', ('toml',), ('*.toml', 'Pipfile', 'poetry.lock'), ()),
+ 'TOMLLexer': ('pip._vendor.pygments.lexers.configs', 'TOML', ('toml',), ('*.toml', 'Pipfile', 'poetry.lock'), ('application/toml',)),
'Tads3Lexer': ('pip._vendor.pygments.lexers.int_fiction', 'TADS 3', ('tads3',), ('*.t',), ()),
'TalLexer': ('pip._vendor.pygments.lexers.tal', 'Tal', ('tal', 'uxntal'), ('*.tal',), ('text/x-uxntal',)),
'TasmLexer': ('pip._vendor.pygments.lexers.asm', 'TASM', ('tasm',), ('*.asm', '*.ASM', '*.tasm'), ('text/x-tasm',)),
@@ -498,6 +512,7 @@ LEXERS = {
'ThriftLexer': ('pip._vendor.pygments.lexers.dsls', 'Thrift', ('thrift',), ('*.thrift',), ('application/x-thrift',)),
'TiddlyWiki5Lexer': ('pip._vendor.pygments.lexers.markup', 'tiddler', ('tid',), ('*.tid',), ('text/vnd.tiddlywiki',)),
'TlbLexer': ('pip._vendor.pygments.lexers.tlb', 'Tl-b', ('tlb',), ('*.tlb',), ()),
+ 'TlsLexer': ('pip._vendor.pygments.lexers.tls', 'TLS Presentation Language', ('tls',), (), ()),
'TodotxtLexer': ('pip._vendor.pygments.lexers.textfmts', 'Todotxt', ('todotxt',), ('todo.txt', '*.todotxt'), ('text/x-todo',)),
'TransactSqlLexer': ('pip._vendor.pygments.lexers.sql', 'Transact-SQL', ('tsql', 't-sql'), ('*.sql',), ('text/x-tsql',)),
'TreetopLexer': ('pip._vendor.pygments.lexers.parsers', 'Treetop', ('treetop',), ('*.treetop', '*.tt'), ()),
@@ -513,6 +528,7 @@ LEXERS = {
'UniconLexer': ('pip._vendor.pygments.lexers.unicon', 'Unicon', ('unicon',), ('*.icn',), ('text/unicon',)),
'UnixConfigLexer': ('pip._vendor.pygments.lexers.configs', 'Unix/Linux config files', ('unixconfig', 'linuxconfig'), (), ()),
'UrbiscriptLexer': ('pip._vendor.pygments.lexers.urbi', 'UrbiScript', ('urbiscript',), ('*.u',), ('application/x-urbiscript',)),
+ 'UrlEncodedLexer': ('pip._vendor.pygments.lexers.html', 'urlencoded', ('urlencoded',), (), ('application/x-www-form-urlencoded',)),
'UsdLexer': ('pip._vendor.pygments.lexers.usd', 'USD', ('usd', 'usda'), ('*.usd', '*.usda'), ()),
'VBScriptLexer': ('pip._vendor.pygments.lexers.basic', 'VBScript', ('vbscript',), ('*.vbs', '*.VBS'), ()),
'VCLLexer': ('pip._vendor.pygments.lexers.varnish', 'VCL', ('vcl',), ('*.vcl',), ('text/x-vclsrc',)),
@@ -525,9 +541,13 @@ LEXERS = {
'VelocityHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Velocity', ('html+velocity',), (), ('text/html+velocity',)),
'VelocityLexer': ('pip._vendor.pygments.lexers.templates', 'Velocity', ('velocity',), ('*.vm', '*.fhtml'), ()),
'VelocityXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Velocity', ('xml+velocity',), (), ('application/xml+velocity',)),
+ 'VerifpalLexer': ('pip._vendor.pygments.lexers.verifpal', 'Verifpal', ('verifpal',), ('*.vp',), ('text/x-verifpal',)),
'VerilogLexer': ('pip._vendor.pygments.lexers.hdl', 'verilog', ('verilog', 'v'), ('*.v',), ('text/x-verilog',)),
'VhdlLexer': ('pip._vendor.pygments.lexers.hdl', 'vhdl', ('vhdl',), ('*.vhdl', '*.vhd'), ('text/x-vhdl',)),
'VimLexer': ('pip._vendor.pygments.lexers.textedit', 'VimL', ('vim',), ('*.vim', '.vimrc', '.exrc', '.gvimrc', '_vimrc', '_exrc', '_gvimrc', 'vimrc', 'gvimrc'), ('text/x-vim',)),
+ 'VisualPrologGrammarLexer': ('pip._vendor.pygments.lexers.vip', 'Visual Prolog Grammar', ('visualprologgrammar',), ('*.vipgrm',), ()),
+ 'VisualPrologLexer': ('pip._vendor.pygments.lexers.vip', 'Visual Prolog', ('visualprolog',), ('*.pro', '*.cl', '*.i', '*.pack', '*.ph'), ()),
+ 'VyperLexer': ('pip._vendor.pygments.lexers.vyper', 'Vyper', ('vyper',), ('*.vy',), ()),
'WDiffLexer': ('pip._vendor.pygments.lexers.diff', 'WDiff', ('wdiff',), ('*.wdiff',), ()),
'WatLexer': ('pip._vendor.pygments.lexers.webassembly', 'WebAssembly', ('wast', 'wat'), ('*.wat', '*.wast'), ()),
'WebIDLLexer': ('pip._vendor.pygments.lexers.webidl', 'Web IDL', ('webidl',), ('*.webidl',), ()),
@@ -552,6 +572,7 @@ LEXERS = {
'YamlJinjaLexer': ('pip._vendor.pygments.lexers.templates', 'YAML+Jinja', ('yaml+jinja', 'salt', 'sls'), ('*.sls', '*.yaml.j2', '*.yml.j2', '*.yaml.jinja2', '*.yml.jinja2'), ('text/x-yaml+jinja', 'text/x-sls')),
'YamlLexer': ('pip._vendor.pygments.lexers.data', 'YAML', ('yaml',), ('*.yaml', '*.yml'), ('text/x-yaml',)),
'YangLexer': ('pip._vendor.pygments.lexers.yang', 'YANG', ('yang',), ('*.yang',), ('application/yang',)),
+ 'YaraLexer': ('pip._vendor.pygments.lexers.yara', 'YARA', ('yara', 'yar'), ('*.yar',), ('text/x-yara',)),
'ZeekLexer': ('pip._vendor.pygments.lexers.dsls', 'Zeek', ('zeek', 'bro'), ('*.zeek', '*.bro'), ()),
'ZephirLexer': ('pip._vendor.pygments.lexers.php', 'Zephir', ('zephir',), ('*.zep',), ()),
'ZigLexer': ('pip._vendor.pygments.lexers.zig', 'Zig', ('zig',), ('*.zig',), ('text/zig',)),
diff --git a/contrib/python/pip/pip/_vendor/pygments/lexers/python.py b/contrib/python/pip/pip/_vendor/pygments/lexers/python.py
index e9bf2d3372..e2ce58f5a1 100644
--- a/contrib/python/pip/pip/_vendor/pygments/lexers/python.py
+++ b/contrib/python/pip/pip/_vendor/pygments/lexers/python.py
@@ -35,8 +35,8 @@ class PythonLexer(RegexLexer):
"""
name = 'Python'
- url = 'http://www.python.org'
- aliases = ['python', 'py', 'sage', 'python3', 'py3']
+ url = 'https://www.python.org'
+ aliases = ['python', 'py', 'sage', 'python3', 'py3', 'bazel', 'starlark']
filenames = [
'*.py',
'*.pyw',
@@ -425,7 +425,7 @@ class Python2Lexer(RegexLexer):
"""
name = 'Python 2.x'
- url = 'http://www.python.org'
+ url = 'https://www.python.org'
aliases = ['python2', 'py2']
filenames = [] # now taken over by PythonLexer (3.x)
mimetypes = ['text/x-python2', 'application/x-python2']
@@ -830,7 +830,7 @@ class CythonLexer(RegexLexer):
"""
name = 'Cython'
- url = 'http://cython.org'
+ url = 'https://cython.org'
aliases = ['cython', 'pyx', 'pyrex']
filenames = ['*.pyx', '*.pxd', '*.pxi']
mimetypes = ['text/x-cython', 'application/x-cython']
diff --git a/contrib/python/pip/pip/_vendor/pygments/sphinxext.py b/contrib/python/pip/pip/_vendor/pygments/sphinxext.py
index 2c7facde83..fc0b0270bf 100644
--- a/contrib/python/pip/pip/_vendor/pygments/sphinxext.py
+++ b/contrib/python/pip/pip/_vendor/pygments/sphinxext.py
@@ -147,6 +147,10 @@ class PygmentsDoc(Directive):
def document_lexers(self):
from pip._vendor.pygments.lexers._mapping import LEXERS
+ from pip._vendor import pygments
+ import inspect
+ import pathlib
+
out = []
modules = {}
moduledocstrings = {}
@@ -160,6 +164,24 @@ class PygmentsDoc(Directive):
docstring = cls.__doc__
if isinstance(docstring, bytes):
docstring = docstring.decode('utf8')
+
+ example_file = getattr(cls, '_example', None)
+ if example_file:
+ p = pathlib.Path(inspect.getabsfile(pygments)).parent.parent /\
+ 'tests' / 'examplefiles' / example_file
+ content = p.read_text(encoding='utf-8')
+ if not content:
+ raise Exception(
+ f"Empty example file '{example_file}' for lexer "
+ f"{classname}")
+
+ if data[2]:
+ lexer_name = data[2][0]
+ docstring += '\n\n .. admonition:: Example\n'
+ docstring += f'\n .. code-block:: {lexer_name}\n\n'
+ for line in content.splitlines():
+ docstring += f' {line}\n'
+
modules.setdefault(module, []).append((
classname,
', '.join(data[2]) or 'None',
diff --git a/contrib/python/pip/pip/_vendor/pygments/style.py b/contrib/python/pip/pip/_vendor/pygments/style.py
index edc19627db..f2f72d3bc5 100644
--- a/contrib/python/pip/pip/_vendor/pygments/style.py
+++ b/contrib/python/pip/pip/_vendor/pygments/style.py
@@ -190,6 +190,12 @@ class Style(metaclass=StyleMeta):
#: Style definitions for individual token types.
styles = {}
+ #: user-friendly style name (used when selecting the style, so this
+ # should be all-lowercase, no spaces, hyphens)
+ name = 'unnamed'
+
+ aliases = []
+
# Attribute for lexers defined within Pygments. If set
# to True, the style is not shown in the style gallery
# on the website. This is intended for language-specific
diff --git a/contrib/python/pip/pip/_vendor/pygments/styles/__init__.py b/contrib/python/pip/pip/_vendor/pygments/styles/__init__.py
index 7401cf5d3a..23b55468e2 100644
--- a/contrib/python/pip/pip/_vendor/pygments/styles/__init__.py
+++ b/contrib/python/pip/pip/_vendor/pygments/styles/__init__.py
@@ -10,59 +10,15 @@
from pip._vendor.pygments.plugin import find_plugin_styles
from pip._vendor.pygments.util import ClassNotFound
+from pip._vendor.pygments.styles._mapping import STYLES
#: A dictionary of built-in styles, mapping style names to
#: ``'submodule::classname'`` strings.
-STYLE_MAP = {
- 'default': 'default::DefaultStyle',
- 'emacs': 'emacs::EmacsStyle',
- 'friendly': 'friendly::FriendlyStyle',
- 'friendly_grayscale': 'friendly_grayscale::FriendlyGrayscaleStyle',
- 'colorful': 'colorful::ColorfulStyle',
- 'autumn': 'autumn::AutumnStyle',
- 'murphy': 'murphy::MurphyStyle',
- 'manni': 'manni::ManniStyle',
- 'material': 'material::MaterialStyle',
- 'monokai': 'monokai::MonokaiStyle',
- 'perldoc': 'perldoc::PerldocStyle',
- 'pastie': 'pastie::PastieStyle',
- 'borland': 'borland::BorlandStyle',
- 'trac': 'trac::TracStyle',
- 'native': 'native::NativeStyle',
- 'fruity': 'fruity::FruityStyle',
- 'bw': 'bw::BlackWhiteStyle',
- 'vim': 'vim::VimStyle',
- 'vs': 'vs::VisualStudioStyle',
- 'tango': 'tango::TangoStyle',
- 'rrt': 'rrt::RrtStyle',
- 'xcode': 'xcode::XcodeStyle',
- 'igor': 'igor::IgorStyle',
- 'paraiso-light': 'paraiso_light::ParaisoLightStyle',
- 'paraiso-dark': 'paraiso_dark::ParaisoDarkStyle',
- 'lovelace': 'lovelace::LovelaceStyle',
- 'algol': 'algol::AlgolStyle',
- 'algol_nu': 'algol_nu::Algol_NuStyle',
- 'arduino': 'arduino::ArduinoStyle',
- 'rainbow_dash': 'rainbow_dash::RainbowDashStyle',
- 'abap': 'abap::AbapStyle',
- 'solarized-dark': 'solarized::SolarizedDarkStyle',
- 'solarized-light': 'solarized::SolarizedLightStyle',
- 'sas': 'sas::SasStyle',
- 'staroffice' : 'staroffice::StarofficeStyle',
- 'stata': 'stata_light::StataLightStyle',
- 'stata-light': 'stata_light::StataLightStyle',
- 'stata-dark': 'stata_dark::StataDarkStyle',
- 'inkpot': 'inkpot::InkPotStyle',
- 'zenburn': 'zenburn::ZenburnStyle',
- 'gruvbox-dark': 'gruvbox::GruvboxDarkStyle',
- 'gruvbox-light': 'gruvbox::GruvboxLightStyle',
- 'dracula': 'dracula::DraculaStyle',
- 'one-dark': 'onedark::OneDarkStyle',
- 'lilypond' : 'lilypond::LilyPondStyle',
- 'nord': 'nord::NordStyle',
- 'nord-darker': 'nord::NordDarkerStyle',
- 'github-dark': 'gh_dark::GhDarkStyle'
-}
+#: This list is deprecated. Use `pygments.styles.STYLES` instead
+STYLE_MAP = {v[1]: v[0].split('.')[-1] + '::' + k for k, v in STYLES.items()}
+
+#: Internal reverse mapping to make `get_style_by_name` more efficient
+_STYLE_NAME_TO_MODULE_MAP = {v[1]: (v[0], k) for k, v in STYLES.items()}
def get_style_by_name(name):
@@ -73,8 +29,8 @@ def get_style_by_name(name):
Will raise :exc:`pygments.util.ClassNotFound` if no style of that name is
found.
"""
- if name in STYLE_MAP:
- mod, cls = STYLE_MAP[name].split('::')
+ if name in _STYLE_NAME_TO_MODULE_MAP:
+ mod, cls = _STYLE_NAME_TO_MODULE_MAP[name]
builtin = "yes"
else:
for found_name, style in find_plugin_styles():
@@ -82,14 +38,15 @@ def get_style_by_name(name):
return style
# perhaps it got dropped into our styles package
builtin = ""
- mod = name
+ mod = 'pygments.styles.' + name
cls = name.title() + "Style"
try:
- mod = __import__('pygments.styles.' + mod, None, None, [cls])
+ mod = __import__(mod, None, None, [cls])
except ImportError:
raise ClassNotFound("Could not find style module %r" % mod +
- (builtin and ", though it should be builtin") + ".")
+ (builtin and ", though it should be builtin")
+ + ".")
try:
return getattr(mod, cls)
except AttributeError:
@@ -98,6 +55,7 @@ def get_style_by_name(name):
def get_all_styles():
"""Return a generator for all styles by name, both builtin and plugin."""
- yield from STYLE_MAP
+ for v in STYLES.values():
+ yield v[1]
for name, _ in find_plugin_styles():
yield name
diff --git a/contrib/python/pip/pip/_vendor/pygments/styles/_mapping.py b/contrib/python/pip/pip/_vendor/pygments/styles/_mapping.py
new file mode 100644
index 0000000000..04c7ddfbb0
--- /dev/null
+++ b/contrib/python/pip/pip/_vendor/pygments/styles/_mapping.py
@@ -0,0 +1,53 @@
+# Automatically generated by scripts/gen_mapfiles.py.
+# DO NOT EDIT BY HAND; run `tox -e mapfiles` instead.
+
+STYLES = {
+ 'AbapStyle': ('pygments.styles.abap', 'abap', ()),
+ 'AlgolStyle': ('pygments.styles.algol', 'algol', ()),
+ 'Algol_NuStyle': ('pygments.styles.algol_nu', 'algol_nu', ()),
+ 'ArduinoStyle': ('pygments.styles.arduino', 'arduino', ()),
+ 'AutumnStyle': ('pygments.styles.autumn', 'autumn', ()),
+ 'BlackWhiteStyle': ('pygments.styles.bw', 'bw', ()),
+ 'BorlandStyle': ('pygments.styles.borland', 'borland', ()),
+ 'ColorfulStyle': ('pygments.styles.colorful', 'colorful', ()),
+ 'DefaultStyle': ('pygments.styles.default', 'default', ()),
+ 'DraculaStyle': ('pygments.styles.dracula', 'dracula', ()),
+ 'EmacsStyle': ('pygments.styles.emacs', 'emacs', ()),
+ 'FriendlyGrayscaleStyle': ('pygments.styles.friendly_grayscale', 'friendly_grayscale', ()),
+ 'FriendlyStyle': ('pygments.styles.friendly', 'friendly', ()),
+ 'FruityStyle': ('pygments.styles.fruity', 'fruity', ()),
+ 'GhDarkStyle': ('pygments.styles.gh_dark', 'github-dark', ()),
+ 'GruvboxDarkStyle': ('pygments.styles.gruvbox', 'gruvbox-dark', ()),
+ 'GruvboxLightStyle': ('pygments.styles.gruvbox', 'gruvbox-light', ()),
+ 'IgorStyle': ('pygments.styles.igor', 'igor', ()),
+ 'InkPotStyle': ('pygments.styles.inkpot', 'inkpot', ()),
+ 'LightbulbStyle': ('pygments.styles.lightbulb', 'lightbulb', ()),
+ 'LilyPondStyle': ('pygments.styles.lilypond', 'lilypond', ()),
+ 'LovelaceStyle': ('pygments.styles.lovelace', 'lovelace', ()),
+ 'ManniStyle': ('pygments.styles.manni', 'manni', ()),
+ 'MaterialStyle': ('pygments.styles.material', 'material', ()),
+ 'MonokaiStyle': ('pygments.styles.monokai', 'monokai', ()),
+ 'MurphyStyle': ('pygments.styles.murphy', 'murphy', ()),
+ 'NativeStyle': ('pygments.styles.native', 'native', ()),
+ 'NordDarkerStyle': ('pygments.styles.nord', 'nord-darker', ()),
+ 'NordStyle': ('pygments.styles.nord', 'nord', ()),
+ 'OneDarkStyle': ('pygments.styles.onedark', 'one-dark', ()),
+ 'ParaisoDarkStyle': ('pygments.styles.paraiso_dark', 'paraiso-dark', ()),
+ 'ParaisoLightStyle': ('pygments.styles.paraiso_light', 'paraiso-light', ()),
+ 'PastieStyle': ('pygments.styles.pastie', 'pastie', ()),
+ 'PerldocStyle': ('pygments.styles.perldoc', 'perldoc', ()),
+ 'RainbowDashStyle': ('pygments.styles.rainbow_dash', 'rainbow_dash', ()),
+ 'RrtStyle': ('pygments.styles.rrt', 'rrt', ()),
+ 'SasStyle': ('pygments.styles.sas', 'sas', ()),
+ 'SolarizedDarkStyle': ('pygments.styles.solarized', 'solarized-dark', ()),
+ 'SolarizedLightStyle': ('pygments.styles.solarized', 'solarized-light', ()),
+ 'StarofficeStyle': ('pygments.styles.staroffice', 'staroffice', ()),
+ 'StataDarkStyle': ('pygments.styles.stata_dark', 'stata-dark', ()),
+ 'StataLightStyle': ('pygments.styles.stata_light', 'stata-light', ()),
+ 'TangoStyle': ('pygments.styles.tango', 'tango', ()),
+ 'TracStyle': ('pygments.styles.trac', 'trac', ()),
+ 'VimStyle': ('pygments.styles.vim', 'vim', ()),
+ 'VisualStudioStyle': ('pygments.styles.vs', 'vs', ()),
+ 'XcodeStyle': ('pygments.styles.xcode', 'xcode', ()),
+ 'ZenburnStyle': ('pygments.styles.zenburn', 'zenburn', ()),
+}
diff --git a/contrib/python/pip/pip/_vendor/pygments/token.py b/contrib/python/pip/pip/_vendor/pygments/token.py
index 7395cb6a62..bdf2e8e2e1 100644
--- a/contrib/python/pip/pip/_vendor/pygments/token.py
+++ b/contrib/python/pip/pip/_vendor/pygments/token.py
@@ -209,5 +209,6 @@ STANDARD_TYPES = {
Generic.Prompt: 'gp',
Generic.Strong: 'gs',
Generic.Subheading: 'gu',
+ Generic.EmphStrong: 'ges',
Generic.Traceback: 'gt',
}
diff --git a/contrib/python/pip/pip/_vendor/pyparsing/__init__.py b/contrib/python/pip/pip/_vendor/pyparsing/__init__.py
deleted file mode 100644
index 88bc10ac18..0000000000
--- a/contrib/python/pip/pip/_vendor/pyparsing/__init__.py
+++ /dev/null
@@ -1,322 +0,0 @@
-# module pyparsing.py
-#
-# Copyright (c) 2003-2022 Paul T. McGuire
-#
-# 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.
-#
-
-__doc__ = """
-pyparsing module - Classes and methods to define and execute parsing grammars
-=============================================================================
-
-The pyparsing module is an alternative approach to creating and
-executing simple grammars, vs. the traditional lex/yacc approach, or the
-use of regular expressions. With pyparsing, you don't need to learn
-a new syntax for defining grammars or matching expressions - the parsing
-module provides a library of classes that you use to construct the
-grammar directly in Python.
-
-Here is a program to parse "Hello, World!" (or any greeting of the form
-``"<salutation>, <addressee>!"``), built up using :class:`Word`,
-:class:`Literal`, and :class:`And` elements
-(the :meth:`'+'<ParserElement.__add__>` operators create :class:`And` expressions,
-and the strings are auto-converted to :class:`Literal` expressions)::
-
- from pip._vendor.pyparsing import Word, alphas
-
- # define grammar of a greeting
- greet = Word(alphas) + "," + Word(alphas) + "!"
-
- hello = "Hello, World!"
- print(hello, "->", greet.parse_string(hello))
-
-The program outputs the following::
-
- Hello, World! -> ['Hello', ',', 'World', '!']
-
-The Python representation of the grammar is quite readable, owing to the
-self-explanatory class names, and the use of :class:`'+'<And>`,
-:class:`'|'<MatchFirst>`, :class:`'^'<Or>` and :class:`'&'<Each>` operators.
-
-The :class:`ParseResults` object returned from
-:class:`ParserElement.parse_string` can be
-accessed as a nested list, a dictionary, or an object with named
-attributes.
-
-The pyparsing module handles some of the problems that are typically
-vexing when writing text parsers:
-
- - extra or missing whitespace (the above program will also handle
- "Hello,World!", "Hello , World !", etc.)
- - quoted strings
- - embedded comments
-
-
-Getting Started -
------------------
-Visit the classes :class:`ParserElement` and :class:`ParseResults` to
-see the base classes that most other pyparsing
-classes inherit from. Use the docstrings for examples of how to:
-
- - construct literal match expressions from :class:`Literal` and
- :class:`CaselessLiteral` classes
- - construct character word-group expressions using the :class:`Word`
- class
- - see how to create repetitive expressions using :class:`ZeroOrMore`
- and :class:`OneOrMore` classes
- - use :class:`'+'<And>`, :class:`'|'<MatchFirst>`, :class:`'^'<Or>`,
- and :class:`'&'<Each>` operators to combine simple expressions into
- more complex ones
- - associate names with your parsed results using
- :class:`ParserElement.set_results_name`
- - access the parsed data, which is returned as a :class:`ParseResults`
- object
- - find some helpful expression short-cuts like :class:`DelimitedList`
- and :class:`one_of`
- - find more useful common expressions in the :class:`pyparsing_common`
- namespace class
-"""
-from typing import NamedTuple
-
-
-class version_info(NamedTuple):
- major: int
- minor: int
- micro: int
- releaselevel: str
- serial: int
-
- @property
- def __version__(self):
- return (
- f"{self.major}.{self.minor}.{self.micro}"
- + (
- f"{'r' if self.releaselevel[0] == 'c' else ''}{self.releaselevel[0]}{self.serial}",
- "",
- )[self.releaselevel == "final"]
- )
-
- def __str__(self):
- return f"{__name__} {self.__version__} / {__version_time__}"
-
- def __repr__(self):
- return f"{__name__}.{type(self).__name__}({', '.join('{}={!r}'.format(*nv) for nv in zip(self._fields, self))})"
-
-
-__version_info__ = version_info(3, 1, 0, "final", 1)
-__version_time__ = "18 Jun 2023 14:05 UTC"
-__version__ = __version_info__.__version__
-__versionTime__ = __version_time__
-__author__ = "Paul McGuire <ptmcg.gm+pyparsing@gmail.com>"
-
-from .util import *
-from .exceptions import *
-from .actions import *
-from .core import __diag__, __compat__
-from .results import *
-from .core import * # type: ignore[misc, assignment]
-from .core import _builtin_exprs as core_builtin_exprs
-from .helpers import * # type: ignore[misc, assignment]
-from .helpers import _builtin_exprs as helper_builtin_exprs
-
-from .unicode import unicode_set, UnicodeRangeList, pyparsing_unicode as unicode
-from .testing import pyparsing_test as testing
-from .common import (
- pyparsing_common as common,
- _builtin_exprs as common_builtin_exprs,
-)
-
-# define backward compat synonyms
-if "pyparsing_unicode" not in globals():
- pyparsing_unicode = unicode # type: ignore[misc]
-if "pyparsing_common" not in globals():
- pyparsing_common = common # type: ignore[misc]
-if "pyparsing_test" not in globals():
- pyparsing_test = testing # type: ignore[misc]
-
-core_builtin_exprs += common_builtin_exprs + helper_builtin_exprs
-
-
-__all__ = [
- "__version__",
- "__version_time__",
- "__author__",
- "__compat__",
- "__diag__",
- "And",
- "AtLineStart",
- "AtStringStart",
- "CaselessKeyword",
- "CaselessLiteral",
- "CharsNotIn",
- "CloseMatch",
- "Combine",
- "DelimitedList",
- "Dict",
- "Each",
- "Empty",
- "FollowedBy",
- "Forward",
- "GoToColumn",
- "Group",
- "IndentedBlock",
- "Keyword",
- "LineEnd",
- "LineStart",
- "Literal",
- "Located",
- "PrecededBy",
- "MatchFirst",
- "NoMatch",
- "NotAny",
- "OneOrMore",
- "OnlyOnce",
- "OpAssoc",
- "Opt",
- "Optional",
- "Or",
- "ParseBaseException",
- "ParseElementEnhance",
- "ParseException",
- "ParseExpression",
- "ParseFatalException",
- "ParseResults",
- "ParseSyntaxException",
- "ParserElement",
- "PositionToken",
- "QuotedString",
- "RecursiveGrammarException",
- "Regex",
- "SkipTo",
- "StringEnd",
- "StringStart",
- "Suppress",
- "Token",
- "TokenConverter",
- "White",
- "Word",
- "WordEnd",
- "WordStart",
- "ZeroOrMore",
- "Char",
- "alphanums",
- "alphas",
- "alphas8bit",
- "any_close_tag",
- "any_open_tag",
- "autoname_elements",
- "c_style_comment",
- "col",
- "common_html_entity",
- "condition_as_parse_action",
- "counted_array",
- "cpp_style_comment",
- "dbl_quoted_string",
- "dbl_slash_comment",
- "delimited_list",
- "dict_of",
- "empty",
- "hexnums",
- "html_comment",
- "identchars",
- "identbodychars",
- "infix_notation",
- "java_style_comment",
- "line",
- "line_end",
- "line_start",
- "lineno",
- "make_html_tags",
- "make_xml_tags",
- "match_only_at_col",
- "match_previous_expr",
- "match_previous_literal",
- "nested_expr",
- "null_debug_action",
- "nums",
- "one_of",
- "original_text_for",
- "printables",
- "punc8bit",
- "pyparsing_common",
- "pyparsing_test",
- "pyparsing_unicode",
- "python_style_comment",
- "quoted_string",
- "remove_quotes",
- "replace_with",
- "replace_html_entity",
- "rest_of_line",
- "sgl_quoted_string",
- "srange",
- "string_end",
- "string_start",
- "token_map",
- "trace_parse_action",
- "ungroup",
- "unicode_set",
- "unicode_string",
- "with_attribute",
- "with_class",
- # pre-PEP8 compatibility names
- "__versionTime__",
- "anyCloseTag",
- "anyOpenTag",
- "cStyleComment",
- "commonHTMLEntity",
- "conditionAsParseAction",
- "countedArray",
- "cppStyleComment",
- "dblQuotedString",
- "dblSlashComment",
- "delimitedList",
- "dictOf",
- "htmlComment",
- "indentedBlock",
- "infixNotation",
- "javaStyleComment",
- "lineEnd",
- "lineStart",
- "locatedExpr",
- "makeHTMLTags",
- "makeXMLTags",
- "matchOnlyAtCol",
- "matchPreviousExpr",
- "matchPreviousLiteral",
- "nestedExpr",
- "nullDebugAction",
- "oneOf",
- "opAssoc",
- "originalTextFor",
- "pythonStyleComment",
- "quotedString",
- "removeQuotes",
- "replaceHTMLEntity",
- "replaceWith",
- "restOfLine",
- "sglQuotedString",
- "stringEnd",
- "stringStart",
- "tokenMap",
- "traceParseAction",
- "unicodeString",
- "withAttribute",
- "withClass",
-]
diff --git a/contrib/python/pip/pip/_vendor/pyparsing/actions.py b/contrib/python/pip/pip/_vendor/pyparsing/actions.py
deleted file mode 100644
index ca6e4c6afb..0000000000
--- a/contrib/python/pip/pip/_vendor/pyparsing/actions.py
+++ /dev/null
@@ -1,217 +0,0 @@
-# actions.py
-
-from .exceptions import ParseException
-from .util import col, replaced_by_pep8
-
-
-class OnlyOnce:
- """
- Wrapper for parse actions, to ensure they are only called once.
- """
-
- def __init__(self, method_call):
- from .core import _trim_arity
-
- self.callable = _trim_arity(method_call)
- self.called = False
-
- def __call__(self, s, l, t):
- if not self.called:
- results = self.callable(s, l, t)
- self.called = True
- return results
- raise ParseException(s, l, "OnlyOnce obj called multiple times w/out reset")
-
- def reset(self):
- """
- Allow the associated parse action to be called once more.
- """
-
- self.called = False
-
-
-def match_only_at_col(n):
- """
- Helper method for defining parse actions that require matching at
- a specific column in the input text.
- """
-
- def verify_col(strg, locn, toks):
- if col(locn, strg) != n:
- raise ParseException(strg, locn, f"matched token not at column {n}")
-
- return verify_col
-
-
-def replace_with(repl_str):
- """
- Helper method for common parse actions that simply return
- a literal value. Especially useful when used with
- :class:`transform_string<ParserElement.transform_string>` ().
-
- Example::
-
- num = Word(nums).set_parse_action(lambda toks: int(toks[0]))
- na = one_of("N/A NA").set_parse_action(replace_with(math.nan))
- term = na | num
-
- term[1, ...].parse_string("324 234 N/A 234") # -> [324, 234, nan, 234]
- """
- return lambda s, l, t: [repl_str]
-
-
-def remove_quotes(s, l, t):
- """
- Helper parse action for removing quotation marks from parsed
- quoted strings.
-
- Example::
-
- # by default, quotation marks are included in parsed results
- quoted_string.parse_string("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"]
-
- # use remove_quotes to strip quotation marks from parsed results
- quoted_string.set_parse_action(remove_quotes)
- quoted_string.parse_string("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"]
- """
- return t[0][1:-1]
-
-
-def with_attribute(*args, **attr_dict):
- """
- Helper to create a validating parse action to be used with start
- tags created with :class:`make_xml_tags` or
- :class:`make_html_tags`. Use ``with_attribute`` to qualify
- a starting tag with a required attribute value, to avoid false
- matches on common tags such as ``<TD>`` or ``<DIV>``.
-
- Call ``with_attribute`` with a series of attribute names and
- values. Specify the list of filter attributes names and values as:
-
- - keyword arguments, as in ``(align="right")``, or
- - as an explicit dict with ``**`` operator, when an attribute
- name is also a Python reserved word, as in ``**{"class":"Customer", "align":"right"}``
- - a list of name-value tuples, as in ``(("ns1:class", "Customer"), ("ns2:align", "right"))``
-
- For attribute names with a namespace prefix, you must use the second
- form. Attribute names are matched insensitive to upper/lower case.
-
- If just testing for ``class`` (with or without a namespace), use
- :class:`with_class`.
-
- To verify that the attribute exists, but without specifying a value,
- pass ``with_attribute.ANY_VALUE`` as the value.
-
- Example::
-
- html = '''
- <div>
- Some text
- <div type="grid">1 4 0 1 0</div>
- <div type="graph">1,3 2,3 1,1</div>
- <div>this has no type</div>
- </div>
-
- '''
- div,div_end = make_html_tags("div")
-
- # only match div tag having a type attribute with value "grid"
- div_grid = div().set_parse_action(with_attribute(type="grid"))
- grid_expr = div_grid + SkipTo(div | div_end)("body")
- for grid_header in grid_expr.search_string(html):
- print(grid_header.body)
-
- # construct a match with any div tag having a type attribute, regardless of the value
- div_any_type = div().set_parse_action(with_attribute(type=with_attribute.ANY_VALUE))
- div_expr = div_any_type + SkipTo(div | div_end)("body")
- for div_header in div_expr.search_string(html):
- print(div_header.body)
-
- prints::
-
- 1 4 0 1 0
-
- 1 4 0 1 0
- 1,3 2,3 1,1
- """
- if args:
- attrs = args[:]
- else:
- attrs = attr_dict.items()
- attrs = [(k, v) for k, v in attrs]
-
- def pa(s, l, tokens):
- for attrName, attrValue in attrs:
- if attrName not in tokens:
- raise ParseException(s, l, "no matching attribute " + attrName)
- if attrValue != with_attribute.ANY_VALUE and tokens[attrName] != attrValue:
- raise ParseException(
- s,
- l,
- f"attribute {attrName!r} has value {tokens[attrName]!r}, must be {attrValue!r}",
- )
-
- return pa
-
-
-with_attribute.ANY_VALUE = object() # type: ignore [attr-defined]
-
-
-def with_class(classname, namespace=""):
- """
- Simplified version of :class:`with_attribute` when
- matching on a div class - made difficult because ``class`` is
- a reserved word in Python.
-
- Example::
-
- html = '''
- <div>
- Some text
- <div class="grid">1 4 0 1 0</div>
- <div class="graph">1,3 2,3 1,1</div>
- <div>this &lt;div&gt; has no class</div>
- </div>
-
- '''
- div,div_end = make_html_tags("div")
- div_grid = div().set_parse_action(with_class("grid"))
-
- grid_expr = div_grid + SkipTo(div | div_end)("body")
- for grid_header in grid_expr.search_string(html):
- print(grid_header.body)
-
- div_any_type = div().set_parse_action(with_class(withAttribute.ANY_VALUE))
- div_expr = div_any_type + SkipTo(div | div_end)("body")
- for div_header in div_expr.search_string(html):
- print(div_header.body)
-
- prints::
-
- 1 4 0 1 0
-
- 1 4 0 1 0
- 1,3 2,3 1,1
- """
- classattr = f"{namespace}:class" if namespace else "class"
- return with_attribute(**{classattr: classname})
-
-
-# pre-PEP8 compatibility symbols
-# fmt: off
-@replaced_by_pep8(replace_with)
-def replaceWith(): ...
-
-@replaced_by_pep8(remove_quotes)
-def removeQuotes(): ...
-
-@replaced_by_pep8(with_attribute)
-def withAttribute(): ...
-
-@replaced_by_pep8(with_class)
-def withClass(): ...
-
-@replaced_by_pep8(match_only_at_col)
-def matchOnlyAtCol(): ...
-
-# fmt: on
diff --git a/contrib/python/pip/pip/_vendor/pyparsing/common.py b/contrib/python/pip/pip/_vendor/pyparsing/common.py
deleted file mode 100644
index 7a666b276d..0000000000
--- a/contrib/python/pip/pip/_vendor/pyparsing/common.py
+++ /dev/null
@@ -1,432 +0,0 @@
-# common.py
-from .core import *
-from .helpers import DelimitedList, any_open_tag, any_close_tag
-from datetime import datetime
-
-
-# some other useful expressions - using lower-case class name since we are really using this as a namespace
-class pyparsing_common:
- """Here are some common low-level expressions that may be useful in
- jump-starting parser development:
-
- - numeric forms (:class:`integers<integer>`, :class:`reals<real>`,
- :class:`scientific notation<sci_real>`)
- - common :class:`programming identifiers<identifier>`
- - network addresses (:class:`MAC<mac_address>`,
- :class:`IPv4<ipv4_address>`, :class:`IPv6<ipv6_address>`)
- - ISO8601 :class:`dates<iso8601_date>` and
- :class:`datetime<iso8601_datetime>`
- - :class:`UUID<uuid>`
- - :class:`comma-separated list<comma_separated_list>`
- - :class:`url`
-
- Parse actions:
-
- - :class:`convert_to_integer`
- - :class:`convert_to_float`
- - :class:`convert_to_date`
- - :class:`convert_to_datetime`
- - :class:`strip_html_tags`
- - :class:`upcase_tokens`
- - :class:`downcase_tokens`
-
- Example::
-
- pyparsing_common.number.run_tests('''
- # any int or real number, returned as the appropriate type
- 100
- -100
- +100
- 3.14159
- 6.02e23
- 1e-12
- ''')
-
- pyparsing_common.fnumber.run_tests('''
- # any int or real number, returned as float
- 100
- -100
- +100
- 3.14159
- 6.02e23
- 1e-12
- ''')
-
- pyparsing_common.hex_integer.run_tests('''
- # hex numbers
- 100
- FF
- ''')
-
- pyparsing_common.fraction.run_tests('''
- # fractions
- 1/2
- -3/4
- ''')
-
- pyparsing_common.mixed_integer.run_tests('''
- # mixed fractions
- 1
- 1/2
- -3/4
- 1-3/4
- ''')
-
- import uuid
- pyparsing_common.uuid.set_parse_action(token_map(uuid.UUID))
- pyparsing_common.uuid.run_tests('''
- # uuid
- 12345678-1234-5678-1234-567812345678
- ''')
-
- prints::
-
- # any int or real number, returned as the appropriate type
- 100
- [100]
-
- -100
- [-100]
-
- +100
- [100]
-
- 3.14159
- [3.14159]
-
- 6.02e23
- [6.02e+23]
-
- 1e-12
- [1e-12]
-
- # any int or real number, returned as float
- 100
- [100.0]
-
- -100
- [-100.0]
-
- +100
- [100.0]
-
- 3.14159
- [3.14159]
-
- 6.02e23
- [6.02e+23]
-
- 1e-12
- [1e-12]
-
- # hex numbers
- 100
- [256]
-
- FF
- [255]
-
- # fractions
- 1/2
- [0.5]
-
- -3/4
- [-0.75]
-
- # mixed fractions
- 1
- [1]
-
- 1/2
- [0.5]
-
- -3/4
- [-0.75]
-
- 1-3/4
- [1.75]
-
- # uuid
- 12345678-1234-5678-1234-567812345678
- [UUID('12345678-1234-5678-1234-567812345678')]
- """
-
- convert_to_integer = token_map(int)
- """
- Parse action for converting parsed integers to Python int
- """
-
- convert_to_float = token_map(float)
- """
- Parse action for converting parsed numbers to Python float
- """
-
- integer = Word(nums).set_name("integer").set_parse_action(convert_to_integer)
- """expression that parses an unsigned integer, returns an int"""
-
- hex_integer = (
- Word(hexnums).set_name("hex integer").set_parse_action(token_map(int, 16))
- )
- """expression that parses a hexadecimal integer, returns an int"""
-
- signed_integer = (
- Regex(r"[+-]?\d+")
- .set_name("signed integer")
- .set_parse_action(convert_to_integer)
- )
- """expression that parses an integer with optional leading sign, returns an int"""
-
- fraction = (
- signed_integer().set_parse_action(convert_to_float)
- + "/"
- + signed_integer().set_parse_action(convert_to_float)
- ).set_name("fraction")
- """fractional expression of an integer divided by an integer, returns a float"""
- fraction.add_parse_action(lambda tt: tt[0] / tt[-1])
-
- mixed_integer = (
- fraction | signed_integer + Opt(Opt("-").suppress() + fraction)
- ).set_name("fraction or mixed integer-fraction")
- """mixed integer of the form 'integer - fraction', with optional leading integer, returns float"""
- mixed_integer.add_parse_action(sum)
-
- real = (
- Regex(r"[+-]?(?:\d+\.\d*|\.\d+)")
- .set_name("real number")
- .set_parse_action(convert_to_float)
- )
- """expression that parses a floating point number and returns a float"""
-
- sci_real = (
- Regex(r"[+-]?(?:\d+(?:[eE][+-]?\d+)|(?:\d+\.\d*|\.\d+)(?:[eE][+-]?\d+)?)")
- .set_name("real number with scientific notation")
- .set_parse_action(convert_to_float)
- )
- """expression that parses a floating point number with optional
- scientific notation and returns a float"""
-
- # streamlining this expression makes the docs nicer-looking
- number = (sci_real | real | signed_integer).setName("number").streamline()
- """any numeric expression, returns the corresponding Python type"""
-
- fnumber = (
- Regex(r"[+-]?\d+\.?\d*([eE][+-]?\d+)?")
- .set_name("fnumber")
- .set_parse_action(convert_to_float)
- )
- """any int or real number, returned as float"""
-
- identifier = Word(identchars, identbodychars).set_name("identifier")
- """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')"""
-
- ipv4_address = Regex(
- r"(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}"
- ).set_name("IPv4 address")
- "IPv4 address (``0.0.0.0 - 255.255.255.255``)"
-
- _ipv6_part = Regex(r"[0-9a-fA-F]{1,4}").set_name("hex_integer")
- _full_ipv6_address = (_ipv6_part + (":" + _ipv6_part) * 7).set_name(
- "full IPv6 address"
- )
- _short_ipv6_address = (
- Opt(_ipv6_part + (":" + _ipv6_part) * (0, 6))
- + "::"
- + Opt(_ipv6_part + (":" + _ipv6_part) * (0, 6))
- ).set_name("short IPv6 address")
- _short_ipv6_address.add_condition(
- lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8
- )
- _mixed_ipv6_address = ("::ffff:" + ipv4_address).set_name("mixed IPv6 address")
- ipv6_address = Combine(
- (_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).set_name(
- "IPv6 address"
- )
- ).set_name("IPv6 address")
- "IPv6 address (long, short, or mixed form)"
-
- mac_address = Regex(
- r"[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}"
- ).set_name("MAC address")
- "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)"
-
- @staticmethod
- def convert_to_date(fmt: str = "%Y-%m-%d"):
- """
- Helper to create a parse action for converting parsed date string to Python datetime.date
-
- Params -
- - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%d"``)
-
- Example::
-
- date_expr = pyparsing_common.iso8601_date.copy()
- date_expr.set_parse_action(pyparsing_common.convert_to_date())
- print(date_expr.parse_string("1999-12-31"))
-
- prints::
-
- [datetime.date(1999, 12, 31)]
- """
-
- def cvt_fn(ss, ll, tt):
- try:
- return datetime.strptime(tt[0], fmt).date()
- except ValueError as ve:
- raise ParseException(ss, ll, str(ve))
-
- return cvt_fn
-
- @staticmethod
- def convert_to_datetime(fmt: str = "%Y-%m-%dT%H:%M:%S.%f"):
- """Helper to create a parse action for converting parsed
- datetime string to Python datetime.datetime
-
- Params -
- - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%dT%H:%M:%S.%f"``)
-
- Example::
-
- dt_expr = pyparsing_common.iso8601_datetime.copy()
- dt_expr.set_parse_action(pyparsing_common.convert_to_datetime())
- print(dt_expr.parse_string("1999-12-31T23:59:59.999"))
-
- prints::
-
- [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)]
- """
-
- def cvt_fn(s, l, t):
- try:
- return datetime.strptime(t[0], fmt)
- except ValueError as ve:
- raise ParseException(s, l, str(ve))
-
- return cvt_fn
-
- iso8601_date = Regex(
- r"(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?"
- ).set_name("ISO8601 date")
- "ISO8601 date (``yyyy-mm-dd``)"
-
- iso8601_datetime = Regex(
- r"(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?"
- ).set_name("ISO8601 datetime")
- "ISO8601 datetime (``yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)``) - trailing seconds, milliseconds, and timezone optional; accepts separating ``'T'`` or ``' '``"
-
- uuid = Regex(r"[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}").set_name("UUID")
- "UUID (``xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx``)"
-
- _html_stripper = any_open_tag.suppress() | any_close_tag.suppress()
-
- @staticmethod
- def strip_html_tags(s: str, l: int, tokens: ParseResults):
- """Parse action to remove HTML tags from web page HTML source
-
- Example::
-
- # strip HTML links from normal text
- text = '<td>More info at the <a href="https://github.com/pyparsing/pyparsing/wiki">pyparsing</a> wiki page</td>'
- td, td_end = make_html_tags("TD")
- table_text = td + SkipTo(td_end).set_parse_action(pyparsing_common.strip_html_tags)("body") + td_end
- print(table_text.parse_string(text).body)
-
- Prints::
-
- More info at the pyparsing wiki page
- """
- return pyparsing_common._html_stripper.transform_string(tokens[0])
-
- _commasepitem = (
- Combine(
- OneOrMore(
- ~Literal(",")
- + ~LineEnd()
- + Word(printables, exclude_chars=",")
- + Opt(White(" \t") + ~FollowedBy(LineEnd() | ","))
- )
- )
- .streamline()
- .set_name("commaItem")
- )
- comma_separated_list = DelimitedList(
- Opt(quoted_string.copy() | _commasepitem, default="")
- ).set_name("comma separated list")
- """Predefined expression of 1 or more printable words or quoted strings, separated by commas."""
-
- upcase_tokens = staticmethod(token_map(lambda t: t.upper()))
- """Parse action to convert tokens to upper case."""
-
- downcase_tokens = staticmethod(token_map(lambda t: t.lower()))
- """Parse action to convert tokens to lower case."""
-
- # fmt: off
- url = Regex(
- # https://mathiasbynens.be/demo/url-regex
- # https://gist.github.com/dperini/729294
- r"(?P<url>" +
- # protocol identifier (optional)
- # short syntax // still required
- r"(?:(?:(?P<scheme>https?|ftp):)?\/\/)" +
- # user:pass BasicAuth (optional)
- r"(?:(?P<auth>\S+(?::\S*)?)@)?" +
- r"(?P<host>" +
- # IP address exclusion
- # private & local networks
- r"(?!(?:10|127)(?:\.\d{1,3}){3})" +
- r"(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})" +
- r"(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})" +
- # IP address dotted notation octets
- # excludes loopback network 0.0.0.0
- # excludes reserved space >= 224.0.0.0
- # excludes network & broadcast addresses
- # (first & last IP address of each class)
- r"(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])" +
- r"(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}" +
- r"(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))" +
- r"|" +
- # host & domain names, may end with dot
- # can be replaced by a shortest alternative
- # (?![-_])(?:[-\w\u00a1-\uffff]{0,63}[^-_]\.)+
- r"(?:" +
- r"(?:" +
- r"[a-z0-9\u00a1-\uffff]" +
- r"[a-z0-9\u00a1-\uffff_-]{0,62}" +
- r")?" +
- r"[a-z0-9\u00a1-\uffff]\." +
- r")+" +
- # TLD identifier name, may end with dot
- r"(?:[a-z\u00a1-\uffff]{2,}\.?)" +
- r")" +
- # port number (optional)
- r"(:(?P<port>\d{2,5}))?" +
- # resource path (optional)
- r"(?P<path>\/[^?# ]*)?" +
- # query string (optional)
- r"(\?(?P<query>[^#]*))?" +
- # fragment (optional)
- r"(#(?P<fragment>\S*))?" +
- r")"
- ).set_name("url")
- """URL (http/https/ftp scheme)"""
- # fmt: on
-
- # pre-PEP8 compatibility names
- convertToInteger = convert_to_integer
- """Deprecated - use :class:`convert_to_integer`"""
- convertToFloat = convert_to_float
- """Deprecated - use :class:`convert_to_float`"""
- convertToDate = convert_to_date
- """Deprecated - use :class:`convert_to_date`"""
- convertToDatetime = convert_to_datetime
- """Deprecated - use :class:`convert_to_datetime`"""
- stripHTMLTags = strip_html_tags
- """Deprecated - use :class:`strip_html_tags`"""
- upcaseTokens = upcase_tokens
- """Deprecated - use :class:`upcase_tokens`"""
- downcaseTokens = downcase_tokens
- """Deprecated - use :class:`downcase_tokens`"""
-
-
-_builtin_exprs = [
- v for v in vars(pyparsing_common).values() if isinstance(v, ParserElement)
-]
diff --git a/contrib/python/pip/pip/_vendor/pyparsing/core.py b/contrib/python/pip/pip/_vendor/pyparsing/core.py
deleted file mode 100644
index 8d5a856ecd..0000000000
--- a/contrib/python/pip/pip/_vendor/pyparsing/core.py
+++ /dev/null
@@ -1,6115 +0,0 @@
-#
-# core.py
-#
-
-from collections import deque
-import os
-import typing
-from typing import (
- Any,
- Callable,
- Generator,
- List,
- NamedTuple,
- Sequence,
- Set,
- TextIO,
- Tuple,
- Union,
- cast,
-)
-from abc import ABC, abstractmethod
-from enum import Enum
-import string
-import copy
-import warnings
-import re
-import sys
-from collections.abc import Iterable
-import traceback
-import types
-from operator import itemgetter
-from functools import wraps
-from threading import RLock
-from pathlib import Path
-
-from .util import (
- _FifoCache,
- _UnboundedCache,
- __config_flags,
- _collapse_string_to_ranges,
- _escape_regex_range_chars,
- _bslash,
- _flatten,
- LRUMemo as _LRUMemo,
- UnboundedMemo as _UnboundedMemo,
- replaced_by_pep8,
-)
-from .exceptions import *
-from .actions import *
-from .results import ParseResults, _ParseResultsWithOffset
-from .unicode import pyparsing_unicode
-
-_MAX_INT = sys.maxsize
-str_type: Tuple[type, ...] = (str, bytes)
-
-#
-# Copyright (c) 2003-2022 Paul T. McGuire
-#
-# 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.
-#
-
-
-if sys.version_info >= (3, 8):
- from functools import cached_property
-else:
-
- class cached_property:
- def __init__(self, func):
- self._func = func
-
- def __get__(self, instance, owner=None):
- ret = instance.__dict__[self._func.__name__] = self._func(instance)
- return ret
-
-
-class __compat__(__config_flags):
- """
- A cross-version compatibility configuration for pyparsing features that will be
- released in a future version. By setting values in this configuration to True,
- those features can be enabled in prior versions for compatibility development
- and testing.
-
- - ``collect_all_And_tokens`` - flag to enable fix for Issue #63 that fixes erroneous grouping
- of results names when an :class:`And` expression is nested within an :class:`Or` or :class:`MatchFirst`;
- maintained for compatibility, but setting to ``False`` no longer restores pre-2.3.1
- behavior
- """
-
- _type_desc = "compatibility"
-
- collect_all_And_tokens = True
-
- _all_names = [__ for __ in locals() if not __.startswith("_")]
- _fixed_names = """
- collect_all_And_tokens
- """.split()
-
-
-class __diag__(__config_flags):
- _type_desc = "diagnostic"
-
- warn_multiple_tokens_in_named_alternation = False
- warn_ungrouped_named_tokens_in_collection = False
- warn_name_set_on_empty_Forward = False
- warn_on_parse_using_empty_Forward = False
- warn_on_assignment_to_Forward = False
- warn_on_multiple_string_args_to_oneof = False
- warn_on_match_first_with_lshift_operator = False
- enable_debug_on_named_expressions = False
-
- _all_names = [__ for __ in locals() if not __.startswith("_")]
- _warning_names = [name for name in _all_names if name.startswith("warn")]
- _debug_names = [name for name in _all_names if name.startswith("enable_debug")]
-
- @classmethod
- def enable_all_warnings(cls) -> None:
- for name in cls._warning_names:
- cls.enable(name)
-
-
-class Diagnostics(Enum):
- """
- Diagnostic configuration (all default to disabled)
-
- - ``warn_multiple_tokens_in_named_alternation`` - flag to enable warnings when a results
- name is defined on a :class:`MatchFirst` or :class:`Or` expression with one or more :class:`And` subexpressions
- - ``warn_ungrouped_named_tokens_in_collection`` - flag to enable warnings when a results
- name is defined on a containing expression with ungrouped subexpressions that also
- have results names
- - ``warn_name_set_on_empty_Forward`` - flag to enable warnings when a :class:`Forward` is defined
- with a results name, but has no contents defined
- - ``warn_on_parse_using_empty_Forward`` - flag to enable warnings when a :class:`Forward` is
- defined in a grammar but has never had an expression attached to it
- - ``warn_on_assignment_to_Forward`` - flag to enable warnings when a :class:`Forward` is defined
- but is overwritten by assigning using ``'='`` instead of ``'<<='`` or ``'<<'``
- - ``warn_on_multiple_string_args_to_oneof`` - flag to enable warnings when :class:`one_of` is
- incorrectly called with multiple str arguments
- - ``enable_debug_on_named_expressions`` - flag to auto-enable debug on all subsequent
- calls to :class:`ParserElement.set_name`
-
- Diagnostics are enabled/disabled by calling :class:`enable_diag` and :class:`disable_diag`.
- All warnings can be enabled by calling :class:`enable_all_warnings`.
- """
-
- warn_multiple_tokens_in_named_alternation = 0
- warn_ungrouped_named_tokens_in_collection = 1
- warn_name_set_on_empty_Forward = 2
- warn_on_parse_using_empty_Forward = 3
- warn_on_assignment_to_Forward = 4
- warn_on_multiple_string_args_to_oneof = 5
- warn_on_match_first_with_lshift_operator = 6
- enable_debug_on_named_expressions = 7
-
-
-def enable_diag(diag_enum: Diagnostics) -> None:
- """
- Enable a global pyparsing diagnostic flag (see :class:`Diagnostics`).
- """
- __diag__.enable(diag_enum.name)
-
-
-def disable_diag(diag_enum: Diagnostics) -> None:
- """
- Disable a global pyparsing diagnostic flag (see :class:`Diagnostics`).
- """
- __diag__.disable(diag_enum.name)
-
-
-def enable_all_warnings() -> None:
- """
- Enable all global pyparsing diagnostic warnings (see :class:`Diagnostics`).
- """
- __diag__.enable_all_warnings()
-
-
-# hide abstract class
-del __config_flags
-
-
-def _should_enable_warnings(
- cmd_line_warn_options: typing.Iterable[str], warn_env_var: typing.Optional[str]
-) -> bool:
- enable = bool(warn_env_var)
- for warn_opt in cmd_line_warn_options:
- w_action, w_message, w_category, w_module, w_line = (warn_opt + "::::").split(
- ":"
- )[:5]
- if not w_action.lower().startswith("i") and (
- not (w_message or w_category or w_module) or w_module == "pyparsing"
- ):
- enable = True
- elif w_action.lower().startswith("i") and w_module in ("pyparsing", ""):
- enable = False
- return enable
-
-
-if _should_enable_warnings(
- sys.warnoptions, os.environ.get("PYPARSINGENABLEALLWARNINGS")
-):
- enable_all_warnings()
-
-
-# build list of single arg builtins, that can be used as parse actions
-_single_arg_builtins = {
- sum,
- len,
- sorted,
- reversed,
- list,
- tuple,
- set,
- any,
- all,
- min,
- max,
-}
-
-_generatorType = types.GeneratorType
-ParseImplReturnType = Tuple[int, Any]
-PostParseReturnType = Union[ParseResults, Sequence[ParseResults]]
-ParseAction = Union[
- Callable[[], Any],
- Callable[[ParseResults], Any],
- Callable[[int, ParseResults], Any],
- Callable[[str, int, ParseResults], Any],
-]
-ParseCondition = Union[
- Callable[[], bool],
- Callable[[ParseResults], bool],
- Callable[[int, ParseResults], bool],
- Callable[[str, int, ParseResults], bool],
-]
-ParseFailAction = Callable[[str, int, "ParserElement", Exception], None]
-DebugStartAction = Callable[[str, int, "ParserElement", bool], None]
-DebugSuccessAction = Callable[
- [str, int, int, "ParserElement", ParseResults, bool], None
-]
-DebugExceptionAction = Callable[[str, int, "ParserElement", Exception, bool], None]
-
-
-alphas = string.ascii_uppercase + string.ascii_lowercase
-identchars = pyparsing_unicode.Latin1.identchars
-identbodychars = pyparsing_unicode.Latin1.identbodychars
-nums = "0123456789"
-hexnums = nums + "ABCDEFabcdef"
-alphanums = alphas + nums
-printables = "".join([c for c in string.printable if c not in string.whitespace])
-
-_trim_arity_call_line: traceback.StackSummary = None # type: ignore[assignment]
-
-
-def _trim_arity(func, max_limit=3):
- """decorator to trim function calls to match the arity of the target"""
- global _trim_arity_call_line
-
- if func in _single_arg_builtins:
- return lambda s, l, t: func(t)
-
- limit = 0
- found_arity = False
-
- # synthesize what would be returned by traceback.extract_stack at the call to
- # user's parse action 'func', so that we don't incur call penalty at parse time
-
- # fmt: off
- LINE_DIFF = 7
- # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND
- # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!!
- _trim_arity_call_line = (_trim_arity_call_line or traceback.extract_stack(limit=2)[-1])
- pa_call_line_synth = (_trim_arity_call_line[0], _trim_arity_call_line[1] + LINE_DIFF)
-
- def wrapper(*args):
- nonlocal found_arity, limit
- while 1:
- try:
- ret = func(*args[limit:])
- found_arity = True
- return ret
- except TypeError as te:
- # re-raise TypeErrors if they did not come from our arity testing
- if found_arity:
- raise
- else:
- tb = te.__traceback__
- frames = traceback.extract_tb(tb, limit=2)
- frame_summary = frames[-1]
- trim_arity_type_error = (
- [frame_summary[:2]][-1][:2] == pa_call_line_synth
- )
- del tb
-
- if trim_arity_type_error:
- if limit < max_limit:
- limit += 1
- continue
-
- raise
- # fmt: on
-
- # copy func name to wrapper for sensible debug output
- # (can't use functools.wraps, since that messes with function signature)
- func_name = getattr(func, "__name__", getattr(func, "__class__").__name__)
- wrapper.__name__ = func_name
- wrapper.__doc__ = func.__doc__
-
- return wrapper
-
-
-def condition_as_parse_action(
- fn: ParseCondition, message: typing.Optional[str] = None, fatal: bool = False
-) -> ParseAction:
- """
- Function to convert a simple predicate function that returns ``True`` or ``False``
- into a parse action. Can be used in places when a parse action is required
- and :class:`ParserElement.add_condition` cannot be used (such as when adding a condition
- to an operator level in :class:`infix_notation`).
-
- Optional keyword arguments:
-
- - ``message`` - define a custom message to be used in the raised exception
- - ``fatal`` - if True, will raise :class:`ParseFatalException` to stop parsing immediately;
- otherwise will raise :class:`ParseException`
-
- """
- msg = message if message is not None else "failed user-defined condition"
- exc_type = ParseFatalException if fatal else ParseException
- fn = _trim_arity(fn)
-
- @wraps(fn)
- def pa(s, l, t):
- if not bool(fn(s, l, t)):
- raise exc_type(s, l, msg)
-
- return pa
-
-
-def _default_start_debug_action(
- instring: str, loc: int, expr: "ParserElement", cache_hit: bool = False
-):
- cache_hit_str = "*" if cache_hit else ""
- print(
- (
- f"{cache_hit_str}Match {expr} at loc {loc}({lineno(loc, instring)},{col(loc, instring)})\n"
- f" {line(loc, instring)}\n"
- f" {' ' * (col(loc, instring) - 1)}^"
- )
- )
-
-
-def _default_success_debug_action(
- instring: str,
- startloc: int,
- endloc: int,
- expr: "ParserElement",
- toks: ParseResults,
- cache_hit: bool = False,
-):
- cache_hit_str = "*" if cache_hit else ""
- print(f"{cache_hit_str}Matched {expr} -> {toks.as_list()}")
-
-
-def _default_exception_debug_action(
- instring: str,
- loc: int,
- expr: "ParserElement",
- exc: Exception,
- cache_hit: bool = False,
-):
- cache_hit_str = "*" if cache_hit else ""
- print(f"{cache_hit_str}Match {expr} failed, {type(exc).__name__} raised: {exc}")
-
-
-def null_debug_action(*args):
- """'Do-nothing' debug action, to suppress debugging output during parsing."""
-
-
-class ParserElement(ABC):
- """Abstract base level parser element class."""
-
- DEFAULT_WHITE_CHARS: str = " \n\t\r"
- verbose_stacktrace: bool = False
- _literalStringClass: type = None # type: ignore[assignment]
-
- @staticmethod
- def set_default_whitespace_chars(chars: str) -> None:
- r"""
- Overrides the default whitespace chars
-
- Example::
-
- # default whitespace chars are space, <TAB> and newline
- Word(alphas)[1, ...].parse_string("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl']
-
- # change to just treat newline as significant
- ParserElement.set_default_whitespace_chars(" \t")
- Word(alphas)[1, ...].parse_string("abc def\nghi jkl") # -> ['abc', 'def']
- """
- ParserElement.DEFAULT_WHITE_CHARS = chars
-
- # update whitespace all parse expressions defined in this module
- for expr in _builtin_exprs:
- if expr.copyDefaultWhiteChars:
- expr.whiteChars = set(chars)
-
- @staticmethod
- def inline_literals_using(cls: type) -> None:
- """
- Set class to be used for inclusion of string literals into a parser.
-
- Example::
-
- # default literal class used is Literal
- integer = Word(nums)
- date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
-
- date_str.parse_string("1999/12/31") # -> ['1999', '/', '12', '/', '31']
-
-
- # change to Suppress
- ParserElement.inline_literals_using(Suppress)
- date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
-
- date_str.parse_string("1999/12/31") # -> ['1999', '12', '31']
- """
- ParserElement._literalStringClass = cls
-
- @classmethod
- def using_each(cls, seq, **class_kwargs):
- """
- Yields a sequence of class(obj, **class_kwargs) for obj in seq.
-
- Example::
-
- LPAR, RPAR, LBRACE, RBRACE, SEMI = Suppress.using_each("(){};")
-
- """
- yield from (cls(obj, **class_kwargs) for obj in seq)
-
- class DebugActions(NamedTuple):
- debug_try: typing.Optional[DebugStartAction]
- debug_match: typing.Optional[DebugSuccessAction]
- debug_fail: typing.Optional[DebugExceptionAction]
-
- def __init__(self, savelist: bool = False):
- self.parseAction: List[ParseAction] = list()
- self.failAction: typing.Optional[ParseFailAction] = None
- self.customName: str = None # type: ignore[assignment]
- self._defaultName: typing.Optional[str] = None
- self.resultsName: str = None # type: ignore[assignment]
- self.saveAsList = savelist
- self.skipWhitespace = True
- self.whiteChars = set(ParserElement.DEFAULT_WHITE_CHARS)
- self.copyDefaultWhiteChars = True
- # used when checking for left-recursion
- self.mayReturnEmpty = False
- self.keepTabs = False
- self.ignoreExprs: List["ParserElement"] = list()
- self.debug = False
- self.streamlined = False
- # optimize exception handling for subclasses that don't advance parse index
- self.mayIndexError = True
- self.errmsg = ""
- # mark results names as modal (report only last) or cumulative (list all)
- self.modalResults = True
- # custom debug actions
- self.debugActions = self.DebugActions(None, None, None)
- # avoid redundant calls to preParse
- self.callPreparse = True
- self.callDuringTry = False
- self.suppress_warnings_: List[Diagnostics] = []
-
- def suppress_warning(self, warning_type: Diagnostics) -> "ParserElement":
- """
- Suppress warnings emitted for a particular diagnostic on this expression.
-
- Example::
-
- base = pp.Forward()
- base.suppress_warning(Diagnostics.warn_on_parse_using_empty_Forward)
-
- # statement would normally raise a warning, but is now suppressed
- print(base.parse_string("x"))
-
- """
- self.suppress_warnings_.append(warning_type)
- return self
-
- def visit_all(self):
- """General-purpose method to yield all expressions and sub-expressions
- in a grammar. Typically just for internal use.
- """
- to_visit = deque([self])
- seen = set()
- while to_visit:
- cur = to_visit.popleft()
-
- # guard against looping forever through recursive grammars
- if cur in seen:
- continue
- seen.add(cur)
-
- to_visit.extend(cur.recurse())
- yield cur
-
- def copy(self) -> "ParserElement":
- """
- Make a copy of this :class:`ParserElement`. Useful for defining
- different parse actions for the same parsing pattern, using copies of
- the original parse element.
-
- Example::
-
- integer = Word(nums).set_parse_action(lambda toks: int(toks[0]))
- integerK = integer.copy().add_parse_action(lambda toks: toks[0] * 1024) + Suppress("K")
- integerM = integer.copy().add_parse_action(lambda toks: toks[0] * 1024 * 1024) + Suppress("M")
-
- print((integerK | integerM | integer)[1, ...].parse_string("5K 100 640K 256M"))
-
- prints::
-
- [5120, 100, 655360, 268435456]
-
- Equivalent form of ``expr.copy()`` is just ``expr()``::
-
- integerM = integer().add_parse_action(lambda toks: toks[0] * 1024 * 1024) + Suppress("M")
- """
- cpy = copy.copy(self)
- cpy.parseAction = self.parseAction[:]
- cpy.ignoreExprs = self.ignoreExprs[:]
- if self.copyDefaultWhiteChars:
- cpy.whiteChars = set(ParserElement.DEFAULT_WHITE_CHARS)
- return cpy
-
- def set_results_name(
- self, name: str, list_all_matches: bool = False, *, listAllMatches: bool = False
- ) -> "ParserElement":
- """
- Define name for referencing matching tokens as a nested attribute
- of the returned parse results.
-
- Normally, results names are assigned as you would assign keys in a dict:
- any existing value is overwritten by later values. If it is necessary to
- keep all values captured for a particular results name, call ``set_results_name``
- with ``list_all_matches`` = True.
-
- NOTE: ``set_results_name`` returns a *copy* of the original :class:`ParserElement` object;
- this is so that the client can define a basic element, such as an
- integer, and reference it in multiple places with different names.
-
- You can also set results names using the abbreviated syntax,
- ``expr("name")`` in place of ``expr.set_results_name("name")``
- - see :class:`__call__`. If ``list_all_matches`` is required, use
- ``expr("name*")``.
-
- Example::
-
- date_str = (integer.set_results_name("year") + '/'
- + integer.set_results_name("month") + '/'
- + integer.set_results_name("day"))
-
- # equivalent form:
- date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
- """
- listAllMatches = listAllMatches or list_all_matches
- return self._setResultsName(name, listAllMatches)
-
- def _setResultsName(self, name, listAllMatches=False):
- if name is None:
- return self
- newself = self.copy()
- if name.endswith("*"):
- name = name[:-1]
- listAllMatches = True
- newself.resultsName = name
- newself.modalResults = not listAllMatches
- return newself
-
- def set_break(self, break_flag: bool = True) -> "ParserElement":
- """
- Method to invoke the Python pdb debugger when this element is
- about to be parsed. Set ``break_flag`` to ``True`` to enable, ``False`` to
- disable.
- """
- if break_flag:
- _parseMethod = self._parse
-
- def breaker(instring, loc, doActions=True, callPreParse=True):
- import pdb
-
- # this call to pdb.set_trace() is intentional, not a checkin error
- pdb.set_trace()
- return _parseMethod(instring, loc, doActions, callPreParse)
-
- breaker._originalParseMethod = _parseMethod # type: ignore [attr-defined]
- self._parse = breaker # type: ignore [assignment]
- else:
- if hasattr(self._parse, "_originalParseMethod"):
- self._parse = self._parse._originalParseMethod # type: ignore [attr-defined, assignment]
- return self
-
- def set_parse_action(self, *fns: ParseAction, **kwargs) -> "ParserElement":
- """
- Define one or more actions to perform when successfully matching parse element definition.
-
- Parse actions can be called to perform data conversions, do extra validation,
- update external data structures, or enhance or replace the parsed tokens.
- Each parse action ``fn`` is a callable method with 0-3 arguments, called as
- ``fn(s, loc, toks)`` , ``fn(loc, toks)`` , ``fn(toks)`` , or just ``fn()`` , where:
-
- - ``s`` = the original string being parsed (see note below)
- - ``loc`` = the location of the matching substring
- - ``toks`` = a list of the matched tokens, packaged as a :class:`ParseResults` object
-
- The parsed tokens are passed to the parse action as ParseResults. They can be
- modified in place using list-style append, extend, and pop operations to update
- the parsed list elements; and with dictionary-style item set and del operations
- to add, update, or remove any named results. If the tokens are modified in place,
- it is not necessary to return them with a return statement.
-
- Parse actions can also completely replace the given tokens, with another ``ParseResults``
- object, or with some entirely different object (common for parse actions that perform data
- conversions). A convenient way to build a new parse result is to define the values
- using a dict, and then create the return value using :class:`ParseResults.from_dict`.
-
- If None is passed as the ``fn`` parse action, all previously added parse actions for this
- expression are cleared.
-
- Optional keyword arguments:
-
- - ``call_during_try`` = (default= ``False``) indicate if parse action should be run during
- lookaheads and alternate testing. For parse actions that have side effects, it is
- important to only call the parse action once it is determined that it is being
- called as part of a successful parse. For parse actions that perform additional
- validation, then call_during_try should be passed as True, so that the validation
- code is included in the preliminary "try" parses.
-
- Note: the default parsing behavior is to expand tabs in the input string
- before starting the parsing process. See :class:`parse_string` for more
- information on parsing strings containing ``<TAB>`` s, and suggested
- methods to maintain a consistent view of the parsed string, the parse
- location, and line and column positions within the parsed string.
-
- Example::
-
- # parse dates in the form YYYY/MM/DD
-
- # use parse action to convert toks from str to int at parse time
- def convert_to_int(toks):
- return int(toks[0])
-
- # use a parse action to verify that the date is a valid date
- def is_valid_date(instring, loc, toks):
- from datetime import date
- year, month, day = toks[::2]
- try:
- date(year, month, day)
- except ValueError:
- raise ParseException(instring, loc, "invalid date given")
-
- integer = Word(nums)
- date_str = integer + '/' + integer + '/' + integer
-
- # add parse actions
- integer.set_parse_action(convert_to_int)
- date_str.set_parse_action(is_valid_date)
-
- # note that integer fields are now ints, not strings
- date_str.run_tests('''
- # successful parse - note that integer fields were converted to ints
- 1999/12/31
-
- # fail - invalid date
- 1999/13/31
- ''')
- """
- if list(fns) == [None]:
- self.parseAction = []
- else:
- if not all(callable(fn) for fn in fns):
- raise TypeError("parse actions must be callable")
- self.parseAction = [_trim_arity(fn) for fn in fns]
- self.callDuringTry = kwargs.get(
- "call_during_try", kwargs.get("callDuringTry", False)
- )
- return self
-
- def add_parse_action(self, *fns: ParseAction, **kwargs) -> "ParserElement":
- """
- Add one or more parse actions to expression's list of parse actions. See :class:`set_parse_action`.
-
- See examples in :class:`copy`.
- """
- self.parseAction += [_trim_arity(fn) for fn in fns]
- self.callDuringTry = self.callDuringTry or kwargs.get(
- "call_during_try", kwargs.get("callDuringTry", False)
- )
- return self
-
- def add_condition(self, *fns: ParseCondition, **kwargs) -> "ParserElement":
- """Add a boolean predicate function to expression's list of parse actions. See
- :class:`set_parse_action` for function call signatures. Unlike ``set_parse_action``,
- functions passed to ``add_condition`` need to return boolean success/fail of the condition.
-
- Optional keyword arguments:
-
- - ``message`` = define a custom message to be used in the raised exception
- - ``fatal`` = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise
- ParseException
- - ``call_during_try`` = boolean to indicate if this method should be called during internal tryParse calls,
- default=False
-
- Example::
-
- integer = Word(nums).set_parse_action(lambda toks: int(toks[0]))
- year_int = integer.copy()
- year_int.add_condition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later")
- date_str = year_int + '/' + integer + '/' + integer
-
- result = date_str.parse_string("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0),
- (line:1, col:1)
- """
- for fn in fns:
- self.parseAction.append(
- condition_as_parse_action(
- fn,
- message=str(kwargs.get("message")),
- fatal=bool(kwargs.get("fatal", False)),
- )
- )
-
- self.callDuringTry = self.callDuringTry or kwargs.get(
- "call_during_try", kwargs.get("callDuringTry", False)
- )
- return self
-
- def set_fail_action(self, fn: ParseFailAction) -> "ParserElement":
- """
- Define action to perform if parsing fails at this expression.
- Fail acton fn is a callable function that takes the arguments
- ``fn(s, loc, expr, err)`` where:
-
- - ``s`` = string being parsed
- - ``loc`` = location where expression match was attempted and failed
- - ``expr`` = the parse expression that failed
- - ``err`` = the exception thrown
-
- The function returns no value. It may throw :class:`ParseFatalException`
- if it is desired to stop parsing immediately."""
- self.failAction = fn
- return self
-
- def _skipIgnorables(self, instring: str, loc: int) -> int:
- if not self.ignoreExprs:
- return loc
- exprsFound = True
- ignore_expr_fns = [e._parse for e in self.ignoreExprs]
- while exprsFound:
- exprsFound = False
- for ignore_fn in ignore_expr_fns:
- try:
- while 1:
- loc, dummy = ignore_fn(instring, loc)
- exprsFound = True
- except ParseException:
- pass
- return loc
-
- def preParse(self, instring: str, loc: int) -> int:
- if self.ignoreExprs:
- loc = self._skipIgnorables(instring, loc)
-
- if self.skipWhitespace:
- instrlen = len(instring)
- white_chars = self.whiteChars
- while loc < instrlen and instring[loc] in white_chars:
- loc += 1
-
- return loc
-
- def parseImpl(self, instring, loc, doActions=True):
- return loc, []
-
- def postParse(self, instring, loc, tokenlist):
- return tokenlist
-
- # @profile
- def _parseNoCache(
- self, instring, loc, doActions=True, callPreParse=True
- ) -> Tuple[int, ParseResults]:
- TRY, MATCH, FAIL = 0, 1, 2
- debugging = self.debug # and doActions)
- len_instring = len(instring)
-
- if debugging or self.failAction:
- # print("Match {} at loc {}({}, {})".format(self, loc, lineno(loc, instring), col(loc, instring)))
- try:
- if callPreParse and self.callPreparse:
- pre_loc = self.preParse(instring, loc)
- else:
- pre_loc = loc
- tokens_start = pre_loc
- if self.debugActions.debug_try:
- self.debugActions.debug_try(instring, tokens_start, self, False)
- if self.mayIndexError or pre_loc >= len_instring:
- try:
- loc, tokens = self.parseImpl(instring, pre_loc, doActions)
- except IndexError:
- raise ParseException(instring, len_instring, self.errmsg, self)
- else:
- loc, tokens = self.parseImpl(instring, pre_loc, doActions)
- except Exception as err:
- # print("Exception raised:", err)
- if self.debugActions.debug_fail:
- self.debugActions.debug_fail(
- instring, tokens_start, self, err, False
- )
- if self.failAction:
- self.failAction(instring, tokens_start, self, err)
- raise
- else:
- if callPreParse and self.callPreparse:
- pre_loc = self.preParse(instring, loc)
- else:
- pre_loc = loc
- tokens_start = pre_loc
- if self.mayIndexError or pre_loc >= len_instring:
- try:
- loc, tokens = self.parseImpl(instring, pre_loc, doActions)
- except IndexError:
- raise ParseException(instring, len_instring, self.errmsg, self)
- else:
- loc, tokens = self.parseImpl(instring, pre_loc, doActions)
-
- tokens = self.postParse(instring, loc, tokens)
-
- ret_tokens = ParseResults(
- tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults
- )
- if self.parseAction and (doActions or self.callDuringTry):
- if debugging:
- try:
- for fn in self.parseAction:
- try:
- tokens = fn(instring, tokens_start, ret_tokens) # type: ignore [call-arg, arg-type]
- except IndexError as parse_action_exc:
- exc = ParseException("exception raised in parse action")
- raise exc from parse_action_exc
-
- if tokens is not None and tokens is not ret_tokens:
- ret_tokens = ParseResults(
- tokens,
- self.resultsName,
- asList=self.saveAsList
- and isinstance(tokens, (ParseResults, list)),
- modal=self.modalResults,
- )
- except Exception as err:
- # print "Exception raised in user parse action:", err
- if self.debugActions.debug_fail:
- self.debugActions.debug_fail(
- instring, tokens_start, self, err, False
- )
- raise
- else:
- for fn in self.parseAction:
- try:
- tokens = fn(instring, tokens_start, ret_tokens) # type: ignore [call-arg, arg-type]
- except IndexError as parse_action_exc:
- exc = ParseException("exception raised in parse action")
- raise exc from parse_action_exc
-
- if tokens is not None and tokens is not ret_tokens:
- ret_tokens = ParseResults(
- tokens,
- self.resultsName,
- asList=self.saveAsList
- and isinstance(tokens, (ParseResults, list)),
- modal=self.modalResults,
- )
- if debugging:
- # print("Matched", self, "->", ret_tokens.as_list())
- if self.debugActions.debug_match:
- self.debugActions.debug_match(
- instring, tokens_start, loc, self, ret_tokens, False
- )
-
- return loc, ret_tokens
-
- def try_parse(
- self,
- instring: str,
- loc: int,
- *,
- raise_fatal: bool = False,
- do_actions: bool = False,
- ) -> int:
- try:
- return self._parse(instring, loc, doActions=do_actions)[0]
- except ParseFatalException:
- if raise_fatal:
- raise
- raise ParseException(instring, loc, self.errmsg, self)
-
- def can_parse_next(self, instring: str, loc: int, do_actions: bool = False) -> bool:
- try:
- self.try_parse(instring, loc, do_actions=do_actions)
- except (ParseException, IndexError):
- return False
- else:
- return True
-
- # cache for left-recursion in Forward references
- recursion_lock = RLock()
- recursion_memos: typing.Dict[
- Tuple[int, "Forward", bool], Tuple[int, Union[ParseResults, Exception]]
- ] = {}
-
- class _CacheType(dict):
- """
- class to help type checking
- """
-
- not_in_cache: bool
-
- def get(self, *args):
- ...
-
- def set(self, *args):
- ...
-
- # argument cache for optimizing repeated calls when backtracking through recursive expressions
- packrat_cache = (
- _CacheType()
- ) # set later by enable_packrat(); this is here so that reset_cache() doesn't fail
- packrat_cache_lock = RLock()
- packrat_cache_stats = [0, 0]
-
- # this method gets repeatedly called during backtracking with the same arguments -
- # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression
- def _parseCache(
- self, instring, loc, doActions=True, callPreParse=True
- ) -> Tuple[int, ParseResults]:
- HIT, MISS = 0, 1
- TRY, MATCH, FAIL = 0, 1, 2
- lookup = (self, instring, loc, callPreParse, doActions)
- with ParserElement.packrat_cache_lock:
- cache = ParserElement.packrat_cache
- value = cache.get(lookup)
- if value is cache.not_in_cache:
- ParserElement.packrat_cache_stats[MISS] += 1
- try:
- value = self._parseNoCache(instring, loc, doActions, callPreParse)
- except ParseBaseException as pe:
- # cache a copy of the exception, without the traceback
- cache.set(lookup, pe.__class__(*pe.args))
- raise
- else:
- cache.set(lookup, (value[0], value[1].copy(), loc))
- return value
- else:
- ParserElement.packrat_cache_stats[HIT] += 1
- if self.debug and self.debugActions.debug_try:
- try:
- self.debugActions.debug_try(instring, loc, self, cache_hit=True) # type: ignore [call-arg]
- except TypeError:
- pass
- if isinstance(value, Exception):
- if self.debug and self.debugActions.debug_fail:
- try:
- self.debugActions.debug_fail(
- instring, loc, self, value, cache_hit=True # type: ignore [call-arg]
- )
- except TypeError:
- pass
- raise value
-
- value = cast(Tuple[int, ParseResults, int], value)
- loc_, result, endloc = value[0], value[1].copy(), value[2]
- if self.debug and self.debugActions.debug_match:
- try:
- self.debugActions.debug_match(
- instring, loc_, endloc, self, result, cache_hit=True # type: ignore [call-arg]
- )
- except TypeError:
- pass
-
- return loc_, result
-
- _parse = _parseNoCache
-
- @staticmethod
- def reset_cache() -> None:
- ParserElement.packrat_cache.clear()
- ParserElement.packrat_cache_stats[:] = [0] * len(
- ParserElement.packrat_cache_stats
- )
- ParserElement.recursion_memos.clear()
-
- _packratEnabled = False
- _left_recursion_enabled = False
-
- @staticmethod
- def disable_memoization() -> None:
- """
- Disables active Packrat or Left Recursion parsing and their memoization
-
- This method also works if neither Packrat nor Left Recursion are enabled.
- This makes it safe to call before activating Packrat nor Left Recursion
- to clear any previous settings.
- """
- ParserElement.reset_cache()
- ParserElement._left_recursion_enabled = False
- ParserElement._packratEnabled = False
- ParserElement._parse = ParserElement._parseNoCache
-
- @staticmethod
- def enable_left_recursion(
- cache_size_limit: typing.Optional[int] = None, *, force=False
- ) -> None:
- """
- Enables "bounded recursion" parsing, which allows for both direct and indirect
- left-recursion. During parsing, left-recursive :class:`Forward` elements are
- repeatedly matched with a fixed recursion depth that is gradually increased
- until finding the longest match.
-
- Example::
-
- from pip._vendor import pyparsing as pp
- pp.ParserElement.enable_left_recursion()
-
- E = pp.Forward("E")
- num = pp.Word(pp.nums)
- # match `num`, or `num '+' num`, or `num '+' num '+' num`, ...
- E <<= E + '+' - num | num
-
- print(E.parse_string("1+2+3"))
-
- Recursion search naturally memoizes matches of ``Forward`` elements and may
- thus skip reevaluation of parse actions during backtracking. This may break
- programs with parse actions which rely on strict ordering of side-effects.
-
- Parameters:
-
- - ``cache_size_limit`` - (default=``None``) - memoize at most this many
- ``Forward`` elements during matching; if ``None`` (the default),
- memoize all ``Forward`` elements.
-
- Bounded Recursion parsing works similar but not identical to Packrat parsing,
- thus the two cannot be used together. Use ``force=True`` to disable any
- previous, conflicting settings.
- """
- if force:
- ParserElement.disable_memoization()
- elif ParserElement._packratEnabled:
- raise RuntimeError("Packrat and Bounded Recursion are not compatible")
- if cache_size_limit is None:
- ParserElement.recursion_memos = _UnboundedMemo() # type: ignore[assignment]
- elif cache_size_limit > 0:
- ParserElement.recursion_memos = _LRUMemo(capacity=cache_size_limit) # type: ignore[assignment]
- else:
- raise NotImplementedError("Memo size of %s" % cache_size_limit)
- ParserElement._left_recursion_enabled = True
-
- @staticmethod
- def enable_packrat(cache_size_limit: int = 128, *, force: bool = False) -> None:
- """
- Enables "packrat" parsing, which adds memoizing to the parsing logic.
- Repeated parse attempts at the same string location (which happens
- often in many complex grammars) can immediately return a cached value,
- instead of re-executing parsing/validating code. Memoizing is done of
- both valid results and parsing exceptions.
-
- Parameters:
-
- - ``cache_size_limit`` - (default= ``128``) - if an integer value is provided
- will limit the size of the packrat cache; if None is passed, then
- the cache size will be unbounded; if 0 is passed, the cache will
- be effectively disabled.
-
- This speedup may break existing programs that use parse actions that
- have side-effects. For this reason, packrat parsing is disabled when
- you first import pyparsing. To activate the packrat feature, your
- program must call the class method :class:`ParserElement.enable_packrat`.
- For best results, call ``enable_packrat()`` immediately after
- importing pyparsing.
-
- Example::
-
- from pip._vendor import pyparsing
- pyparsing.ParserElement.enable_packrat()
-
- Packrat parsing works similar but not identical to Bounded Recursion parsing,
- thus the two cannot be used together. Use ``force=True`` to disable any
- previous, conflicting settings.
- """
- if force:
- ParserElement.disable_memoization()
- elif ParserElement._left_recursion_enabled:
- raise RuntimeError("Packrat and Bounded Recursion are not compatible")
- if not ParserElement._packratEnabled:
- ParserElement._packratEnabled = True
- if cache_size_limit is None:
- ParserElement.packrat_cache = _UnboundedCache()
- else:
- ParserElement.packrat_cache = _FifoCache(cache_size_limit) # type: ignore[assignment]
- ParserElement._parse = ParserElement._parseCache
-
- def parse_string(
- self, instring: str, parse_all: bool = False, *, parseAll: bool = False
- ) -> ParseResults:
- """
- Parse a string with respect to the parser definition. This function is intended as the primary interface to the
- client code.
-
- :param instring: The input string to be parsed.
- :param parse_all: If set, the entire input string must match the grammar.
- :param parseAll: retained for pre-PEP8 compatibility, will be removed in a future release.
- :raises ParseException: Raised if ``parse_all`` is set and the input string does not match the whole grammar.
- :returns: the parsed data as a :class:`ParseResults` object, which may be accessed as a `list`, a `dict`, or
- an object with attributes if the given parser includes results names.
-
- If the input string is required to match the entire grammar, ``parse_all`` flag must be set to ``True``. This
- is also equivalent to ending the grammar with :class:`StringEnd`\\ ().
-
- To report proper column numbers, ``parse_string`` operates on a copy of the input string where all tabs are
- converted to spaces (8 spaces per tab, as per the default in ``string.expandtabs``). If the input string
- contains tabs and the grammar uses parse actions that use the ``loc`` argument to index into the string
- being parsed, one can ensure a consistent view of the input string by doing one of the following:
-
- - calling ``parse_with_tabs`` on your grammar before calling ``parse_string`` (see :class:`parse_with_tabs`),
- - define your parse action using the full ``(s,loc,toks)`` signature, and reference the input string using the
- parse action's ``s`` argument, or
- - explicitly expand the tabs in your input string before calling ``parse_string``.
-
- Examples:
-
- By default, partial matches are OK.
-
- >>> res = Word('a').parse_string('aaaaabaaa')
- >>> print(res)
- ['aaaaa']
-
- The parsing behavior varies by the inheriting class of this abstract class. Please refer to the children
- directly to see more examples.
-
- It raises an exception if parse_all flag is set and instring does not match the whole grammar.
-
- >>> res = Word('a').parse_string('aaaaabaaa', parse_all=True)
- Traceback (most recent call last):
- ...
- pyparsing.ParseException: Expected end of text, found 'b' (at char 5), (line:1, col:6)
- """
- parseAll = parse_all or parseAll
-
- ParserElement.reset_cache()
- if not self.streamlined:
- self.streamline()
- for e in self.ignoreExprs:
- e.streamline()
- if not self.keepTabs:
- instring = instring.expandtabs()
- try:
- loc, tokens = self._parse(instring, 0)
- if parseAll:
- loc = self.preParse(instring, loc)
- se = Empty() + StringEnd()
- se._parse(instring, loc)
- except ParseBaseException as exc:
- if ParserElement.verbose_stacktrace:
- raise
- else:
- # catch and re-raise exception from here, clearing out pyparsing internal stack trace
- raise exc.with_traceback(None)
- else:
- return tokens
-
- def scan_string(
- self,
- instring: str,
- max_matches: int = _MAX_INT,
- overlap: bool = False,
- *,
- debug: bool = False,
- maxMatches: int = _MAX_INT,
- ) -> Generator[Tuple[ParseResults, int, int], None, None]:
- """
- Scan the input string for expression matches. Each match will return the
- matching tokens, start location, and end location. May be called with optional
- ``max_matches`` argument, to clip scanning after 'n' matches are found. If
- ``overlap`` is specified, then overlapping matches will be reported.
-
- Note that the start and end locations are reported relative to the string
- being parsed. See :class:`parse_string` for more information on parsing
- strings with embedded tabs.
-
- Example::
-
- source = "sldjf123lsdjjkf345sldkjf879lkjsfd987"
- print(source)
- for tokens, start, end in Word(alphas).scan_string(source):
- print(' '*start + '^'*(end-start))
- print(' '*start + tokens[0])
-
- prints::
-
- sldjf123lsdjjkf345sldkjf879lkjsfd987
- ^^^^^
- sldjf
- ^^^^^^^
- lsdjjkf
- ^^^^^^
- sldkjf
- ^^^^^^
- lkjsfd
- """
- maxMatches = min(maxMatches, max_matches)
- if not self.streamlined:
- self.streamline()
- for e in self.ignoreExprs:
- e.streamline()
-
- if not self.keepTabs:
- instring = str(instring).expandtabs()
- instrlen = len(instring)
- loc = 0
- preparseFn = self.preParse
- parseFn = self._parse
- ParserElement.resetCache()
- matches = 0
- try:
- while loc <= instrlen and matches < maxMatches:
- try:
- preloc: int = preparseFn(instring, loc)
- nextLoc: int
- tokens: ParseResults
- nextLoc, tokens = parseFn(instring, preloc, callPreParse=False)
- except ParseException:
- loc = preloc + 1
- else:
- if nextLoc > loc:
- matches += 1
- if debug:
- print(
- {
- "tokens": tokens.asList(),
- "start": preloc,
- "end": nextLoc,
- }
- )
- yield tokens, preloc, nextLoc
- if overlap:
- nextloc = preparseFn(instring, loc)
- if nextloc > loc:
- loc = nextLoc
- else:
- loc += 1
- else:
- loc = nextLoc
- else:
- loc = preloc + 1
- except ParseBaseException as exc:
- if ParserElement.verbose_stacktrace:
- raise
- else:
- # catch and re-raise exception from here, clears out pyparsing internal stack trace
- raise exc.with_traceback(None)
-
- def transform_string(self, instring: str, *, debug: bool = False) -> str:
- """
- Extension to :class:`scan_string`, to modify matching text with modified tokens that may
- be returned from a parse action. To use ``transform_string``, define a grammar and
- attach a parse action to it that modifies the returned token list.
- Invoking ``transform_string()`` on a target string will then scan for matches,
- and replace the matched text patterns according to the logic in the parse
- action. ``transform_string()`` returns the resulting transformed string.
-
- Example::
-
- wd = Word(alphas)
- wd.set_parse_action(lambda toks: toks[0].title())
-
- print(wd.transform_string("now is the winter of our discontent made glorious summer by this sun of york."))
-
- prints::
-
- Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York.
- """
- out: List[str] = []
- lastE = 0
- # force preservation of <TAB>s, to minimize unwanted transformation of string, and to
- # keep string locs straight between transform_string and scan_string
- self.keepTabs = True
- try:
- for t, s, e in self.scan_string(instring, debug=debug):
- out.append(instring[lastE:s])
- if t:
- if isinstance(t, ParseResults):
- out += t.as_list()
- elif isinstance(t, Iterable) and not isinstance(t, str_type):
- out.extend(t)
- else:
- out.append(t)
- lastE = e
- out.append(instring[lastE:])
- out = [o for o in out if o]
- return "".join([str(s) for s in _flatten(out)])
- except ParseBaseException as exc:
- if ParserElement.verbose_stacktrace:
- raise
- else:
- # catch and re-raise exception from here, clears out pyparsing internal stack trace
- raise exc.with_traceback(None)
-
- def search_string(
- self,
- instring: str,
- max_matches: int = _MAX_INT,
- *,
- debug: bool = False,
- maxMatches: int = _MAX_INT,
- ) -> ParseResults:
- """
- Another extension to :class:`scan_string`, simplifying the access to the tokens found
- to match the given parse expression. May be called with optional
- ``max_matches`` argument, to clip searching after 'n' matches are found.
-
- Example::
-
- # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters
- cap_word = Word(alphas.upper(), alphas.lower())
-
- print(cap_word.search_string("More than Iron, more than Lead, more than Gold I need Electricity"))
-
- # the sum() builtin can be used to merge results into a single ParseResults object
- print(sum(cap_word.search_string("More than Iron, more than Lead, more than Gold I need Electricity")))
-
- prints::
-
- [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']]
- ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity']
- """
- maxMatches = min(maxMatches, max_matches)
- try:
- return ParseResults(
- [t for t, s, e in self.scan_string(instring, maxMatches, debug=debug)]
- )
- except ParseBaseException as exc:
- if ParserElement.verbose_stacktrace:
- raise
- else:
- # catch and re-raise exception from here, clears out pyparsing internal stack trace
- raise exc.with_traceback(None)
-
- def split(
- self,
- instring: str,
- maxsplit: int = _MAX_INT,
- include_separators: bool = False,
- *,
- includeSeparators=False,
- ) -> Generator[str, None, None]:
- """
- Generator method to split a string using the given expression as a separator.
- May be called with optional ``maxsplit`` argument, to limit the number of splits;
- and the optional ``include_separators`` argument (default= ``False``), if the separating
- matching text should be included in the split results.
-
- Example::
-
- punc = one_of(list(".,;:/-!?"))
- print(list(punc.split("This, this?, this sentence, is badly punctuated!")))
-
- prints::
-
- ['This', ' this', '', ' this sentence', ' is badly punctuated', '']
- """
- includeSeparators = includeSeparators or include_separators
- last = 0
- for t, s, e in self.scan_string(instring, max_matches=maxsplit):
- yield instring[last:s]
- if includeSeparators:
- yield t[0]
- last = e
- yield instring[last:]
-
- def __add__(self, other) -> "ParserElement":
- """
- Implementation of ``+`` operator - returns :class:`And`. Adding strings to a :class:`ParserElement`
- converts them to :class:`Literal`\\ s by default.
-
- Example::
-
- greet = Word(alphas) + "," + Word(alphas) + "!"
- hello = "Hello, World!"
- print(hello, "->", greet.parse_string(hello))
-
- prints::
-
- Hello, World! -> ['Hello', ',', 'World', '!']
-
- ``...`` may be used as a parse expression as a short form of :class:`SkipTo`::
-
- Literal('start') + ... + Literal('end')
-
- is equivalent to::
-
- Literal('start') + SkipTo('end')("_skipped*") + Literal('end')
-
- Note that the skipped text is returned with '_skipped' as a results name,
- and to support having multiple skips in the same parser, the value returned is
- a list of all skipped text.
- """
- if other is Ellipsis:
- return _PendingSkip(self)
-
- if isinstance(other, str_type):
- other = self._literalStringClass(other)
- if not isinstance(other, ParserElement):
- return NotImplemented
- return And([self, other])
-
- def __radd__(self, other) -> "ParserElement":
- """
- Implementation of ``+`` operator when left operand is not a :class:`ParserElement`
- """
- if other is Ellipsis:
- return SkipTo(self)("_skipped*") + self
-
- if isinstance(other, str_type):
- other = self._literalStringClass(other)
- if not isinstance(other, ParserElement):
- return NotImplemented
- return other + self
-
- def __sub__(self, other) -> "ParserElement":
- """
- Implementation of ``-`` operator, returns :class:`And` with error stop
- """
- if isinstance(other, str_type):
- other = self._literalStringClass(other)
- if not isinstance(other, ParserElement):
- return NotImplemented
- return self + And._ErrorStop() + other
-
- def __rsub__(self, other) -> "ParserElement":
- """
- Implementation of ``-`` operator when left operand is not a :class:`ParserElement`
- """
- if isinstance(other, str_type):
- other = self._literalStringClass(other)
- if not isinstance(other, ParserElement):
- return NotImplemented
- return other - self
-
- def __mul__(self, other) -> "ParserElement":
- """
- Implementation of ``*`` operator, allows use of ``expr * 3`` in place of
- ``expr + expr + expr``. Expressions may also be multiplied by a 2-integer
- tuple, similar to ``{min, max}`` multipliers in regular expressions. Tuples
- may also include ``None`` as in:
-
- - ``expr*(n, None)`` or ``expr*(n, )`` is equivalent
- to ``expr*n + ZeroOrMore(expr)``
- (read as "at least n instances of ``expr``")
- - ``expr*(None, n)`` is equivalent to ``expr*(0, n)``
- (read as "0 to n instances of ``expr``")
- - ``expr*(None, None)`` is equivalent to ``ZeroOrMore(expr)``
- - ``expr*(1, None)`` is equivalent to ``OneOrMore(expr)``
-
- Note that ``expr*(None, n)`` does not raise an exception if
- more than n exprs exist in the input stream; that is,
- ``expr*(None, n)`` does not enforce a maximum number of expr
- occurrences. If this behavior is desired, then write
- ``expr*(None, n) + ~expr``
- """
- if other is Ellipsis:
- other = (0, None)
- elif isinstance(other, tuple) and other[:1] == (Ellipsis,):
- other = ((0,) + other[1:] + (None,))[:2]
-
- if isinstance(other, int):
- minElements, optElements = other, 0
- elif isinstance(other, tuple):
- other = tuple(o if o is not Ellipsis else None for o in other)
- other = (other + (None, None))[:2]
- if other[0] is None:
- other = (0, other[1])
- if isinstance(other[0], int) and other[1] is None:
- if other[0] == 0:
- return ZeroOrMore(self)
- if other[0] == 1:
- return OneOrMore(self)
- else:
- return self * other[0] + ZeroOrMore(self)
- elif isinstance(other[0], int) and isinstance(other[1], int):
- minElements, optElements = other
- optElements -= minElements
- else:
- return NotImplemented
- else:
- return NotImplemented
-
- if minElements < 0:
- raise ValueError("cannot multiply ParserElement by negative value")
- if optElements < 0:
- raise ValueError(
- "second tuple value must be greater or equal to first tuple value"
- )
- if minElements == optElements == 0:
- return And([])
-
- if optElements:
-
- def makeOptionalList(n):
- if n > 1:
- return Opt(self + makeOptionalList(n - 1))
- else:
- return Opt(self)
-
- if minElements:
- if minElements == 1:
- ret = self + makeOptionalList(optElements)
- else:
- ret = And([self] * minElements) + makeOptionalList(optElements)
- else:
- ret = makeOptionalList(optElements)
- else:
- if minElements == 1:
- ret = self
- else:
- ret = And([self] * minElements)
- return ret
-
- def __rmul__(self, other) -> "ParserElement":
- return self.__mul__(other)
-
- def __or__(self, other) -> "ParserElement":
- """
- Implementation of ``|`` operator - returns :class:`MatchFirst`
- """
- if other is Ellipsis:
- return _PendingSkip(self, must_skip=True)
-
- if isinstance(other, str_type):
- # `expr | ""` is equivalent to `Opt(expr)`
- if other == "":
- return Opt(self)
- other = self._literalStringClass(other)
- if not isinstance(other, ParserElement):
- return NotImplemented
- return MatchFirst([self, other])
-
- def __ror__(self, other) -> "ParserElement":
- """
- Implementation of ``|`` operator when left operand is not a :class:`ParserElement`
- """
- if isinstance(other, str_type):
- other = self._literalStringClass(other)
- if not isinstance(other, ParserElement):
- return NotImplemented
- return other | self
-
- def __xor__(self, other) -> "ParserElement":
- """
- Implementation of ``^`` operator - returns :class:`Or`
- """
- if isinstance(other, str_type):
- other = self._literalStringClass(other)
- if not isinstance(other, ParserElement):
- return NotImplemented
- return Or([self, other])
-
- def __rxor__(self, other) -> "ParserElement":
- """
- Implementation of ``^`` operator when left operand is not a :class:`ParserElement`
- """
- if isinstance(other, str_type):
- other = self._literalStringClass(other)
- if not isinstance(other, ParserElement):
- return NotImplemented
- return other ^ self
-
- def __and__(self, other) -> "ParserElement":
- """
- Implementation of ``&`` operator - returns :class:`Each`
- """
- if isinstance(other, str_type):
- other = self._literalStringClass(other)
- if not isinstance(other, ParserElement):
- return NotImplemented
- return Each([self, other])
-
- def __rand__(self, other) -> "ParserElement":
- """
- Implementation of ``&`` operator when left operand is not a :class:`ParserElement`
- """
- if isinstance(other, str_type):
- other = self._literalStringClass(other)
- if not isinstance(other, ParserElement):
- return NotImplemented
- return other & self
-
- def __invert__(self) -> "ParserElement":
- """
- Implementation of ``~`` operator - returns :class:`NotAny`
- """
- return NotAny(self)
-
- # disable __iter__ to override legacy use of sequential access to __getitem__ to
- # iterate over a sequence
- __iter__ = None
-
- def __getitem__(self, key):
- """
- use ``[]`` indexing notation as a short form for expression repetition:
-
- - ``expr[n]`` is equivalent to ``expr*n``
- - ``expr[m, n]`` is equivalent to ``expr*(m, n)``
- - ``expr[n, ...]`` or ``expr[n,]`` is equivalent
- to ``expr*n + ZeroOrMore(expr)``
- (read as "at least n instances of ``expr``")
- - ``expr[..., n]`` is equivalent to ``expr*(0, n)``
- (read as "0 to n instances of ``expr``")
- - ``expr[...]`` and ``expr[0, ...]`` are equivalent to ``ZeroOrMore(expr)``
- - ``expr[1, ...]`` is equivalent to ``OneOrMore(expr)``
-
- ``None`` may be used in place of ``...``.
-
- Note that ``expr[..., n]`` and ``expr[m, n]`` do not raise an exception
- if more than ``n`` ``expr``\\ s exist in the input stream. If this behavior is
- desired, then write ``expr[..., n] + ~expr``.
-
- For repetition with a stop_on expression, use slice notation:
-
- - ``expr[...: end_expr]`` and ``expr[0, ...: end_expr]`` are equivalent to ``ZeroOrMore(expr, stop_on=end_expr)``
- - ``expr[1, ...: end_expr]`` is equivalent to ``OneOrMore(expr, stop_on=end_expr)``
-
- """
-
- stop_on_defined = False
- stop_on = NoMatch()
- if isinstance(key, slice):
- key, stop_on = key.start, key.stop
- if key is None:
- key = ...
- stop_on_defined = True
- elif isinstance(key, tuple) and isinstance(key[-1], slice):
- key, stop_on = (key[0], key[1].start), key[1].stop
- stop_on_defined = True
-
- # convert single arg keys to tuples
- if isinstance(key, str_type):
- key = (key,)
- try:
- iter(key)
- except TypeError:
- key = (key, key)
-
- if len(key) > 2:
- raise TypeError(
- f"only 1 or 2 index arguments supported ({key[:5]}{f'... [{len(key)}]' if len(key) > 5 else ''})"
- )
-
- # clip to 2 elements
- ret = self * tuple(key[:2])
- ret = typing.cast(_MultipleMatch, ret)
-
- if stop_on_defined:
- ret.stopOn(stop_on)
-
- return ret
-
- def __call__(self, name: typing.Optional[str] = None) -> "ParserElement":
- """
- Shortcut for :class:`set_results_name`, with ``list_all_matches=False``.
-
- If ``name`` is given with a trailing ``'*'`` character, then ``list_all_matches`` will be
- passed as ``True``.
-
- If ``name`` is omitted, same as calling :class:`copy`.
-
- Example::
-
- # these are equivalent
- userdata = Word(alphas).set_results_name("name") + Word(nums + "-").set_results_name("socsecno")
- userdata = Word(alphas)("name") + Word(nums + "-")("socsecno")
- """
- if name is not None:
- return self._setResultsName(name)
- else:
- return self.copy()
-
- def suppress(self) -> "ParserElement":
- """
- Suppresses the output of this :class:`ParserElement`; useful to keep punctuation from
- cluttering up returned output.
- """
- return Suppress(self)
-
- def ignore_whitespace(self, recursive: bool = True) -> "ParserElement":
- """
- Enables the skipping of whitespace before matching the characters in the
- :class:`ParserElement`'s defined pattern.
-
- :param recursive: If ``True`` (the default), also enable whitespace skipping in child elements (if any)
- """
- self.skipWhitespace = True
- return self
-
- def leave_whitespace(self, recursive: bool = True) -> "ParserElement":
- """
- Disables the skipping of whitespace before matching the characters in the
- :class:`ParserElement`'s defined pattern. This is normally only used internally by
- the pyparsing module, but may be needed in some whitespace-sensitive grammars.
-
- :param recursive: If true (the default), also disable whitespace skipping in child elements (if any)
- """
- self.skipWhitespace = False
- return self
-
- def set_whitespace_chars(
- self, chars: Union[Set[str], str], copy_defaults: bool = False
- ) -> "ParserElement":
- """
- Overrides the default whitespace chars
- """
- self.skipWhitespace = True
- self.whiteChars = set(chars)
- self.copyDefaultWhiteChars = copy_defaults
- return self
-
- def parse_with_tabs(self) -> "ParserElement":
- """
- Overrides default behavior to expand ``<TAB>`` s to spaces before parsing the input string.
- Must be called before ``parse_string`` when the input grammar contains elements that
- match ``<TAB>`` characters.
- """
- self.keepTabs = True
- return self
-
- def ignore(self, other: "ParserElement") -> "ParserElement":
- """
- Define expression to be ignored (e.g., comments) while doing pattern
- matching; may be called repeatedly, to define multiple comment or other
- ignorable patterns.
-
- Example::
-
- patt = Word(alphas)[1, ...]
- patt.parse_string('ablaj /* comment */ lskjd')
- # -> ['ablaj']
-
- patt.ignore(c_style_comment)
- patt.parse_string('ablaj /* comment */ lskjd')
- # -> ['ablaj', 'lskjd']
- """
- import typing
-
- if isinstance(other, str_type):
- other = Suppress(other)
-
- if isinstance(other, Suppress):
- if other not in self.ignoreExprs:
- self.ignoreExprs.append(other)
- else:
- self.ignoreExprs.append(Suppress(other.copy()))
- return self
-
- def set_debug_actions(
- self,
- start_action: DebugStartAction,
- success_action: DebugSuccessAction,
- exception_action: DebugExceptionAction,
- ) -> "ParserElement":
- """
- Customize display of debugging messages while doing pattern matching:
-
- - ``start_action`` - method to be called when an expression is about to be parsed;
- should have the signature ``fn(input_string: str, location: int, expression: ParserElement, cache_hit: bool)``
-
- - ``success_action`` - method to be called when an expression has successfully parsed;
- should have the signature ``fn(input_string: str, start_location: int, end_location: int, expression: ParserELement, parsed_tokens: ParseResults, cache_hit: bool)``
-
- - ``exception_action`` - method to be called when expression fails to parse;
- should have the signature ``fn(input_string: str, location: int, expression: ParserElement, exception: Exception, cache_hit: bool)``
- """
- self.debugActions = self.DebugActions(
- start_action or _default_start_debug_action, # type: ignore[truthy-function]
- success_action or _default_success_debug_action, # type: ignore[truthy-function]
- exception_action or _default_exception_debug_action, # type: ignore[truthy-function]
- )
- self.debug = True
- return self
-
- def set_debug(self, flag: bool = True, recurse: bool = False) -> "ParserElement":
- """
- Enable display of debugging messages while doing pattern matching.
- Set ``flag`` to ``True`` to enable, ``False`` to disable.
- Set ``recurse`` to ``True`` to set the debug flag on this expression and all sub-expressions.
-
- Example::
-
- wd = Word(alphas).set_name("alphaword")
- integer = Word(nums).set_name("numword")
- term = wd | integer
-
- # turn on debugging for wd
- wd.set_debug()
-
- term[1, ...].parse_string("abc 123 xyz 890")
-
- prints::
-
- Match alphaword at loc 0(1,1)
- Matched alphaword -> ['abc']
- Match alphaword at loc 3(1,4)
- Exception raised:Expected alphaword (at char 4), (line:1, col:5)
- Match alphaword at loc 7(1,8)
- Matched alphaword -> ['xyz']
- Match alphaword at loc 11(1,12)
- Exception raised:Expected alphaword (at char 12), (line:1, col:13)
- Match alphaword at loc 15(1,16)
- Exception raised:Expected alphaword (at char 15), (line:1, col:16)
-
- The output shown is that produced by the default debug actions - custom debug actions can be
- specified using :class:`set_debug_actions`. Prior to attempting
- to match the ``wd`` expression, the debugging message ``"Match <exprname> at loc <n>(<line>,<col>)"``
- is shown. Then if the parse succeeds, a ``"Matched"`` message is shown, or an ``"Exception raised"``
- message is shown. Also note the use of :class:`set_name` to assign a human-readable name to the expression,
- which makes debugging and exception messages easier to understand - for instance, the default
- name created for the :class:`Word` expression without calling ``set_name`` is ``"W:(A-Za-z)"``.
- """
- if recurse:
- for expr in self.visit_all():
- expr.set_debug(flag, recurse=False)
- return self
-
- if flag:
- self.set_debug_actions(
- _default_start_debug_action,
- _default_success_debug_action,
- _default_exception_debug_action,
- )
- else:
- self.debug = False
- return self
-
- @property
- def default_name(self) -> str:
- if self._defaultName is None:
- self._defaultName = self._generateDefaultName()
- return self._defaultName
-
- @abstractmethod
- def _generateDefaultName(self) -> str:
- """
- Child classes must define this method, which defines how the ``default_name`` is set.
- """
-
- def set_name(self, name: str) -> "ParserElement":
- """
- Define name for this expression, makes debugging and exception messages clearer.
-
- Example::
-
- Word(nums).parse_string("ABC") # -> Exception: Expected W:(0-9) (at char 0), (line:1, col:1)
- Word(nums).set_name("integer").parse_string("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1)
- """
- self.customName = name
- self.errmsg = "Expected " + self.name
- if __diag__.enable_debug_on_named_expressions:
- self.set_debug()
- return self
-
- @property
- def name(self) -> str:
- # This will use a user-defined name if available, but otherwise defaults back to the auto-generated name
- return self.customName if self.customName is not None else self.default_name
-
- def __str__(self) -> str:
- return self.name
-
- def __repr__(self) -> str:
- return str(self)
-
- def streamline(self) -> "ParserElement":
- self.streamlined = True
- self._defaultName = None
- return self
-
- def recurse(self) -> List["ParserElement"]:
- return []
-
- def _checkRecursion(self, parseElementList):
- subRecCheckList = parseElementList[:] + [self]
- for e in self.recurse():
- e._checkRecursion(subRecCheckList)
-
- def validate(self, validateTrace=None) -> None:
- """
- Check defined expressions for valid structure, check for infinite recursive definitions.
- """
- warnings.warn(
- "ParserElement.validate() is deprecated, and should not be used to check for left recursion",
- DeprecationWarning,
- stacklevel=2,
- )
- self._checkRecursion([])
-
- def parse_file(
- self,
- file_or_filename: Union[str, Path, TextIO],
- encoding: str = "utf-8",
- parse_all: bool = False,
- *,
- parseAll: bool = False,
- ) -> ParseResults:
- """
- Execute the parse expression on the given file or filename.
- If a filename is specified (instead of a file object),
- the entire file is opened, read, and closed before parsing.
- """
- parseAll = parseAll or parse_all
- try:
- file_or_filename = typing.cast(TextIO, file_or_filename)
- file_contents = file_or_filename.read()
- except AttributeError:
- file_or_filename = typing.cast(str, file_or_filename)
- with open(file_or_filename, "r", encoding=encoding) as f:
- file_contents = f.read()
- try:
- return self.parse_string(file_contents, parseAll)
- except ParseBaseException as exc:
- if ParserElement.verbose_stacktrace:
- raise
- else:
- # catch and re-raise exception from here, clears out pyparsing internal stack trace
- raise exc.with_traceback(None)
-
- def __eq__(self, other):
- if self is other:
- return True
- elif isinstance(other, str_type):
- return self.matches(other, parse_all=True)
- elif isinstance(other, ParserElement):
- return vars(self) == vars(other)
- return False
-
- def __hash__(self):
- return id(self)
-
- def matches(
- self, test_string: str, parse_all: bool = True, *, parseAll: bool = True
- ) -> bool:
- """
- Method for quick testing of a parser against a test string. Good for simple
- inline microtests of sub expressions while building up larger parser.
-
- Parameters:
-
- - ``test_string`` - to test against this expression for a match
- - ``parse_all`` - (default= ``True``) - flag to pass to :class:`parse_string` when running tests
-
- Example::
-
- expr = Word(nums)
- assert expr.matches("100")
- """
- parseAll = parseAll and parse_all
- try:
- self.parse_string(str(test_string), parse_all=parseAll)
- return True
- except ParseBaseException:
- return False
-
- def run_tests(
- self,
- tests: Union[str, List[str]],
- parse_all: bool = True,
- comment: typing.Optional[Union["ParserElement", str]] = "#",
- full_dump: bool = True,
- print_results: bool = True,
- failure_tests: bool = False,
- post_parse: typing.Optional[Callable[[str, ParseResults], str]] = None,
- file: typing.Optional[TextIO] = None,
- with_line_numbers: bool = False,
- *,
- parseAll: bool = True,
- fullDump: bool = True,
- printResults: bool = True,
- failureTests: bool = False,
- postParse: typing.Optional[Callable[[str, ParseResults], str]] = None,
- ) -> Tuple[bool, List[Tuple[str, Union[ParseResults, Exception]]]]:
- """
- Execute the parse expression on a series of test strings, showing each
- test, the parsed results or where the parse failed. Quick and easy way to
- run a parse expression against a list of sample strings.
-
- Parameters:
-
- - ``tests`` - a list of separate test strings, or a multiline string of test strings
- - ``parse_all`` - (default= ``True``) - flag to pass to :class:`parse_string` when running tests
- - ``comment`` - (default= ``'#'``) - expression for indicating embedded comments in the test
- string; pass None to disable comment filtering
- - ``full_dump`` - (default= ``True``) - dump results as list followed by results names in nested outline;
- if False, only dump nested list
- - ``print_results`` - (default= ``True``) prints test output to stdout
- - ``failure_tests`` - (default= ``False``) indicates if these tests are expected to fail parsing
- - ``post_parse`` - (default= ``None``) optional callback for successful parse results; called as
- `fn(test_string, parse_results)` and returns a string to be added to the test output
- - ``file`` - (default= ``None``) optional file-like object to which test output will be written;
- if None, will default to ``sys.stdout``
- - ``with_line_numbers`` - default= ``False``) show test strings with line and column numbers
-
- Returns: a (success, results) tuple, where success indicates that all tests succeeded
- (or failed if ``failure_tests`` is True), and the results contain a list of lines of each
- test's output
-
- Example::
-
- number_expr = pyparsing_common.number.copy()
-
- result = number_expr.run_tests('''
- # unsigned integer
- 100
- # negative integer
- -100
- # float with scientific notation
- 6.02e23
- # integer with scientific notation
- 1e-12
- ''')
- print("Success" if result[0] else "Failed!")
-
- result = number_expr.run_tests('''
- # stray character
- 100Z
- # missing leading digit before '.'
- -.100
- # too many '.'
- 3.14.159
- ''', failure_tests=True)
- print("Success" if result[0] else "Failed!")
-
- prints::
-
- # unsigned integer
- 100
- [100]
-
- # negative integer
- -100
- [-100]
-
- # float with scientific notation
- 6.02e23
- [6.02e+23]
-
- # integer with scientific notation
- 1e-12
- [1e-12]
-
- Success
-
- # stray character
- 100Z
- ^
- FAIL: Expected end of text (at char 3), (line:1, col:4)
-
- # missing leading digit before '.'
- -.100
- ^
- FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1)
-
- # too many '.'
- 3.14.159
- ^
- FAIL: Expected end of text (at char 4), (line:1, col:5)
-
- Success
-
- Each test string must be on a single line. If you want to test a string that spans multiple
- lines, create a test like this::
-
- expr.run_tests(r"this is a test\\n of strings that spans \\n 3 lines")
-
- (Note that this is a raw string literal, you must include the leading ``'r'``.)
- """
- from .testing import pyparsing_test
-
- parseAll = parseAll and parse_all
- fullDump = fullDump and full_dump
- printResults = printResults and print_results
- failureTests = failureTests or failure_tests
- postParse = postParse or post_parse
- if isinstance(tests, str_type):
- tests = typing.cast(str, tests)
- line_strip = type(tests).strip
- tests = [line_strip(test_line) for test_line in tests.rstrip().splitlines()]
- comment_specified = comment is not None
- if comment_specified:
- if isinstance(comment, str_type):
- comment = typing.cast(str, comment)
- comment = Literal(comment)
- comment = typing.cast(ParserElement, comment)
- if file is None:
- file = sys.stdout
- print_ = file.write
-
- result: Union[ParseResults, Exception]
- allResults: List[Tuple[str, Union[ParseResults, Exception]]] = []
- comments: List[str] = []
- success = True
- NL = Literal(r"\n").add_parse_action(replace_with("\n")).ignore(quoted_string)
- BOM = "\ufeff"
- for t in tests:
- if comment_specified and comment.matches(t, False) or comments and not t:
- comments.append(
- pyparsing_test.with_line_numbers(t) if with_line_numbers else t
- )
- continue
- if not t:
- continue
- out = [
- "\n" + "\n".join(comments) if comments else "",
- pyparsing_test.with_line_numbers(t) if with_line_numbers else t,
- ]
- comments = []
- try:
- # convert newline marks to actual newlines, and strip leading BOM if present
- t = NL.transform_string(t.lstrip(BOM))
- result = self.parse_string(t, parse_all=parseAll)
- except ParseBaseException as pe:
- fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else ""
- out.append(pe.explain())
- out.append("FAIL: " + str(pe))
- if ParserElement.verbose_stacktrace:
- out.extend(traceback.format_tb(pe.__traceback__))
- success = success and failureTests
- result = pe
- except Exception as exc:
- out.append(f"FAIL-EXCEPTION: {type(exc).__name__}: {exc}")
- if ParserElement.verbose_stacktrace:
- out.extend(traceback.format_tb(exc.__traceback__))
- success = success and failureTests
- result = exc
- else:
- success = success and not failureTests
- if postParse is not None:
- try:
- pp_value = postParse(t, result)
- if pp_value is not None:
- if isinstance(pp_value, ParseResults):
- out.append(pp_value.dump())
- else:
- out.append(str(pp_value))
- else:
- out.append(result.dump())
- except Exception as e:
- out.append(result.dump(full=fullDump))
- out.append(
- f"{postParse.__name__} failed: {type(e).__name__}: {e}"
- )
- else:
- out.append(result.dump(full=fullDump))
- out.append("")
-
- if printResults:
- print_("\n".join(out))
-
- allResults.append((t, result))
-
- return success, allResults
-
- def create_diagram(
- self,
- output_html: Union[TextIO, Path, str],
- vertical: int = 3,
- show_results_names: bool = False,
- show_groups: bool = False,
- embed: bool = False,
- **kwargs,
- ) -> None:
- """
- Create a railroad diagram for the parser.
-
- Parameters:
-
- - ``output_html`` (str or file-like object) - output target for generated
- diagram HTML
- - ``vertical`` (int) - threshold for formatting multiple alternatives vertically
- instead of horizontally (default=3)
- - ``show_results_names`` - bool flag whether diagram should show annotations for
- defined results names
- - ``show_groups`` - bool flag whether groups should be highlighted with an unlabeled surrounding box
- - ``embed`` - bool flag whether generated HTML should omit <HEAD>, <BODY>, and <DOCTYPE> tags to embed
- the resulting HTML in an enclosing HTML source
- - ``head`` - str containing additional HTML to insert into the <HEAD> section of the generated code;
- can be used to insert custom CSS styling
- - ``body`` - str containing additional HTML to insert at the beginning of the <BODY> section of the
- generated code
-
- Additional diagram-formatting keyword arguments can also be included;
- see railroad.Diagram class.
- """
-
- try:
- from .diagram import to_railroad, railroad_to_html
- except ImportError as ie:
- raise Exception(
- "must ``pip install pyparsing[diagrams]`` to generate parser railroad diagrams"
- ) from ie
-
- self.streamline()
-
- railroad = to_railroad(
- self,
- vertical=vertical,
- show_results_names=show_results_names,
- show_groups=show_groups,
- diagram_kwargs=kwargs,
- )
- if isinstance(output_html, (str, Path)):
- with open(output_html, "w", encoding="utf-8") as diag_file:
- diag_file.write(railroad_to_html(railroad, embed=embed, **kwargs))
- else:
- # we were passed a file-like object, just write to it
- output_html.write(railroad_to_html(railroad, embed=embed, **kwargs))
-
- # Compatibility synonyms
- # fmt: off
- @staticmethod
- @replaced_by_pep8(inline_literals_using)
- def inlineLiteralsUsing(): ...
-
- @staticmethod
- @replaced_by_pep8(set_default_whitespace_chars)
- def setDefaultWhitespaceChars(): ...
-
- @replaced_by_pep8(set_results_name)
- def setResultsName(self): ...
-
- @replaced_by_pep8(set_break)
- def setBreak(self): ...
-
- @replaced_by_pep8(set_parse_action)
- def setParseAction(self): ...
-
- @replaced_by_pep8(add_parse_action)
- def addParseAction(self): ...
-
- @replaced_by_pep8(add_condition)
- def addCondition(self): ...
-
- @replaced_by_pep8(set_fail_action)
- def setFailAction(self): ...
-
- @replaced_by_pep8(try_parse)
- def tryParse(self): ...
-
- @staticmethod
- @replaced_by_pep8(enable_left_recursion)
- def enableLeftRecursion(): ...
-
- @staticmethod
- @replaced_by_pep8(enable_packrat)
- def enablePackrat(): ...
-
- @replaced_by_pep8(parse_string)
- def parseString(self): ...
-
- @replaced_by_pep8(scan_string)
- def scanString(self): ...
-
- @replaced_by_pep8(transform_string)
- def transformString(self): ...
-
- @replaced_by_pep8(search_string)
- def searchString(self): ...
-
- @replaced_by_pep8(ignore_whitespace)
- def ignoreWhitespace(self): ...
-
- @replaced_by_pep8(leave_whitespace)
- def leaveWhitespace(self): ...
-
- @replaced_by_pep8(set_whitespace_chars)
- def setWhitespaceChars(self): ...
-
- @replaced_by_pep8(parse_with_tabs)
- def parseWithTabs(self): ...
-
- @replaced_by_pep8(set_debug_actions)
- def setDebugActions(self): ...
-
- @replaced_by_pep8(set_debug)
- def setDebug(self): ...
-
- @replaced_by_pep8(set_name)
- def setName(self): ...
-
- @replaced_by_pep8(parse_file)
- def parseFile(self): ...
-
- @replaced_by_pep8(run_tests)
- def runTests(self): ...
-
- canParseNext = can_parse_next
- resetCache = reset_cache
- defaultName = default_name
- # fmt: on
-
-
-class _PendingSkip(ParserElement):
- # internal placeholder class to hold a place were '...' is added to a parser element,
- # once another ParserElement is added, this placeholder will be replaced with a SkipTo
- def __init__(self, expr: ParserElement, must_skip: bool = False):
- super().__init__()
- self.anchor = expr
- self.must_skip = must_skip
-
- def _generateDefaultName(self) -> str:
- return str(self.anchor + Empty()).replace("Empty", "...")
-
- def __add__(self, other) -> "ParserElement":
- skipper = SkipTo(other).set_name("...")("_skipped*")
- if self.must_skip:
-
- def must_skip(t):
- if not t._skipped or t._skipped.as_list() == [""]:
- del t[0]
- t.pop("_skipped", None)
-
- def show_skip(t):
- if t._skipped.as_list()[-1:] == [""]:
- t.pop("_skipped")
- t["_skipped"] = "missing <" + repr(self.anchor) + ">"
-
- return (
- self.anchor + skipper().add_parse_action(must_skip)
- | skipper().add_parse_action(show_skip)
- ) + other
-
- return self.anchor + skipper + other
-
- def __repr__(self):
- return self.defaultName
-
- def parseImpl(self, *args):
- raise Exception(
- "use of `...` expression without following SkipTo target expression"
- )
-
-
-class Token(ParserElement):
- """Abstract :class:`ParserElement` subclass, for defining atomic
- matching patterns.
- """
-
- def __init__(self):
- super().__init__(savelist=False)
-
- def _generateDefaultName(self) -> str:
- return type(self).__name__
-
-
-class NoMatch(Token):
- """
- A token that will never match.
- """
-
- def __init__(self):
- super().__init__()
- self.mayReturnEmpty = True
- self.mayIndexError = False
- self.errmsg = "Unmatchable token"
-
- def parseImpl(self, instring, loc, doActions=True):
- raise ParseException(instring, loc, self.errmsg, self)
-
-
-class Literal(Token):
- """
- Token to exactly match a specified string.
-
- Example::
-
- Literal('blah').parse_string('blah') # -> ['blah']
- Literal('blah').parse_string('blahfooblah') # -> ['blah']
- Literal('blah').parse_string('bla') # -> Exception: Expected "blah"
-
- For case-insensitive matching, use :class:`CaselessLiteral`.
-
- For keyword matching (force word break before and after the matched string),
- use :class:`Keyword` or :class:`CaselessKeyword`.
- """
-
- def __new__(cls, match_string: str = "", *, matchString: str = ""):
- # Performance tuning: select a subclass with optimized parseImpl
- if cls is Literal:
- match_string = matchString or match_string
- if not match_string:
- return super().__new__(Empty)
- if len(match_string) == 1:
- return super().__new__(_SingleCharLiteral)
-
- # Default behavior
- return super().__new__(cls)
-
- # Needed to make copy.copy() work correctly if we customize __new__
- def __getnewargs__(self):
- return (self.match,)
-
- def __init__(self, match_string: str = "", *, matchString: str = ""):
- super().__init__()
- match_string = matchString or match_string
- self.match = match_string
- self.matchLen = len(match_string)
- self.firstMatchChar = match_string[:1]
- self.errmsg = "Expected " + self.name
- self.mayReturnEmpty = False
- self.mayIndexError = False
-
- def _generateDefaultName(self) -> str:
- return repr(self.match)
-
- def parseImpl(self, instring, loc, doActions=True):
- if instring[loc] == self.firstMatchChar and instring.startswith(
- self.match, loc
- ):
- return loc + self.matchLen, self.match
- raise ParseException(instring, loc, self.errmsg, self)
-
-
-class Empty(Literal):
- """
- An empty token, will always match.
- """
-
- def __init__(self, match_string="", *, matchString=""):
- super().__init__("")
- self.mayReturnEmpty = True
- self.mayIndexError = False
-
- def _generateDefaultName(self) -> str:
- return "Empty"
-
- def parseImpl(self, instring, loc, doActions=True):
- return loc, []
-
-
-class _SingleCharLiteral(Literal):
- def parseImpl(self, instring, loc, doActions=True):
- if instring[loc] == self.firstMatchChar:
- return loc + 1, self.match
- raise ParseException(instring, loc, self.errmsg, self)
-
-
-ParserElement._literalStringClass = Literal
-
-
-class Keyword(Token):
- """
- Token to exactly match a specified string as a keyword, that is,
- it must be immediately preceded and followed by whitespace or
- non-keyword characters. Compare with :class:`Literal`:
-
- - ``Literal("if")`` will match the leading ``'if'`` in
- ``'ifAndOnlyIf'``.
- - ``Keyword("if")`` will not; it will only match the leading
- ``'if'`` in ``'if x=1'``, or ``'if(y==2)'``
-
- Accepts two optional constructor arguments in addition to the
- keyword string:
-
- - ``ident_chars`` is a string of characters that would be valid
- identifier characters, defaulting to all alphanumerics + "_" and
- "$"
- - ``caseless`` allows case-insensitive matching, default is ``False``.
-
- Example::
-
- Keyword("start").parse_string("start") # -> ['start']
- Keyword("start").parse_string("starting") # -> Exception
-
- For case-insensitive matching, use :class:`CaselessKeyword`.
- """
-
- DEFAULT_KEYWORD_CHARS = alphanums + "_$"
-
- def __init__(
- self,
- match_string: str = "",
- ident_chars: typing.Optional[str] = None,
- caseless: bool = False,
- *,
- matchString: str = "",
- identChars: typing.Optional[str] = None,
- ):
- super().__init__()
- identChars = identChars or ident_chars
- if identChars is None:
- identChars = Keyword.DEFAULT_KEYWORD_CHARS
- match_string = matchString or match_string
- self.match = match_string
- self.matchLen = len(match_string)
- try:
- self.firstMatchChar = match_string[0]
- except IndexError:
- raise ValueError("null string passed to Keyword; use Empty() instead")
- self.errmsg = f"Expected {type(self).__name__} {self.name}"
- self.mayReturnEmpty = False
- self.mayIndexError = False
- self.caseless = caseless
- if caseless:
- self.caselessmatch = match_string.upper()
- identChars = identChars.upper()
- self.identChars = set(identChars)
-
- def _generateDefaultName(self) -> str:
- return repr(self.match)
-
- def parseImpl(self, instring, loc, doActions=True):
- errmsg = self.errmsg
- errloc = loc
- if self.caseless:
- if instring[loc : loc + self.matchLen].upper() == self.caselessmatch:
- if loc == 0 or instring[loc - 1].upper() not in self.identChars:
- if (
- loc >= len(instring) - self.matchLen
- or instring[loc + self.matchLen].upper() not in self.identChars
- ):
- return loc + self.matchLen, self.match
- else:
- # followed by keyword char
- errmsg += ", was immediately followed by keyword character"
- errloc = loc + self.matchLen
- else:
- # preceded by keyword char
- errmsg += ", keyword was immediately preceded by keyword character"
- errloc = loc - 1
- # else no match just raise plain exception
-
- else:
- if (
- instring[loc] == self.firstMatchChar
- and self.matchLen == 1
- or instring.startswith(self.match, loc)
- ):
- if loc == 0 or instring[loc - 1] not in self.identChars:
- if (
- loc >= len(instring) - self.matchLen
- or instring[loc + self.matchLen] not in self.identChars
- ):
- return loc + self.matchLen, self.match
- else:
- # followed by keyword char
- errmsg += (
- ", keyword was immediately followed by keyword character"
- )
- errloc = loc + self.matchLen
- else:
- # preceded by keyword char
- errmsg += ", keyword was immediately preceded by keyword character"
- errloc = loc - 1
- # else no match just raise plain exception
-
- raise ParseException(instring, errloc, errmsg, self)
-
- @staticmethod
- def set_default_keyword_chars(chars) -> None:
- """
- Overrides the default characters used by :class:`Keyword` expressions.
- """
- Keyword.DEFAULT_KEYWORD_CHARS = chars
-
- setDefaultKeywordChars = set_default_keyword_chars
-
-
-class CaselessLiteral(Literal):
- """
- Token to match a specified string, ignoring case of letters.
- Note: the matched results will always be in the case of the given
- match string, NOT the case of the input text.
-
- Example::
-
- CaselessLiteral("CMD")[1, ...].parse_string("cmd CMD Cmd10")
- # -> ['CMD', 'CMD', 'CMD']
-
- (Contrast with example for :class:`CaselessKeyword`.)
- """
-
- def __init__(self, match_string: str = "", *, matchString: str = ""):
- match_string = matchString or match_string
- super().__init__(match_string.upper())
- # Preserve the defining literal.
- self.returnString = match_string
- self.errmsg = "Expected " + self.name
-
- def parseImpl(self, instring, loc, doActions=True):
- if instring[loc : loc + self.matchLen].upper() == self.match:
- return loc + self.matchLen, self.returnString
- raise ParseException(instring, loc, self.errmsg, self)
-
-
-class CaselessKeyword(Keyword):
- """
- Caseless version of :class:`Keyword`.
-
- Example::
-
- CaselessKeyword("CMD")[1, ...].parse_string("cmd CMD Cmd10")
- # -> ['CMD', 'CMD']
-
- (Contrast with example for :class:`CaselessLiteral`.)
- """
-
- def __init__(
- self,
- match_string: str = "",
- ident_chars: typing.Optional[str] = None,
- *,
- matchString: str = "",
- identChars: typing.Optional[str] = None,
- ):
- identChars = identChars or ident_chars
- match_string = matchString or match_string
- super().__init__(match_string, identChars, caseless=True)
-
-
-class CloseMatch(Token):
- """A variation on :class:`Literal` which matches "close" matches,
- that is, strings with at most 'n' mismatching characters.
- :class:`CloseMatch` takes parameters:
-
- - ``match_string`` - string to be matched
- - ``caseless`` - a boolean indicating whether to ignore casing when comparing characters
- - ``max_mismatches`` - (``default=1``) maximum number of
- mismatches allowed to count as a match
-
- The results from a successful parse will contain the matched text
- from the input string and the following named results:
-
- - ``mismatches`` - a list of the positions within the
- match_string where mismatches were found
- - ``original`` - the original match_string used to compare
- against the input string
-
- If ``mismatches`` is an empty list, then the match was an exact
- match.
-
- Example::
-
- patt = CloseMatch("ATCATCGAATGGA")
- patt.parse_string("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']})
- patt.parse_string("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1)
-
- # exact match
- patt.parse_string("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']})
-
- # close match allowing up to 2 mismatches
- patt = CloseMatch("ATCATCGAATGGA", max_mismatches=2)
- patt.parse_string("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']})
- """
-
- def __init__(
- self,
- match_string: str,
- max_mismatches: typing.Optional[int] = None,
- *,
- maxMismatches: int = 1,
- caseless=False,
- ):
- maxMismatches = max_mismatches if max_mismatches is not None else maxMismatches
- super().__init__()
- self.match_string = match_string
- self.maxMismatches = maxMismatches
- self.errmsg = f"Expected {self.match_string!r} (with up to {self.maxMismatches} mismatches)"
- self.caseless = caseless
- self.mayIndexError = False
- self.mayReturnEmpty = False
-
- def _generateDefaultName(self) -> str:
- return f"{type(self).__name__}:{self.match_string!r}"
-
- def parseImpl(self, instring, loc, doActions=True):
- start = loc
- instrlen = len(instring)
- maxloc = start + len(self.match_string)
-
- if maxloc <= instrlen:
- match_string = self.match_string
- match_stringloc = 0
- mismatches = []
- maxMismatches = self.maxMismatches
-
- for match_stringloc, s_m in enumerate(
- zip(instring[loc:maxloc], match_string)
- ):
- src, mat = s_m
- if self.caseless:
- src, mat = src.lower(), mat.lower()
-
- if src != mat:
- mismatches.append(match_stringloc)
- if len(mismatches) > maxMismatches:
- break
- else:
- loc = start + match_stringloc + 1
- results = ParseResults([instring[start:loc]])
- results["original"] = match_string
- results["mismatches"] = mismatches
- return loc, results
-
- raise ParseException(instring, loc, self.errmsg, self)
-
-
-class Word(Token):
- """Token for matching words composed of allowed character sets.
-
- Parameters:
-
- - ``init_chars`` - string of all characters that should be used to
- match as a word; "ABC" will match "AAA", "ABAB", "CBAC", etc.;
- if ``body_chars`` is also specified, then this is the string of
- initial characters
- - ``body_chars`` - string of characters that
- can be used for matching after a matched initial character as
- given in ``init_chars``; if omitted, same as the initial characters
- (default=``None``)
- - ``min`` - minimum number of characters to match (default=1)
- - ``max`` - maximum number of characters to match (default=0)
- - ``exact`` - exact number of characters to match (default=0)
- - ``as_keyword`` - match as a keyword (default=``False``)
- - ``exclude_chars`` - characters that might be
- found in the input ``body_chars`` string but which should not be
- accepted for matching ;useful to define a word of all
- printables except for one or two characters, for instance
- (default=``None``)
-
- :class:`srange` is useful for defining custom character set strings
- for defining :class:`Word` expressions, using range notation from
- regular expression character sets.
-
- A common mistake is to use :class:`Word` to match a specific literal
- string, as in ``Word("Address")``. Remember that :class:`Word`
- uses the string argument to define *sets* of matchable characters.
- This expression would match "Add", "AAA", "dAred", or any other word
- made up of the characters 'A', 'd', 'r', 'e', and 's'. To match an
- exact literal string, use :class:`Literal` or :class:`Keyword`.
-
- pyparsing includes helper strings for building Words:
-
- - :class:`alphas`
- - :class:`nums`
- - :class:`alphanums`
- - :class:`hexnums`
- - :class:`alphas8bit` (alphabetic characters in ASCII range 128-255
- - accented, tilded, umlauted, etc.)
- - :class:`punc8bit` (non-alphabetic characters in ASCII range
- 128-255 - currency, symbols, superscripts, diacriticals, etc.)
- - :class:`printables` (any non-whitespace character)
-
- ``alphas``, ``nums``, and ``printables`` are also defined in several
- Unicode sets - see :class:`pyparsing_unicode``.
-
- Example::
-
- # a word composed of digits
- integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9"))
-
- # a word with a leading capital, and zero or more lowercase
- capital_word = Word(alphas.upper(), alphas.lower())
-
- # hostnames are alphanumeric, with leading alpha, and '-'
- hostname = Word(alphas, alphanums + '-')
-
- # roman numeral (not a strict parser, accepts invalid mix of characters)
- roman = Word("IVXLCDM")
-
- # any string of non-whitespace characters, except for ','
- csv_value = Word(printables, exclude_chars=",")
- """
-
- def __init__(
- self,
- init_chars: str = "",
- body_chars: typing.Optional[str] = None,
- min: int = 1,
- max: int = 0,
- exact: int = 0,
- as_keyword: bool = False,
- exclude_chars: typing.Optional[str] = None,
- *,
- initChars: typing.Optional[str] = None,
- bodyChars: typing.Optional[str] = None,
- asKeyword: bool = False,
- excludeChars: typing.Optional[str] = None,
- ):
- initChars = initChars or init_chars
- bodyChars = bodyChars or body_chars
- asKeyword = asKeyword or as_keyword
- excludeChars = excludeChars or exclude_chars
- super().__init__()
- if not initChars:
- raise ValueError(
- f"invalid {type(self).__name__}, initChars cannot be empty string"
- )
-
- initChars_set = set(initChars)
- if excludeChars:
- excludeChars_set = set(excludeChars)
- initChars_set -= excludeChars_set
- if bodyChars:
- bodyChars = "".join(set(bodyChars) - excludeChars_set)
- self.initChars = initChars_set
- self.initCharsOrig = "".join(sorted(initChars_set))
-
- if bodyChars:
- self.bodyChars = set(bodyChars)
- self.bodyCharsOrig = "".join(sorted(bodyChars))
- else:
- self.bodyChars = initChars_set
- self.bodyCharsOrig = self.initCharsOrig
-
- self.maxSpecified = max > 0
-
- if min < 1:
- raise ValueError(
- "cannot specify a minimum length < 1; use Opt(Word()) if zero-length word is permitted"
- )
-
- if self.maxSpecified and min > max:
- raise ValueError(
- f"invalid args, if min and max both specified min must be <= max (min={min}, max={max})"
- )
-
- self.minLen = min
-
- if max > 0:
- self.maxLen = max
- else:
- self.maxLen = _MAX_INT
-
- if exact > 0:
- min = max = exact
- self.maxLen = exact
- self.minLen = exact
-
- self.errmsg = "Expected " + self.name
- self.mayIndexError = False
- self.asKeyword = asKeyword
- if self.asKeyword:
- self.errmsg += " as a keyword"
-
- # see if we can make a regex for this Word
- if " " not in (self.initChars | self.bodyChars):
- if len(self.initChars) == 1:
- re_leading_fragment = re.escape(self.initCharsOrig)
- else:
- re_leading_fragment = f"[{_collapse_string_to_ranges(self.initChars)}]"
-
- if self.bodyChars == self.initChars:
- if max == 0:
- repeat = "+"
- elif max == 1:
- repeat = ""
- else:
- if self.minLen != self.maxLen:
- repeat = f"{{{self.minLen},{'' if self.maxLen == _MAX_INT else self.maxLen}}}"
- else:
- repeat = f"{{{self.minLen}}}"
- self.reString = f"{re_leading_fragment}{repeat}"
- else:
- if max == 1:
- re_body_fragment = ""
- repeat = ""
- else:
- re_body_fragment = f"[{_collapse_string_to_ranges(self.bodyChars)}]"
- if max == 0:
- repeat = "*"
- elif max == 2:
- repeat = "?" if min <= 1 else ""
- else:
- if min != max:
- repeat = f"{{{min - 1 if min > 0 else 0},{max - 1}}}"
- else:
- repeat = f"{{{min - 1 if min > 0 else 0}}}"
-
- self.reString = (
- f"{re_leading_fragment}" f"{re_body_fragment}" f"{repeat}"
- )
-
- if self.asKeyword:
- self.reString = rf"\b{self.reString}\b"
-
- try:
- self.re = re.compile(self.reString)
- except re.error:
- self.re = None # type: ignore[assignment]
- else:
- self.re_match = self.re.match
- self.parseImpl = self.parseImpl_regex # type: ignore[assignment]
-
- def _generateDefaultName(self) -> str:
- def charsAsStr(s):
- max_repr_len = 16
- s = _collapse_string_to_ranges(s, re_escape=False)
- if len(s) > max_repr_len:
- return s[: max_repr_len - 3] + "..."
- else:
- return s
-
- if self.initChars != self.bodyChars:
- base = f"W:({charsAsStr(self.initChars)}, {charsAsStr(self.bodyChars)})"
- else:
- base = f"W:({charsAsStr(self.initChars)})"
-
- # add length specification
- if self.minLen > 1 or self.maxLen != _MAX_INT:
- if self.minLen == self.maxLen:
- if self.minLen == 1:
- return base[2:]
- else:
- return base + f"{{{self.minLen}}}"
- elif self.maxLen == _MAX_INT:
- return base + f"{{{self.minLen},...}}"
- else:
- return base + f"{{{self.minLen},{self.maxLen}}}"
- return base
-
- def parseImpl(self, instring, loc, doActions=True):
- if instring[loc] not in self.initChars:
- raise ParseException(instring, loc, self.errmsg, self)
-
- start = loc
- loc += 1
- instrlen = len(instring)
- bodychars = self.bodyChars
- maxloc = start + self.maxLen
- maxloc = min(maxloc, instrlen)
- while loc < maxloc and instring[loc] in bodychars:
- loc += 1
-
- throwException = False
- if loc - start < self.minLen:
- throwException = True
- elif self.maxSpecified and loc < instrlen and instring[loc] in bodychars:
- throwException = True
- elif self.asKeyword:
- if (
- start > 0
- and instring[start - 1] in bodychars
- or loc < instrlen
- and instring[loc] in bodychars
- ):
- throwException = True
-
- if throwException:
- raise ParseException(instring, loc, self.errmsg, self)
-
- return loc, instring[start:loc]
-
- def parseImpl_regex(self, instring, loc, doActions=True):
- result = self.re_match(instring, loc)
- if not result:
- raise ParseException(instring, loc, self.errmsg, self)
-
- loc = result.end()
- return loc, result.group()
-
-
-class Char(Word):
- """A short-cut class for defining :class:`Word` ``(characters, exact=1)``,
- when defining a match of any single character in a string of
- characters.
- """
-
- def __init__(
- self,
- charset: str,
- as_keyword: bool = False,
- exclude_chars: typing.Optional[str] = None,
- *,
- asKeyword: bool = False,
- excludeChars: typing.Optional[str] = None,
- ):
- asKeyword = asKeyword or as_keyword
- excludeChars = excludeChars or exclude_chars
- super().__init__(
- charset, exact=1, as_keyword=asKeyword, exclude_chars=excludeChars
- )
-
-
-class Regex(Token):
- r"""Token for matching strings that match a given regular
- expression. Defined with string specifying the regular expression in
- a form recognized by the stdlib Python `re module <https://docs.python.org/3/library/re.html>`_.
- If the given regex contains named groups (defined using ``(?P<name>...)``),
- these will be preserved as named :class:`ParseResults`.
-
- If instead of the Python stdlib ``re`` module you wish to use a different RE module
- (such as the ``regex`` module), you can do so by building your ``Regex`` object with
- a compiled RE that was compiled using ``regex``.
-
- Example::
-
- realnum = Regex(r"[+-]?\d+\.\d*")
- # ref: https://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression
- roman = Regex(r"M{0,4}(CM|CD|D?{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})")
-
- # named fields in a regex will be returned as named results
- date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)')
-
- # the Regex class will accept re's compiled using the regex module
- import regex
- parser = pp.Regex(regex.compile(r'[0-9]'))
- """
-
- def __init__(
- self,
- pattern: Any,
- flags: Union[re.RegexFlag, int] = 0,
- as_group_list: bool = False,
- as_match: bool = False,
- *,
- asGroupList: bool = False,
- asMatch: bool = False,
- ):
- """The parameters ``pattern`` and ``flags`` are passed
- to the ``re.compile()`` function as-is. See the Python
- `re module <https://docs.python.org/3/library/re.html>`_ module for an
- explanation of the acceptable patterns and flags.
- """
- super().__init__()
- asGroupList = asGroupList or as_group_list
- asMatch = asMatch or as_match
-
- if isinstance(pattern, str_type):
- if not pattern:
- raise ValueError("null string passed to Regex; use Empty() instead")
-
- self._re = None
- self.reString = self.pattern = pattern
- self.flags = flags
-
- elif hasattr(pattern, "pattern") and hasattr(pattern, "match"):
- self._re = pattern
- self.pattern = self.reString = pattern.pattern
- self.flags = flags
-
- else:
- raise TypeError(
- "Regex may only be constructed with a string or a compiled RE object"
- )
-
- self.errmsg = "Expected " + self.name
- self.mayIndexError = False
- self.asGroupList = asGroupList
- self.asMatch = asMatch
- if self.asGroupList:
- self.parseImpl = self.parseImplAsGroupList # type: ignore [assignment]
- if self.asMatch:
- self.parseImpl = self.parseImplAsMatch # type: ignore [assignment]
-
- @cached_property
- def re(self):
- if self._re:
- return self._re
- else:
- try:
- return re.compile(self.pattern, self.flags)
- except re.error:
- raise ValueError(f"invalid pattern ({self.pattern!r}) passed to Regex")
-
- @cached_property
- def re_match(self):
- return self.re.match
-
- @cached_property
- def mayReturnEmpty(self):
- return self.re_match("") is not None
-
- def _generateDefaultName(self) -> str:
- return "Re:({})".format(repr(self.pattern).replace("\\\\", "\\"))
-
- def parseImpl(self, instring, loc, doActions=True):
- result = self.re_match(instring, loc)
- if not result:
- raise ParseException(instring, loc, self.errmsg, self)
-
- loc = result.end()
- ret = ParseResults(result.group())
- d = result.groupdict()
- if d:
- for k, v in d.items():
- ret[k] = v
- return loc, ret
-
- def parseImplAsGroupList(self, instring, loc, doActions=True):
- result = self.re_match(instring, loc)
- if not result:
- raise ParseException(instring, loc, self.errmsg, self)
-
- loc = result.end()
- ret = result.groups()
- return loc, ret
-
- def parseImplAsMatch(self, instring, loc, doActions=True):
- result = self.re_match(instring, loc)
- if not result:
- raise ParseException(instring, loc, self.errmsg, self)
-
- loc = result.end()
- ret = result
- return loc, ret
-
- def sub(self, repl: str) -> ParserElement:
- r"""
- Return :class:`Regex` with an attached parse action to transform the parsed
- result as if called using `re.sub(expr, repl, string) <https://docs.python.org/3/library/re.html#re.sub>`_.
-
- Example::
-
- make_html = Regex(r"(\w+):(.*?):").sub(r"<\1>\2</\1>")
- print(make_html.transform_string("h1:main title:"))
- # prints "<h1>main title</h1>"
- """
- if self.asGroupList:
- raise TypeError("cannot use sub() with Regex(as_group_list=True)")
-
- if self.asMatch and callable(repl):
- raise TypeError(
- "cannot use sub() with a callable with Regex(as_match=True)"
- )
-
- if self.asMatch:
-
- def pa(tokens):
- return tokens[0].expand(repl)
-
- else:
-
- def pa(tokens):
- return self.re.sub(repl, tokens[0])
-
- return self.add_parse_action(pa)
-
-
-class QuotedString(Token):
- r"""
- Token for matching strings that are delimited by quoting characters.
-
- Defined with the following parameters:
-
- - ``quote_char`` - string of one or more characters defining the
- quote delimiting string
- - ``esc_char`` - character to re_escape quotes, typically backslash
- (default= ``None``)
- - ``esc_quote`` - special quote sequence to re_escape an embedded quote
- string (such as SQL's ``""`` to re_escape an embedded ``"``)
- (default= ``None``)
- - ``multiline`` - boolean indicating whether quotes can span
- multiple lines (default= ``False``)
- - ``unquote_results`` - boolean indicating whether the matched text
- should be unquoted (default= ``True``)
- - ``end_quote_char`` - string of one or more characters defining the
- end of the quote delimited string (default= ``None`` => same as
- quote_char)
- - ``convert_whitespace_escapes`` - convert escaped whitespace
- (``'\t'``, ``'\n'``, etc.) to actual whitespace
- (default= ``True``)
-
- Example::
-
- qs = QuotedString('"')
- print(qs.search_string('lsjdf "This is the quote" sldjf'))
- complex_qs = QuotedString('{{', end_quote_char='}}')
- print(complex_qs.search_string('lsjdf {{This is the "quote"}} sldjf'))
- sql_qs = QuotedString('"', esc_quote='""')
- print(sql_qs.search_string('lsjdf "This is the quote with ""embedded"" quotes" sldjf'))
-
- prints::
-
- [['This is the quote']]
- [['This is the "quote"']]
- [['This is the quote with "embedded" quotes']]
- """
- ws_map = dict(((r"\t", "\t"), (r"\n", "\n"), (r"\f", "\f"), (r"\r", "\r")))
-
- def __init__(
- self,
- quote_char: str = "",
- esc_char: typing.Optional[str] = None,
- esc_quote: typing.Optional[str] = None,
- multiline: bool = False,
- unquote_results: bool = True,
- end_quote_char: typing.Optional[str] = None,
- convert_whitespace_escapes: bool = True,
- *,
- quoteChar: str = "",
- escChar: typing.Optional[str] = None,
- escQuote: typing.Optional[str] = None,
- unquoteResults: bool = True,
- endQuoteChar: typing.Optional[str] = None,
- convertWhitespaceEscapes: bool = True,
- ):
- super().__init__()
- escChar = escChar or esc_char
- escQuote = escQuote or esc_quote
- unquoteResults = unquoteResults and unquote_results
- endQuoteChar = endQuoteChar or end_quote_char
- convertWhitespaceEscapes = (
- convertWhitespaceEscapes and convert_whitespace_escapes
- )
- quote_char = quoteChar or quote_char
-
- # remove white space from quote chars - wont work anyway
- quote_char = quote_char.strip()
- if not quote_char:
- raise ValueError("quote_char cannot be the empty string")
-
- if endQuoteChar is None:
- endQuoteChar = quote_char
- else:
- endQuoteChar = endQuoteChar.strip()
- if not endQuoteChar:
- raise ValueError("end_quote_char cannot be the empty string")
-
- self.quoteChar: str = quote_char
- self.quoteCharLen: int = len(quote_char)
- self.firstQuoteChar: str = quote_char[0]
- self.endQuoteChar: str = endQuoteChar
- self.endQuoteCharLen: int = len(endQuoteChar)
- self.escChar: str = escChar or ""
- self.escQuote: str = escQuote or ""
- self.unquoteResults: bool = unquoteResults
- self.convertWhitespaceEscapes: bool = convertWhitespaceEscapes
- self.multiline = multiline
-
- sep = ""
- inner_pattern = ""
-
- if escQuote:
- inner_pattern += rf"{sep}(?:{re.escape(escQuote)})"
- sep = "|"
-
- if escChar:
- inner_pattern += rf"{sep}(?:{re.escape(escChar)}.)"
- sep = "|"
- self.escCharReplacePattern = re.escape(escChar) + "(.)"
-
- if len(self.endQuoteChar) > 1:
- inner_pattern += (
- f"{sep}(?:"
- + "|".join(
- f"(?:{re.escape(self.endQuoteChar[:i])}(?!{re.escape(self.endQuoteChar[i:])}))"
- for i in range(len(self.endQuoteChar) - 1, 0, -1)
- )
- + ")"
- )
- sep = "|"
-
- self.flags = re.RegexFlag(0)
-
- if multiline:
- self.flags = re.MULTILINE | re.DOTALL
- inner_pattern += (
- rf"{sep}(?:[^{_escape_regex_range_chars(self.endQuoteChar[0])}"
- rf"{(_escape_regex_range_chars(escChar) if escChar is not None else '')}])"
- )
- else:
- inner_pattern += (
- rf"{sep}(?:[^{_escape_regex_range_chars(self.endQuoteChar[0])}\n\r"
- rf"{(_escape_regex_range_chars(escChar) if escChar is not None else '')}])"
- )
-
- self.pattern = "".join(
- [
- re.escape(self.quoteChar),
- "(?:",
- inner_pattern,
- ")*",
- re.escape(self.endQuoteChar),
- ]
- )
-
- if self.unquoteResults:
- if self.convertWhitespaceEscapes:
- self.unquote_scan_re = re.compile(
- rf"({'|'.join(re.escape(k) for k in self.ws_map)})|({re.escape(self.escChar)}.)|(\n|.)",
- flags=self.flags,
- )
- else:
- self.unquote_scan_re = re.compile(
- rf"({re.escape(self.escChar)}.)|(\n|.)", flags=self.flags
- )
-
- try:
- self.re = re.compile(self.pattern, self.flags)
- self.reString = self.pattern
- self.re_match = self.re.match
- except re.error:
- raise ValueError(f"invalid pattern {self.pattern!r} passed to Regex")
-
- self.errmsg = "Expected " + self.name
- self.mayIndexError = False
- self.mayReturnEmpty = True
-
- def _generateDefaultName(self) -> str:
- if self.quoteChar == self.endQuoteChar and isinstance(self.quoteChar, str_type):
- return f"string enclosed in {self.quoteChar!r}"
-
- return f"quoted string, starting with {self.quoteChar} ending with {self.endQuoteChar}"
-
- def parseImpl(self, instring, loc, doActions=True):
- result = (
- instring[loc] == self.firstQuoteChar
- and self.re_match(instring, loc)
- or None
- )
- if not result:
- raise ParseException(instring, loc, self.errmsg, self)
-
- loc = result.end()
- ret = result.group()
-
- if self.unquoteResults:
- # strip off quotes
- ret = ret[self.quoteCharLen : -self.endQuoteCharLen]
-
- if isinstance(ret, str_type):
- if self.convertWhitespaceEscapes:
- ret = "".join(
- self.ws_map[match.group(1)]
- if match.group(1)
- else match.group(2)[-1]
- if match.group(2)
- else match.group(3)
- for match in self.unquote_scan_re.finditer(ret)
- )
- else:
- ret = "".join(
- match.group(1)[-1] if match.group(1) else match.group(2)
- for match in self.unquote_scan_re.finditer(ret)
- )
-
- # replace escaped quotes
- if self.escQuote:
- ret = ret.replace(self.escQuote, self.endQuoteChar)
-
- return loc, ret
-
-
-class CharsNotIn(Token):
- """Token for matching words composed of characters *not* in a given
- set (will include whitespace in matched characters if not listed in
- the provided exclusion set - see example). Defined with string
- containing all disallowed characters, and an optional minimum,
- maximum, and/or exact length. The default value for ``min`` is
- 1 (a minimum value < 1 is not valid); the default values for
- ``max`` and ``exact`` are 0, meaning no maximum or exact
- length restriction.
-
- Example::
-
- # define a comma-separated-value as anything that is not a ','
- csv_value = CharsNotIn(',')
- print(DelimitedList(csv_value).parse_string("dkls,lsdkjf,s12 34,@!#,213"))
-
- prints::
-
- ['dkls', 'lsdkjf', 's12 34', '@!#', '213']
- """
-
- def __init__(
- self,
- not_chars: str = "",
- min: int = 1,
- max: int = 0,
- exact: int = 0,
- *,
- notChars: str = "",
- ):
- super().__init__()
- self.skipWhitespace = False
- self.notChars = not_chars or notChars
- self.notCharsSet = set(self.notChars)
-
- if min < 1:
- raise ValueError(
- "cannot specify a minimum length < 1; use "
- "Opt(CharsNotIn()) if zero-length char group is permitted"
- )
-
- self.minLen = min
-
- if max > 0:
- self.maxLen = max
- else:
- self.maxLen = _MAX_INT
-
- if exact > 0:
- self.maxLen = exact
- self.minLen = exact
-
- self.errmsg = "Expected " + self.name
- self.mayReturnEmpty = self.minLen == 0
- self.mayIndexError = False
-
- def _generateDefaultName(self) -> str:
- not_chars_str = _collapse_string_to_ranges(self.notChars)
- if len(not_chars_str) > 16:
- return f"!W:({self.notChars[: 16 - 3]}...)"
- else:
- return f"!W:({self.notChars})"
-
- def parseImpl(self, instring, loc, doActions=True):
- notchars = self.notCharsSet
- if instring[loc] in notchars:
- raise ParseException(instring, loc, self.errmsg, self)
-
- start = loc
- loc += 1
- maxlen = min(start + self.maxLen, len(instring))
- while loc < maxlen and instring[loc] not in notchars:
- loc += 1
-
- if loc - start < self.minLen:
- raise ParseException(instring, loc, self.errmsg, self)
-
- return loc, instring[start:loc]
-
-
-class White(Token):
- """Special matching class for matching whitespace. Normally,
- whitespace is ignored by pyparsing grammars. This class is included
- when some whitespace structures are significant. Define with
- a string containing the whitespace characters to be matched; default
- is ``" \\t\\r\\n"``. Also takes optional ``min``,
- ``max``, and ``exact`` arguments, as defined for the
- :class:`Word` class.
- """
-
- whiteStrs = {
- " ": "<SP>",
- "\t": "<TAB>",
- "\n": "<LF>",
- "\r": "<CR>",
- "\f": "<FF>",
- "\u00A0": "<NBSP>",
- "\u1680": "<OGHAM_SPACE_MARK>",
- "\u180E": "<MONGOLIAN_VOWEL_SEPARATOR>",
- "\u2000": "<EN_QUAD>",
- "\u2001": "<EM_QUAD>",
- "\u2002": "<EN_SPACE>",
- "\u2003": "<EM_SPACE>",
- "\u2004": "<THREE-PER-EM_SPACE>",
- "\u2005": "<FOUR-PER-EM_SPACE>",
- "\u2006": "<SIX-PER-EM_SPACE>",
- "\u2007": "<FIGURE_SPACE>",
- "\u2008": "<PUNCTUATION_SPACE>",
- "\u2009": "<THIN_SPACE>",
- "\u200A": "<HAIR_SPACE>",
- "\u200B": "<ZERO_WIDTH_SPACE>",
- "\u202F": "<NNBSP>",
- "\u205F": "<MMSP>",
- "\u3000": "<IDEOGRAPHIC_SPACE>",
- }
-
- def __init__(self, ws: str = " \t\r\n", min: int = 1, max: int = 0, exact: int = 0):
- super().__init__()
- self.matchWhite = ws
- self.set_whitespace_chars(
- "".join(c for c in self.whiteStrs if c not in self.matchWhite),
- copy_defaults=True,
- )
- # self.leave_whitespace()
- self.mayReturnEmpty = True
- self.errmsg = "Expected " + self.name
-
- self.minLen = min
-
- if max > 0:
- self.maxLen = max
- else:
- self.maxLen = _MAX_INT
-
- if exact > 0:
- self.maxLen = exact
- self.minLen = exact
-
- def _generateDefaultName(self) -> str:
- return "".join(White.whiteStrs[c] for c in self.matchWhite)
-
- def parseImpl(self, instring, loc, doActions=True):
- if instring[loc] not in self.matchWhite:
- raise ParseException(instring, loc, self.errmsg, self)
- start = loc
- loc += 1
- maxloc = start + self.maxLen
- maxloc = min(maxloc, len(instring))
- while loc < maxloc and instring[loc] in self.matchWhite:
- loc += 1
-
- if loc - start < self.minLen:
- raise ParseException(instring, loc, self.errmsg, self)
-
- return loc, instring[start:loc]
-
-
-class PositionToken(Token):
- def __init__(self):
- super().__init__()
- self.mayReturnEmpty = True
- self.mayIndexError = False
-
-
-class GoToColumn(PositionToken):
- """Token to advance to a specific column of input text; useful for
- tabular report scraping.
- """
-
- def __init__(self, colno: int):
- super().__init__()
- self.col = colno
-
- def preParse(self, instring: str, loc: int) -> int:
- if col(loc, instring) != self.col:
- instrlen = len(instring)
- if self.ignoreExprs:
- loc = self._skipIgnorables(instring, loc)
- while (
- loc < instrlen
- and instring[loc].isspace()
- and col(loc, instring) != self.col
- ):
- loc += 1
- return loc
-
- def parseImpl(self, instring, loc, doActions=True):
- thiscol = col(loc, instring)
- if thiscol > self.col:
- raise ParseException(instring, loc, "Text not in expected column", self)
- newloc = loc + self.col - thiscol
- ret = instring[loc:newloc]
- return newloc, ret
-
-
-class LineStart(PositionToken):
- r"""Matches if current position is at the beginning of a line within
- the parse string
-
- Example::
-
- test = '''\
- AAA this line
- AAA and this line
- AAA but not this one
- B AAA and definitely not this one
- '''
-
- for t in (LineStart() + 'AAA' + rest_of_line).search_string(test):
- print(t)
-
- prints::
-
- ['AAA', ' this line']
- ['AAA', ' and this line']
-
- """
-
- def __init__(self):
- super().__init__()
- self.leave_whitespace()
- self.orig_whiteChars = set() | self.whiteChars
- self.whiteChars.discard("\n")
- self.skipper = Empty().set_whitespace_chars(self.whiteChars)
- self.errmsg = "Expected start of line"
-
- def preParse(self, instring: str, loc: int) -> int:
- if loc == 0:
- return loc
- else:
- ret = self.skipper.preParse(instring, loc)
- if "\n" in self.orig_whiteChars:
- while instring[ret : ret + 1] == "\n":
- ret = self.skipper.preParse(instring, ret + 1)
- return ret
-
- def parseImpl(self, instring, loc, doActions=True):
- if col(loc, instring) == 1:
- return loc, []
- raise ParseException(instring, loc, self.errmsg, self)
-
-
-class LineEnd(PositionToken):
- """Matches if current position is at the end of a line within the
- parse string
- """
-
- def __init__(self):
- super().__init__()
- self.whiteChars.discard("\n")
- self.set_whitespace_chars(self.whiteChars, copy_defaults=False)
- self.errmsg = "Expected end of line"
-
- def parseImpl(self, instring, loc, doActions=True):
- if loc < len(instring):
- if instring[loc] == "\n":
- return loc + 1, "\n"
- else:
- raise ParseException(instring, loc, self.errmsg, self)
- elif loc == len(instring):
- return loc + 1, []
- else:
- raise ParseException(instring, loc, self.errmsg, self)
-
-
-class StringStart(PositionToken):
- """Matches if current position is at the beginning of the parse
- string
- """
-
- def __init__(self):
- super().__init__()
- self.errmsg = "Expected start of text"
-
- def parseImpl(self, instring, loc, doActions=True):
- if loc != 0:
- # see if entire string up to here is just whitespace and ignoreables
- if loc != self.preParse(instring, 0):
- raise ParseException(instring, loc, self.errmsg, self)
- return loc, []
-
-
-class StringEnd(PositionToken):
- """
- Matches if current position is at the end of the parse string
- """
-
- def __init__(self):
- super().__init__()
- self.errmsg = "Expected end of text"
-
- def parseImpl(self, instring, loc, doActions=True):
- if loc < len(instring):
- raise ParseException(instring, loc, self.errmsg, self)
- elif loc == len(instring):
- return loc + 1, []
- elif loc > len(instring):
- return loc, []
- else:
- raise ParseException(instring, loc, self.errmsg, self)
-
-
-class WordStart(PositionToken):
- """Matches if the current position is at the beginning of a
- :class:`Word`, and is not preceded by any character in a given
- set of ``word_chars`` (default= ``printables``). To emulate the
- ``\b`` behavior of regular expressions, use
- ``WordStart(alphanums)``. ``WordStart`` will also match at
- the beginning of the string being parsed, or at the beginning of
- a line.
- """
-
- def __init__(self, word_chars: str = printables, *, wordChars: str = printables):
- wordChars = word_chars if wordChars == printables else wordChars
- super().__init__()
- self.wordChars = set(wordChars)
- self.errmsg = "Not at the start of a word"
-
- def parseImpl(self, instring, loc, doActions=True):
- if loc != 0:
- if (
- instring[loc - 1] in self.wordChars
- or instring[loc] not in self.wordChars
- ):
- raise ParseException(instring, loc, self.errmsg, self)
- return loc, []
-
-
-class WordEnd(PositionToken):
- """Matches if the current position is at the end of a :class:`Word`,
- and is not followed by any character in a given set of ``word_chars``
- (default= ``printables``). To emulate the ``\b`` behavior of
- regular expressions, use ``WordEnd(alphanums)``. ``WordEnd``
- will also match at the end of the string being parsed, or at the end
- of a line.
- """
-
- def __init__(self, word_chars: str = printables, *, wordChars: str = printables):
- wordChars = word_chars if wordChars == printables else wordChars
- super().__init__()
- self.wordChars = set(wordChars)
- self.skipWhitespace = False
- self.errmsg = "Not at the end of a word"
-
- def parseImpl(self, instring, loc, doActions=True):
- instrlen = len(instring)
- if instrlen > 0 and loc < instrlen:
- if (
- instring[loc] in self.wordChars
- or instring[loc - 1] not in self.wordChars
- ):
- raise ParseException(instring, loc, self.errmsg, self)
- return loc, []
-
-
-class ParseExpression(ParserElement):
- """Abstract subclass of ParserElement, for combining and
- post-processing parsed tokens.
- """
-
- def __init__(self, exprs: typing.Iterable[ParserElement], savelist: bool = False):
- super().__init__(savelist)
- self.exprs: List[ParserElement]
- if isinstance(exprs, _generatorType):
- exprs = list(exprs)
-
- if isinstance(exprs, str_type):
- self.exprs = [self._literalStringClass(exprs)]
- elif isinstance(exprs, ParserElement):
- self.exprs = [exprs]
- elif isinstance(exprs, Iterable):
- exprs = list(exprs)
- # if sequence of strings provided, wrap with Literal
- if any(isinstance(expr, str_type) for expr in exprs):
- exprs = (
- self._literalStringClass(e) if isinstance(e, str_type) else e
- for e in exprs
- )
- self.exprs = list(exprs)
- else:
- try:
- self.exprs = list(exprs)
- except TypeError:
- self.exprs = [exprs]
- self.callPreparse = False
-
- def recurse(self) -> List[ParserElement]:
- return self.exprs[:]
-
- def append(self, other) -> ParserElement:
- self.exprs.append(other)
- self._defaultName = None
- return self
-
- def leave_whitespace(self, recursive: bool = True) -> ParserElement:
- """
- Extends ``leave_whitespace`` defined in base class, and also invokes ``leave_whitespace`` on
- all contained expressions.
- """
- super().leave_whitespace(recursive)
-
- if recursive:
- self.exprs = [e.copy() for e in self.exprs]
- for e in self.exprs:
- e.leave_whitespace(recursive)
- return self
-
- def ignore_whitespace(self, recursive: bool = True) -> ParserElement:
- """
- Extends ``ignore_whitespace`` defined in base class, and also invokes ``leave_whitespace`` on
- all contained expressions.
- """
- super().ignore_whitespace(recursive)
- if recursive:
- self.exprs = [e.copy() for e in self.exprs]
- for e in self.exprs:
- e.ignore_whitespace(recursive)
- return self
-
- def ignore(self, other) -> ParserElement:
- if isinstance(other, Suppress):
- if other not in self.ignoreExprs:
- super().ignore(other)
- for e in self.exprs:
- e.ignore(self.ignoreExprs[-1])
- else:
- super().ignore(other)
- for e in self.exprs:
- e.ignore(self.ignoreExprs[-1])
- return self
-
- def _generateDefaultName(self) -> str:
- return f"{self.__class__.__name__}:({str(self.exprs)})"
-
- def streamline(self) -> ParserElement:
- if self.streamlined:
- return self
-
- super().streamline()
-
- for e in self.exprs:
- e.streamline()
-
- # collapse nested :class:`And`'s of the form ``And(And(And(a, b), c), d)`` to ``And(a, b, c, d)``
- # but only if there are no parse actions or resultsNames on the nested And's
- # (likewise for :class:`Or`'s and :class:`MatchFirst`'s)
- if len(self.exprs) == 2:
- other = self.exprs[0]
- if (
- isinstance(other, self.__class__)
- and not other.parseAction
- and other.resultsName is None
- and not other.debug
- ):
- self.exprs = other.exprs[:] + [self.exprs[1]]
- self._defaultName = None
- self.mayReturnEmpty |= other.mayReturnEmpty
- self.mayIndexError |= other.mayIndexError
-
- other = self.exprs[-1]
- if (
- isinstance(other, self.__class__)
- and not other.parseAction
- and other.resultsName is None
- and not other.debug
- ):
- self.exprs = self.exprs[:-1] + other.exprs[:]
- self._defaultName = None
- self.mayReturnEmpty |= other.mayReturnEmpty
- self.mayIndexError |= other.mayIndexError
-
- self.errmsg = "Expected " + str(self)
-
- return self
-
- def validate(self, validateTrace=None) -> None:
- warnings.warn(
- "ParserElement.validate() is deprecated, and should not be used to check for left recursion",
- DeprecationWarning,
- stacklevel=2,
- )
- tmp = (validateTrace if validateTrace is not None else [])[:] + [self]
- for e in self.exprs:
- e.validate(tmp)
- self._checkRecursion([])
-
- def copy(self) -> ParserElement:
- ret = super().copy()
- ret = typing.cast(ParseExpression, ret)
- ret.exprs = [e.copy() for e in self.exprs]
- return ret
-
- def _setResultsName(self, name, listAllMatches=False):
- if (
- __diag__.warn_ungrouped_named_tokens_in_collection
- and Diagnostics.warn_ungrouped_named_tokens_in_collection
- not in self.suppress_warnings_
- ):
- for e in self.exprs:
- if (
- isinstance(e, ParserElement)
- and e.resultsName
- and Diagnostics.warn_ungrouped_named_tokens_in_collection
- not in e.suppress_warnings_
- ):
- warnings.warn(
- "{}: setting results name {!r} on {} expression "
- "collides with {!r} on contained expression".format(
- "warn_ungrouped_named_tokens_in_collection",
- name,
- type(self).__name__,
- e.resultsName,
- ),
- stacklevel=3,
- )
-
- return super()._setResultsName(name, listAllMatches)
-
- # Compatibility synonyms
- # fmt: off
- @replaced_by_pep8(leave_whitespace)
- def leaveWhitespace(self): ...
-
- @replaced_by_pep8(ignore_whitespace)
- def ignoreWhitespace(self): ...
- # fmt: on
-
-
-class And(ParseExpression):
- """
- Requires all given :class:`ParseExpression` s to be found in the given order.
- Expressions may be separated by whitespace.
- May be constructed using the ``'+'`` operator.
- May also be constructed using the ``'-'`` operator, which will
- suppress backtracking.
-
- Example::
-
- integer = Word(nums)
- name_expr = Word(alphas)[1, ...]
-
- expr = And([integer("id"), name_expr("name"), integer("age")])
- # more easily written as:
- expr = integer("id") + name_expr("name") + integer("age")
- """
-
- class _ErrorStop(Empty):
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self.leave_whitespace()
-
- def _generateDefaultName(self) -> str:
- return "-"
-
- def __init__(
- self, exprs_arg: typing.Iterable[ParserElement], savelist: bool = True
- ):
- exprs: List[ParserElement] = list(exprs_arg)
- if exprs and Ellipsis in exprs:
- tmp = []
- for i, expr in enumerate(exprs):
- if expr is Ellipsis:
- if i < len(exprs) - 1:
- skipto_arg: ParserElement = typing.cast(
- ParseExpression, (Empty() + exprs[i + 1])
- ).exprs[-1]
- tmp.append(SkipTo(skipto_arg)("_skipped*"))
- else:
- raise Exception(
- "cannot construct And with sequence ending in ..."
- )
- else:
- tmp.append(expr)
- exprs[:] = tmp
- super().__init__(exprs, savelist)
- if self.exprs:
- self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs)
- if not isinstance(self.exprs[0], White):
- self.set_whitespace_chars(
- self.exprs[0].whiteChars,
- copy_defaults=self.exprs[0].copyDefaultWhiteChars,
- )
- self.skipWhitespace = self.exprs[0].skipWhitespace
- else:
- self.skipWhitespace = False
- else:
- self.mayReturnEmpty = True
- self.callPreparse = True
-
- def streamline(self) -> ParserElement:
- # collapse any _PendingSkip's
- if self.exprs:
- if any(
- isinstance(e, ParseExpression)
- and e.exprs
- and isinstance(e.exprs[-1], _PendingSkip)
- for e in self.exprs[:-1]
- ):
- deleted_expr_marker = NoMatch()
- for i, e in enumerate(self.exprs[:-1]):
- if e is deleted_expr_marker:
- continue
- if (
- isinstance(e, ParseExpression)
- and e.exprs
- and isinstance(e.exprs[-1], _PendingSkip)
- ):
- e.exprs[-1] = e.exprs[-1] + self.exprs[i + 1]
- self.exprs[i + 1] = deleted_expr_marker
- self.exprs = [e for e in self.exprs if e is not deleted_expr_marker]
-
- super().streamline()
-
- # link any IndentedBlocks to the prior expression
- prev: ParserElement
- cur: ParserElement
- for prev, cur in zip(self.exprs, self.exprs[1:]):
- # traverse cur or any first embedded expr of cur looking for an IndentedBlock
- # (but watch out for recursive grammar)
- seen = set()
- while True:
- if id(cur) in seen:
- break
- seen.add(id(cur))
- if isinstance(cur, IndentedBlock):
- prev.add_parse_action(
- lambda s, l, t, cur_=cur: setattr(
- cur_, "parent_anchor", col(l, s)
- )
- )
- break
- subs = cur.recurse()
- next_first = next(iter(subs), None)
- if next_first is None:
- break
- cur = typing.cast(ParserElement, next_first)
-
- self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs)
- return self
-
- def parseImpl(self, instring, loc, doActions=True):
- # pass False as callPreParse arg to _parse for first element, since we already
- # pre-parsed the string as part of our And pre-parsing
- loc, resultlist = self.exprs[0]._parse(
- instring, loc, doActions, callPreParse=False
- )
- errorStop = False
- for e in self.exprs[1:]:
- # if isinstance(e, And._ErrorStop):
- if type(e) is And._ErrorStop:
- errorStop = True
- continue
- if errorStop:
- try:
- loc, exprtokens = e._parse(instring, loc, doActions)
- except ParseSyntaxException:
- raise
- except ParseBaseException as pe:
- pe.__traceback__ = None
- raise ParseSyntaxException._from_exception(pe)
- except IndexError:
- raise ParseSyntaxException(
- instring, len(instring), self.errmsg, self
- )
- else:
- loc, exprtokens = e._parse(instring, loc, doActions)
- resultlist += exprtokens
- return loc, resultlist
-
- def __iadd__(self, other):
- if isinstance(other, str_type):
- other = self._literalStringClass(other)
- if not isinstance(other, ParserElement):
- return NotImplemented
- return self.append(other) # And([self, other])
-
- def _checkRecursion(self, parseElementList):
- subRecCheckList = parseElementList[:] + [self]
- for e in self.exprs:
- e._checkRecursion(subRecCheckList)
- if not e.mayReturnEmpty:
- break
-
- def _generateDefaultName(self) -> str:
- inner = " ".join(str(e) for e in self.exprs)
- # strip off redundant inner {}'s
- while len(inner) > 1 and inner[0 :: len(inner) - 1] == "{}":
- inner = inner[1:-1]
- return "{" + inner + "}"
-
-
-class Or(ParseExpression):
- """Requires that at least one :class:`ParseExpression` is found. If
- two expressions match, the expression that matches the longest
- string will be used. May be constructed using the ``'^'``
- operator.
-
- Example::
-
- # construct Or using '^' operator
-
- number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums))
- print(number.search_string("123 3.1416 789"))
-
- prints::
-
- [['123'], ['3.1416'], ['789']]
- """
-
- def __init__(self, exprs: typing.Iterable[ParserElement], savelist: bool = False):
- super().__init__(exprs, savelist)
- if self.exprs:
- self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs)
- self.skipWhitespace = all(e.skipWhitespace for e in self.exprs)
- else:
- self.mayReturnEmpty = True
-
- def streamline(self) -> ParserElement:
- super().streamline()
- if self.exprs:
- self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs)
- self.saveAsList = any(e.saveAsList for e in self.exprs)
- self.skipWhitespace = all(
- e.skipWhitespace and not isinstance(e, White) for e in self.exprs
- )
- else:
- self.saveAsList = False
- return self
-
- def parseImpl(self, instring, loc, doActions=True):
- maxExcLoc = -1
- maxException = None
- matches = []
- fatals = []
- if all(e.callPreparse for e in self.exprs):
- loc = self.preParse(instring, loc)
- for e in self.exprs:
- try:
- loc2 = e.try_parse(instring, loc, raise_fatal=True)
- except ParseFatalException as pfe:
- pfe.__traceback__ = None
- pfe.parser_element = e
- fatals.append(pfe)
- maxException = None
- maxExcLoc = -1
- except ParseException as err:
- if not fatals:
- err.__traceback__ = None
- if err.loc > maxExcLoc:
- maxException = err
- maxExcLoc = err.loc
- except IndexError:
- if len(instring) > maxExcLoc:
- maxException = ParseException(
- instring, len(instring), e.errmsg, self
- )
- maxExcLoc = len(instring)
- else:
- # save match among all matches, to retry longest to shortest
- matches.append((loc2, e))
-
- if matches:
- # re-evaluate all matches in descending order of length of match, in case attached actions
- # might change whether or how much they match of the input.
- matches.sort(key=itemgetter(0), reverse=True)
-
- if not doActions:
- # no further conditions or parse actions to change the selection of
- # alternative, so the first match will be the best match
- best_expr = matches[0][1]
- return best_expr._parse(instring, loc, doActions)
-
- longest = -1, None
- for loc1, expr1 in matches:
- if loc1 <= longest[0]:
- # already have a longer match than this one will deliver, we are done
- return longest
-
- try:
- loc2, toks = expr1._parse(instring, loc, doActions)
- except ParseException as err:
- err.__traceback__ = None
- if err.loc > maxExcLoc:
- maxException = err
- maxExcLoc = err.loc
- else:
- if loc2 >= loc1:
- return loc2, toks
- # didn't match as much as before
- elif loc2 > longest[0]:
- longest = loc2, toks
-
- if longest != (-1, None):
- return longest
-
- if fatals:
- if len(fatals) > 1:
- fatals.sort(key=lambda e: -e.loc)
- if fatals[0].loc == fatals[1].loc:
- fatals.sort(key=lambda e: (-e.loc, -len(str(e.parser_element))))
- max_fatal = fatals[0]
- raise max_fatal
-
- if maxException is not None:
- # infer from this check that all alternatives failed at the current position
- # so emit this collective error message instead of any single error message
- if maxExcLoc == loc:
- maxException.msg = self.errmsg
- raise maxException
- else:
- raise ParseException(
- instring, loc, "no defined alternatives to match", self
- )
-
- def __ixor__(self, other):
- if isinstance(other, str_type):
- other = self._literalStringClass(other)
- if not isinstance(other, ParserElement):
- return NotImplemented
- return self.append(other) # Or([self, other])
-
- def _generateDefaultName(self) -> str:
- return "{" + " ^ ".join(str(e) for e in self.exprs) + "}"
-
- def _setResultsName(self, name, listAllMatches=False):
- if (
- __diag__.warn_multiple_tokens_in_named_alternation
- and Diagnostics.warn_multiple_tokens_in_named_alternation
- not in self.suppress_warnings_
- ):
- if any(
- isinstance(e, And)
- and Diagnostics.warn_multiple_tokens_in_named_alternation
- not in e.suppress_warnings_
- for e in self.exprs
- ):
- warnings.warn(
- "{}: setting results name {!r} on {} expression "
- "will return a list of all parsed tokens in an And alternative, "
- "in prior versions only the first token was returned; enclose "
- "contained argument in Group".format(
- "warn_multiple_tokens_in_named_alternation",
- name,
- type(self).__name__,
- ),
- stacklevel=3,
- )
-
- return super()._setResultsName(name, listAllMatches)
-
-
-class MatchFirst(ParseExpression):
- """Requires that at least one :class:`ParseExpression` is found. If
- more than one expression matches, the first one listed is the one that will
- match. May be constructed using the ``'|'`` operator.
-
- Example::
-
- # construct MatchFirst using '|' operator
-
- # watch the order of expressions to match
- number = Word(nums) | Combine(Word(nums) + '.' + Word(nums))
- print(number.search_string("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']]
-
- # put more selective expression first
- number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums)
- print(number.search_string("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']]
- """
-
- def __init__(self, exprs: typing.Iterable[ParserElement], savelist: bool = False):
- super().__init__(exprs, savelist)
- if self.exprs:
- self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs)
- self.skipWhitespace = all(e.skipWhitespace for e in self.exprs)
- else:
- self.mayReturnEmpty = True
-
- def streamline(self) -> ParserElement:
- if self.streamlined:
- return self
-
- super().streamline()
- if self.exprs:
- self.saveAsList = any(e.saveAsList for e in self.exprs)
- self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs)
- self.skipWhitespace = all(
- e.skipWhitespace and not isinstance(e, White) for e in self.exprs
- )
- else:
- self.saveAsList = False
- self.mayReturnEmpty = True
- return self
-
- def parseImpl(self, instring, loc, doActions=True):
- maxExcLoc = -1
- maxException = None
-
- for e in self.exprs:
- try:
- return e._parse(
- instring,
- loc,
- doActions,
- )
- except ParseFatalException as pfe:
- pfe.__traceback__ = None
- pfe.parser_element = e
- raise
- except ParseException as err:
- if err.loc > maxExcLoc:
- maxException = err
- maxExcLoc = err.loc
- except IndexError:
- if len(instring) > maxExcLoc:
- maxException = ParseException(
- instring, len(instring), e.errmsg, self
- )
- maxExcLoc = len(instring)
-
- if maxException is not None:
- # infer from this check that all alternatives failed at the current position
- # so emit this collective error message instead of any individual error message
- if maxExcLoc == loc:
- maxException.msg = self.errmsg
- raise maxException
- else:
- raise ParseException(
- instring, loc, "no defined alternatives to match", self
- )
-
- def __ior__(self, other):
- if isinstance(other, str_type):
- other = self._literalStringClass(other)
- if not isinstance(other, ParserElement):
- return NotImplemented
- return self.append(other) # MatchFirst([self, other])
-
- def _generateDefaultName(self) -> str:
- return "{" + " | ".join(str(e) for e in self.exprs) + "}"
-
- def _setResultsName(self, name, listAllMatches=False):
- if (
- __diag__.warn_multiple_tokens_in_named_alternation
- and Diagnostics.warn_multiple_tokens_in_named_alternation
- not in self.suppress_warnings_
- ):
- if any(
- isinstance(e, And)
- and Diagnostics.warn_multiple_tokens_in_named_alternation
- not in e.suppress_warnings_
- for e in self.exprs
- ):
- warnings.warn(
- "{}: setting results name {!r} on {} expression "
- "will return a list of all parsed tokens in an And alternative, "
- "in prior versions only the first token was returned; enclose "
- "contained argument in Group".format(
- "warn_multiple_tokens_in_named_alternation",
- name,
- type(self).__name__,
- ),
- stacklevel=3,
- )
-
- return super()._setResultsName(name, listAllMatches)
-
-
-class Each(ParseExpression):
- """Requires all given :class:`ParseExpression` s to be found, but in
- any order. Expressions may be separated by whitespace.
-
- May be constructed using the ``'&'`` operator.
-
- Example::
-
- color = one_of("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN")
- shape_type = one_of("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON")
- integer = Word(nums)
- shape_attr = "shape:" + shape_type("shape")
- posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn")
- color_attr = "color:" + color("color")
- size_attr = "size:" + integer("size")
-
- # use Each (using operator '&') to accept attributes in any order
- # (shape and posn are required, color and size are optional)
- shape_spec = shape_attr & posn_attr & Opt(color_attr) & Opt(size_attr)
-
- shape_spec.run_tests('''
- shape: SQUARE color: BLACK posn: 100, 120
- shape: CIRCLE size: 50 color: BLUE posn: 50,80
- color:GREEN size:20 shape:TRIANGLE posn:20,40
- '''
- )
-
- prints::
-
- shape: SQUARE color: BLACK posn: 100, 120
- ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']]
- - color: BLACK
- - posn: ['100', ',', '120']
- - x: 100
- - y: 120
- - shape: SQUARE
-
-
- shape: CIRCLE size: 50 color: BLUE posn: 50,80
- ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']]
- - color: BLUE
- - posn: ['50', ',', '80']
- - x: 50
- - y: 80
- - shape: CIRCLE
- - size: 50
-
-
- color: GREEN size: 20 shape: TRIANGLE posn: 20,40
- ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']]
- - color: GREEN
- - posn: ['20', ',', '40']
- - x: 20
- - y: 40
- - shape: TRIANGLE
- - size: 20
- """
-
- def __init__(self, exprs: typing.Iterable[ParserElement], savelist: bool = True):
- super().__init__(exprs, savelist)
- if self.exprs:
- self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs)
- else:
- self.mayReturnEmpty = True
- self.skipWhitespace = True
- self.initExprGroups = True
- self.saveAsList = True
-
- def __iand__(self, other):
- if isinstance(other, str_type):
- other = self._literalStringClass(other)
- if not isinstance(other, ParserElement):
- return NotImplemented
- return self.append(other) # Each([self, other])
-
- def streamline(self) -> ParserElement:
- super().streamline()
- if self.exprs:
- self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs)
- else:
- self.mayReturnEmpty = True
- return self
-
- def parseImpl(self, instring, loc, doActions=True):
- if self.initExprGroups:
- self.opt1map = dict(
- (id(e.expr), e) for e in self.exprs if isinstance(e, Opt)
- )
- opt1 = [e.expr for e in self.exprs if isinstance(e, Opt)]
- opt2 = [
- e
- for e in self.exprs
- if e.mayReturnEmpty and not isinstance(e, (Opt, Regex, ZeroOrMore))
- ]
- self.optionals = opt1 + opt2
- self.multioptionals = [
- e.expr.set_results_name(e.resultsName, list_all_matches=True)
- for e in self.exprs
- if isinstance(e, _MultipleMatch)
- ]
- self.multirequired = [
- e.expr.set_results_name(e.resultsName, list_all_matches=True)
- for e in self.exprs
- if isinstance(e, OneOrMore)
- ]
- self.required = [
- e for e in self.exprs if not isinstance(e, (Opt, ZeroOrMore, OneOrMore))
- ]
- self.required += self.multirequired
- self.initExprGroups = False
-
- tmpLoc = loc
- tmpReqd = self.required[:]
- tmpOpt = self.optionals[:]
- multis = self.multioptionals[:]
- matchOrder = []
-
- keepMatching = True
- failed = []
- fatals = []
- while keepMatching:
- tmpExprs = tmpReqd + tmpOpt + multis
- failed.clear()
- fatals.clear()
- for e in tmpExprs:
- try:
- tmpLoc = e.try_parse(instring, tmpLoc, raise_fatal=True)
- except ParseFatalException as pfe:
- pfe.__traceback__ = None
- pfe.parser_element = e
- fatals.append(pfe)
- failed.append(e)
- except ParseException:
- failed.append(e)
- else:
- matchOrder.append(self.opt1map.get(id(e), e))
- if e in tmpReqd:
- tmpReqd.remove(e)
- elif e in tmpOpt:
- tmpOpt.remove(e)
- if len(failed) == len(tmpExprs):
- keepMatching = False
-
- # look for any ParseFatalExceptions
- if fatals:
- if len(fatals) > 1:
- fatals.sort(key=lambda e: -e.loc)
- if fatals[0].loc == fatals[1].loc:
- fatals.sort(key=lambda e: (-e.loc, -len(str(e.parser_element))))
- max_fatal = fatals[0]
- raise max_fatal
-
- if tmpReqd:
- missing = ", ".join([str(e) for e in tmpReqd])
- raise ParseException(
- instring,
- loc,
- f"Missing one or more required elements ({missing})",
- )
-
- # add any unmatched Opts, in case they have default values defined
- matchOrder += [e for e in self.exprs if isinstance(e, Opt) and e.expr in tmpOpt]
-
- total_results = ParseResults([])
- for e in matchOrder:
- loc, results = e._parse(instring, loc, doActions)
- total_results += results
-
- return loc, total_results
-
- def _generateDefaultName(self) -> str:
- return "{" + " & ".join(str(e) for e in self.exprs) + "}"
-
-
-class ParseElementEnhance(ParserElement):
- """Abstract subclass of :class:`ParserElement`, for combining and
- post-processing parsed tokens.
- """
-
- def __init__(self, expr: Union[ParserElement, str], savelist: bool = False):
- super().__init__(savelist)
- if isinstance(expr, str_type):
- expr_str = typing.cast(str, expr)
- if issubclass(self._literalStringClass, Token):
- expr = self._literalStringClass(expr_str) # type: ignore[call-arg]
- elif issubclass(type(self), self._literalStringClass):
- expr = Literal(expr_str)
- else:
- expr = self._literalStringClass(Literal(expr_str)) # type: ignore[assignment, call-arg]
- expr = typing.cast(ParserElement, expr)
- self.expr = expr
- if expr is not None:
- self.mayIndexError = expr.mayIndexError
- self.mayReturnEmpty = expr.mayReturnEmpty
- self.set_whitespace_chars(
- expr.whiteChars, copy_defaults=expr.copyDefaultWhiteChars
- )
- self.skipWhitespace = expr.skipWhitespace
- self.saveAsList = expr.saveAsList
- self.callPreparse = expr.callPreparse
- self.ignoreExprs.extend(expr.ignoreExprs)
-
- def recurse(self) -> List[ParserElement]:
- return [self.expr] if self.expr is not None else []
-
- def parseImpl(self, instring, loc, doActions=True):
- if self.expr is not None:
- try:
- return self.expr._parse(instring, loc, doActions, callPreParse=False)
- except ParseBaseException as pbe:
- pbe.msg = self.errmsg
- raise
- else:
- raise ParseException(instring, loc, "No expression defined", self)
-
- def leave_whitespace(self, recursive: bool = True) -> ParserElement:
- super().leave_whitespace(recursive)
-
- if recursive:
- if self.expr is not None:
- self.expr = self.expr.copy()
- self.expr.leave_whitespace(recursive)
- return self
-
- def ignore_whitespace(self, recursive: bool = True) -> ParserElement:
- super().ignore_whitespace(recursive)
-
- if recursive:
- if self.expr is not None:
- self.expr = self.expr.copy()
- self.expr.ignore_whitespace(recursive)
- return self
-
- def ignore(self, other) -> ParserElement:
- if isinstance(other, Suppress):
- if other not in self.ignoreExprs:
- super().ignore(other)
- if self.expr is not None:
- self.expr.ignore(self.ignoreExprs[-1])
- else:
- super().ignore(other)
- if self.expr is not None:
- self.expr.ignore(self.ignoreExprs[-1])
- return self
-
- def streamline(self) -> ParserElement:
- super().streamline()
- if self.expr is not None:
- self.expr.streamline()
- return self
-
- def _checkRecursion(self, parseElementList):
- if self in parseElementList:
- raise RecursiveGrammarException(parseElementList + [self])
- subRecCheckList = parseElementList[:] + [self]
- if self.expr is not None:
- self.expr._checkRecursion(subRecCheckList)
-
- def validate(self, validateTrace=None) -> None:
- warnings.warn(
- "ParserElement.validate() is deprecated, and should not be used to check for left recursion",
- DeprecationWarning,
- stacklevel=2,
- )
- if validateTrace is None:
- validateTrace = []
- tmp = validateTrace[:] + [self]
- if self.expr is not None:
- self.expr.validate(tmp)
- self._checkRecursion([])
-
- def _generateDefaultName(self) -> str:
- return f"{self.__class__.__name__}:({str(self.expr)})"
-
- # Compatibility synonyms
- # fmt: off
- @replaced_by_pep8(leave_whitespace)
- def leaveWhitespace(self): ...
-
- @replaced_by_pep8(ignore_whitespace)
- def ignoreWhitespace(self): ...
- # fmt: on
-
-
-class IndentedBlock(ParseElementEnhance):
- """
- Expression to match one or more expressions at a given indentation level.
- Useful for parsing text where structure is implied by indentation (like Python source code).
- """
-
- class _Indent(Empty):
- def __init__(self, ref_col: int):
- super().__init__()
- self.errmsg = f"expected indent at column {ref_col}"
- self.add_condition(lambda s, l, t: col(l, s) == ref_col)
-
- class _IndentGreater(Empty):
- def __init__(self, ref_col: int):
- super().__init__()
- self.errmsg = f"expected indent at column greater than {ref_col}"
- self.add_condition(lambda s, l, t: col(l, s) > ref_col)
-
- def __init__(
- self, expr: ParserElement, *, recursive: bool = False, grouped: bool = True
- ):
- super().__init__(expr, savelist=True)
- # if recursive:
- # raise NotImplementedError("IndentedBlock with recursive is not implemented")
- self._recursive = recursive
- self._grouped = grouped
- self.parent_anchor = 1
-
- def parseImpl(self, instring, loc, doActions=True):
- # advance parse position to non-whitespace by using an Empty()
- # this should be the column to be used for all subsequent indented lines
- anchor_loc = Empty().preParse(instring, loc)
-
- # see if self.expr matches at the current location - if not it will raise an exception
- # and no further work is necessary
- self.expr.try_parse(instring, anchor_loc, do_actions=doActions)
-
- indent_col = col(anchor_loc, instring)
- peer_detect_expr = self._Indent(indent_col)
-
- inner_expr = Empty() + peer_detect_expr + self.expr
- if self._recursive:
- sub_indent = self._IndentGreater(indent_col)
- nested_block = IndentedBlock(
- self.expr, recursive=self._recursive, grouped=self._grouped
- )
- nested_block.set_debug(self.debug)
- nested_block.parent_anchor = indent_col
- inner_expr += Opt(sub_indent + nested_block)
-
- inner_expr.set_name(f"inner {hex(id(inner_expr))[-4:].upper()}@{indent_col}")
- block = OneOrMore(inner_expr)
-
- trailing_undent = self._Indent(self.parent_anchor) | StringEnd()
-
- if self._grouped:
- wrapper = Group
- else:
- wrapper = lambda expr: expr
- return (wrapper(block) + Optional(trailing_undent)).parseImpl(
- instring, anchor_loc, doActions
- )
-
-
-class AtStringStart(ParseElementEnhance):
- """Matches if expression matches at the beginning of the parse
- string::
-
- AtStringStart(Word(nums)).parse_string("123")
- # prints ["123"]
-
- AtStringStart(Word(nums)).parse_string(" 123")
- # raises ParseException
- """
-
- def __init__(self, expr: Union[ParserElement, str]):
- super().__init__(expr)
- self.callPreparse = False
-
- def parseImpl(self, instring, loc, doActions=True):
- if loc != 0:
- raise ParseException(instring, loc, "not found at string start")
- return super().parseImpl(instring, loc, doActions)
-
-
-class AtLineStart(ParseElementEnhance):
- r"""Matches if an expression matches at the beginning of a line within
- the parse string
-
- Example::
-
- test = '''\
- AAA this line
- AAA and this line
- AAA but not this one
- B AAA and definitely not this one
- '''
-
- for t in (AtLineStart('AAA') + rest_of_line).search_string(test):
- print(t)
-
- prints::
-
- ['AAA', ' this line']
- ['AAA', ' and this line']
-
- """
-
- def __init__(self, expr: Union[ParserElement, str]):
- super().__init__(expr)
- self.callPreparse = False
-
- def parseImpl(self, instring, loc, doActions=True):
- if col(loc, instring) != 1:
- raise ParseException(instring, loc, "not found at line start")
- return super().parseImpl(instring, loc, doActions)
-
-
-class FollowedBy(ParseElementEnhance):
- """Lookahead matching of the given parse expression.
- ``FollowedBy`` does *not* advance the parsing position within
- the input string, it only verifies that the specified parse
- expression matches at the current position. ``FollowedBy``
- always returns a null token list. If any results names are defined
- in the lookahead expression, those *will* be returned for access by
- name.
-
- Example::
-
- # use FollowedBy to match a label only if it is followed by a ':'
- data_word = Word(alphas)
- label = data_word + FollowedBy(':')
- attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join))
-
- attr_expr[1, ...].parse_string("shape: SQUARE color: BLACK posn: upper left").pprint()
-
- prints::
-
- [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']]
- """
-
- def __init__(self, expr: Union[ParserElement, str]):
- super().__init__(expr)
- self.mayReturnEmpty = True
-
- def parseImpl(self, instring, loc, doActions=True):
- # by using self._expr.parse and deleting the contents of the returned ParseResults list
- # we keep any named results that were defined in the FollowedBy expression
- _, ret = self.expr._parse(instring, loc, doActions=doActions)
- del ret[:]
-
- return loc, ret
-
-
-class PrecededBy(ParseElementEnhance):
- """Lookbehind matching of the given parse expression.
- ``PrecededBy`` does not advance the parsing position within the
- input string, it only verifies that the specified parse expression
- matches prior to the current position. ``PrecededBy`` always
- returns a null token list, but if a results name is defined on the
- given expression, it is returned.
-
- Parameters:
-
- - ``expr`` - expression that must match prior to the current parse
- location
- - ``retreat`` - (default= ``None``) - (int) maximum number of characters
- to lookbehind prior to the current parse location
-
- If the lookbehind expression is a string, :class:`Literal`,
- :class:`Keyword`, or a :class:`Word` or :class:`CharsNotIn`
- with a specified exact or maximum length, then the retreat
- parameter is not required. Otherwise, retreat must be specified to
- give a maximum number of characters to look back from
- the current parse position for a lookbehind match.
-
- Example::
-
- # VB-style variable names with type prefixes
- int_var = PrecededBy("#") + pyparsing_common.identifier
- str_var = PrecededBy("$") + pyparsing_common.identifier
-
- """
-
- def __init__(
- self, expr: Union[ParserElement, str], retreat: typing.Optional[int] = None
- ):
- super().__init__(expr)
- self.expr = self.expr().leave_whitespace()
- self.mayReturnEmpty = True
- self.mayIndexError = False
- self.exact = False
- if isinstance(expr, str_type):
- expr = typing.cast(str, expr)
- retreat = len(expr)
- self.exact = True
- elif isinstance(expr, (Literal, Keyword)):
- retreat = expr.matchLen
- self.exact = True
- elif isinstance(expr, (Word, CharsNotIn)) and expr.maxLen != _MAX_INT:
- retreat = expr.maxLen
- self.exact = True
- elif isinstance(expr, PositionToken):
- retreat = 0
- self.exact = True
- self.retreat = retreat
- self.errmsg = "not preceded by " + str(expr)
- self.skipWhitespace = False
- self.parseAction.append(lambda s, l, t: t.__delitem__(slice(None, None)))
-
- def parseImpl(self, instring, loc=0, doActions=True):
- if self.exact:
- if loc < self.retreat:
- raise ParseException(instring, loc, self.errmsg)
- start = loc - self.retreat
- _, ret = self.expr._parse(instring, start)
- else:
- # retreat specified a maximum lookbehind window, iterate
- test_expr = self.expr + StringEnd()
- instring_slice = instring[max(0, loc - self.retreat) : loc]
- last_expr = ParseException(instring, loc, self.errmsg)
- for offset in range(1, min(loc, self.retreat + 1) + 1):
- try:
- # print('trying', offset, instring_slice, repr(instring_slice[loc - offset:]))
- _, ret = test_expr._parse(
- instring_slice, len(instring_slice) - offset
- )
- except ParseBaseException as pbe:
- last_expr = pbe
- else:
- break
- else:
- raise last_expr
- return loc, ret
-
-
-class Located(ParseElementEnhance):
- """
- Decorates a returned token with its starting and ending
- locations in the input string.
-
- This helper adds the following results names:
-
- - ``locn_start`` - location where matched expression begins
- - ``locn_end`` - location where matched expression ends
- - ``value`` - the actual parsed results
-
- Be careful if the input text contains ``<TAB>`` characters, you
- may want to call :class:`ParserElement.parse_with_tabs`
-
- Example::
-
- wd = Word(alphas)
- for match in Located(wd).search_string("ljsdf123lksdjjf123lkkjj1222"):
- print(match)
-
- prints::
-
- [0, ['ljsdf'], 5]
- [8, ['lksdjjf'], 15]
- [18, ['lkkjj'], 23]
-
- """
-
- def parseImpl(self, instring, loc, doActions=True):
- start = loc
- loc, tokens = self.expr._parse(instring, start, doActions, callPreParse=False)
- ret_tokens = ParseResults([start, tokens, loc])
- ret_tokens["locn_start"] = start
- ret_tokens["value"] = tokens
- ret_tokens["locn_end"] = loc
- if self.resultsName:
- # must return as a list, so that the name will be attached to the complete group
- return loc, [ret_tokens]
- else:
- return loc, ret_tokens
-
-
-class NotAny(ParseElementEnhance):
- """
- Lookahead to disallow matching with the given parse expression.
- ``NotAny`` does *not* advance the parsing position within the
- input string, it only verifies that the specified parse expression
- does *not* match at the current position. Also, ``NotAny`` does
- *not* skip over leading whitespace. ``NotAny`` always returns
- a null token list. May be constructed using the ``'~'`` operator.
-
- Example::
-
- AND, OR, NOT = map(CaselessKeyword, "AND OR NOT".split())
-
- # take care not to mistake keywords for identifiers
- ident = ~(AND | OR | NOT) + Word(alphas)
- boolean_term = Opt(NOT) + ident
-
- # very crude boolean expression - to support parenthesis groups and
- # operation hierarchy, use infix_notation
- boolean_expr = boolean_term + ((AND | OR) + boolean_term)[...]
-
- # integers that are followed by "." are actually floats
- integer = Word(nums) + ~Char(".")
- """
-
- def __init__(self, expr: Union[ParserElement, str]):
- super().__init__(expr)
- # do NOT use self.leave_whitespace(), don't want to propagate to exprs
- # self.leave_whitespace()
- self.skipWhitespace = False
-
- self.mayReturnEmpty = True
- self.errmsg = "Found unwanted token, " + str(self.expr)
-
- def parseImpl(self, instring, loc, doActions=True):
- if self.expr.can_parse_next(instring, loc, do_actions=doActions):
- raise ParseException(instring, loc, self.errmsg, self)
- return loc, []
-
- def _generateDefaultName(self) -> str:
- return "~{" + str(self.expr) + "}"
-
-
-class _MultipleMatch(ParseElementEnhance):
- def __init__(
- self,
- expr: Union[str, ParserElement],
- stop_on: typing.Optional[Union[ParserElement, str]] = None,
- *,
- stopOn: typing.Optional[Union[ParserElement, str]] = None,
- ):
- super().__init__(expr)
- stopOn = stopOn or stop_on
- self.saveAsList = True
- ender = stopOn
- if isinstance(ender, str_type):
- ender = self._literalStringClass(ender)
- self.stopOn(ender)
-
- def stopOn(self, ender) -> ParserElement:
- if isinstance(ender, str_type):
- ender = self._literalStringClass(ender)
- self.not_ender = ~ender if ender is not None else None
- return self
-
- def parseImpl(self, instring, loc, doActions=True):
- self_expr_parse = self.expr._parse
- self_skip_ignorables = self._skipIgnorables
- check_ender = self.not_ender is not None
- if check_ender:
- try_not_ender = self.not_ender.try_parse
-
- # must be at least one (but first see if we are the stopOn sentinel;
- # if so, fail)
- if check_ender:
- try_not_ender(instring, loc)
- loc, tokens = self_expr_parse(instring, loc, doActions)
- try:
- hasIgnoreExprs = not not self.ignoreExprs
- while 1:
- if check_ender:
- try_not_ender(instring, loc)
- if hasIgnoreExprs:
- preloc = self_skip_ignorables(instring, loc)
- else:
- preloc = loc
- loc, tmptokens = self_expr_parse(instring, preloc, doActions)
- tokens += tmptokens
- except (ParseException, IndexError):
- pass
-
- return loc, tokens
-
- def _setResultsName(self, name, listAllMatches=False):
- if (
- __diag__.warn_ungrouped_named_tokens_in_collection
- and Diagnostics.warn_ungrouped_named_tokens_in_collection
- not in self.suppress_warnings_
- ):
- for e in [self.expr] + self.expr.recurse():
- if (
- isinstance(e, ParserElement)
- and e.resultsName
- and Diagnostics.warn_ungrouped_named_tokens_in_collection
- not in e.suppress_warnings_
- ):
- warnings.warn(
- "{}: setting results name {!r} on {} expression "
- "collides with {!r} on contained expression".format(
- "warn_ungrouped_named_tokens_in_collection",
- name,
- type(self).__name__,
- e.resultsName,
- ),
- stacklevel=3,
- )
-
- return super()._setResultsName(name, listAllMatches)
-
-
-class OneOrMore(_MultipleMatch):
- """
- Repetition of one or more of the given expression.
-
- Parameters:
-
- - ``expr`` - expression that must match one or more times
- - ``stop_on`` - (default= ``None``) - expression for a terminating sentinel
- (only required if the sentinel would ordinarily match the repetition
- expression)
-
- Example::
-
- data_word = Word(alphas)
- label = data_word + FollowedBy(':')
- attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).set_parse_action(' '.join))
-
- text = "shape: SQUARE posn: upper left color: BLACK"
- attr_expr[1, ...].parse_string(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']]
-
- # use stop_on attribute for OneOrMore to avoid reading label string as part of the data
- attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join))
- OneOrMore(attr_expr).parse_string(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']]
-
- # could also be written as
- (attr_expr * (1,)).parse_string(text).pprint()
- """
-
- def _generateDefaultName(self) -> str:
- return "{" + str(self.expr) + "}..."
-
-
-class ZeroOrMore(_MultipleMatch):
- """
- Optional repetition of zero or more of the given expression.
-
- Parameters:
-
- - ``expr`` - expression that must match zero or more times
- - ``stop_on`` - expression for a terminating sentinel
- (only required if the sentinel would ordinarily match the repetition
- expression) - (default= ``None``)
-
- Example: similar to :class:`OneOrMore`
- """
-
- def __init__(
- self,
- expr: Union[str, ParserElement],
- stop_on: typing.Optional[Union[ParserElement, str]] = None,
- *,
- stopOn: typing.Optional[Union[ParserElement, str]] = None,
- ):
- super().__init__(expr, stopOn=stopOn or stop_on)
- self.mayReturnEmpty = True
-
- def parseImpl(self, instring, loc, doActions=True):
- try:
- return super().parseImpl(instring, loc, doActions)
- except (ParseException, IndexError):
- return loc, ParseResults([], name=self.resultsName)
-
- def _generateDefaultName(self) -> str:
- return "[" + str(self.expr) + "]..."
-
-
-class DelimitedList(ParseElementEnhance):
- def __init__(
- self,
- expr: Union[str, ParserElement],
- delim: Union[str, ParserElement] = ",",
- combine: bool = False,
- min: typing.Optional[int] = None,
- max: typing.Optional[int] = None,
- *,
- allow_trailing_delim: bool = False,
- ):
- """Helper to define a delimited list of expressions - the delimiter
- defaults to ','. By default, the list elements and delimiters can
- have intervening whitespace, and comments, but this can be
- overridden by passing ``combine=True`` in the constructor. If
- ``combine`` is set to ``True``, the matching tokens are
- returned as a single token string, with the delimiters included;
- otherwise, the matching tokens are returned as a list of tokens,
- with the delimiters suppressed.
-
- If ``allow_trailing_delim`` is set to True, then the list may end with
- a delimiter.
-
- Example::
-
- DelimitedList(Word(alphas)).parse_string("aa,bb,cc") # -> ['aa', 'bb', 'cc']
- DelimitedList(Word(hexnums), delim=':', combine=True).parse_string("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE']
- """
- if isinstance(expr, str_type):
- expr = ParserElement._literalStringClass(expr)
- expr = typing.cast(ParserElement, expr)
-
- if min is not None:
- if min < 1:
- raise ValueError("min must be greater than 0")
- if max is not None:
- if min is not None and max < min:
- raise ValueError("max must be greater than, or equal to min")
-
- self.content = expr
- self.raw_delim = str(delim)
- self.delim = delim
- self.combine = combine
- if not combine:
- self.delim = Suppress(delim)
- self.min = min or 1
- self.max = max
- self.allow_trailing_delim = allow_trailing_delim
-
- delim_list_expr = self.content + (self.delim + self.content) * (
- self.min - 1,
- None if self.max is None else self.max - 1,
- )
- if self.allow_trailing_delim:
- delim_list_expr += Opt(self.delim)
-
- if self.combine:
- delim_list_expr = Combine(delim_list_expr)
-
- super().__init__(delim_list_expr, savelist=True)
-
- def _generateDefaultName(self) -> str:
- return "{0} [{1} {0}]...".format(self.content.streamline(), self.raw_delim)
-
-
-class _NullToken:
- def __bool__(self):
- return False
-
- def __str__(self):
- return ""
-
-
-class Opt(ParseElementEnhance):
- """
- Optional matching of the given expression.
-
- Parameters:
-
- - ``expr`` - expression that must match zero or more times
- - ``default`` (optional) - value to be returned if the optional expression is not found.
-
- Example::
-
- # US postal code can be a 5-digit zip, plus optional 4-digit qualifier
- zip = Combine(Word(nums, exact=5) + Opt('-' + Word(nums, exact=4)))
- zip.run_tests('''
- # traditional ZIP code
- 12345
-
- # ZIP+4 form
- 12101-0001
-
- # invalid ZIP
- 98765-
- ''')
-
- prints::
-
- # traditional ZIP code
- 12345
- ['12345']
-
- # ZIP+4 form
- 12101-0001
- ['12101-0001']
-
- # invalid ZIP
- 98765-
- ^
- FAIL: Expected end of text (at char 5), (line:1, col:6)
- """
-
- __optionalNotMatched = _NullToken()
-
- def __init__(
- self, expr: Union[ParserElement, str], default: Any = __optionalNotMatched
- ):
- super().__init__(expr, savelist=False)
- self.saveAsList = self.expr.saveAsList
- self.defaultValue = default
- self.mayReturnEmpty = True
-
- def parseImpl(self, instring, loc, doActions=True):
- self_expr = self.expr
- try:
- loc, tokens = self_expr._parse(instring, loc, doActions, callPreParse=False)
- except (ParseException, IndexError):
- default_value = self.defaultValue
- if default_value is not self.__optionalNotMatched:
- if self_expr.resultsName:
- tokens = ParseResults([default_value])
- tokens[self_expr.resultsName] = default_value
- else:
- tokens = [default_value]
- else:
- tokens = []
- return loc, tokens
-
- def _generateDefaultName(self) -> str:
- inner = str(self.expr)
- # strip off redundant inner {}'s
- while len(inner) > 1 and inner[0 :: len(inner) - 1] == "{}":
- inner = inner[1:-1]
- return "[" + inner + "]"
-
-
-Optional = Opt
-
-
-class SkipTo(ParseElementEnhance):
- """
- Token for skipping over all undefined text until the matched
- expression is found.
-
- Parameters:
-
- - ``expr`` - target expression marking the end of the data to be skipped
- - ``include`` - if ``True``, the target expression is also parsed
- (the skipped text and target expression are returned as a 2-element
- list) (default= ``False``).
- - ``ignore`` - (default= ``None``) used to define grammars (typically quoted strings and
- comments) that might contain false matches to the target expression
- - ``fail_on`` - (default= ``None``) define expressions that are not allowed to be
- included in the skipped test; if found before the target expression is found,
- the :class:`SkipTo` is not a match
-
- Example::
-
- report = '''
- Outstanding Issues Report - 1 Jan 2000
-
- # | Severity | Description | Days Open
- -----+----------+-------------------------------------------+-----------
- 101 | Critical | Intermittent system crash | 6
- 94 | Cosmetic | Spelling error on Login ('log|n') | 14
- 79 | Minor | System slow when running too many reports | 47
- '''
- integer = Word(nums)
- SEP = Suppress('|')
- # use SkipTo to simply match everything up until the next SEP
- # - ignore quoted strings, so that a '|' character inside a quoted string does not match
- # - parse action will call token.strip() for each matched token, i.e., the description body
- string_data = SkipTo(SEP, ignore=quoted_string)
- string_data.set_parse_action(token_map(str.strip))
- ticket_expr = (integer("issue_num") + SEP
- + string_data("sev") + SEP
- + string_data("desc") + SEP
- + integer("days_open"))
-
- for tkt in ticket_expr.search_string(report):
- print tkt.dump()
-
- prints::
-
- ['101', 'Critical', 'Intermittent system crash', '6']
- - days_open: '6'
- - desc: 'Intermittent system crash'
- - issue_num: '101'
- - sev: 'Critical'
- ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14']
- - days_open: '14'
- - desc: "Spelling error on Login ('log|n')"
- - issue_num: '94'
- - sev: 'Cosmetic'
- ['79', 'Minor', 'System slow when running too many reports', '47']
- - days_open: '47'
- - desc: 'System slow when running too many reports'
- - issue_num: '79'
- - sev: 'Minor'
- """
-
- def __init__(
- self,
- other: Union[ParserElement, str],
- include: bool = False,
- ignore: typing.Optional[Union[ParserElement, str]] = None,
- fail_on: typing.Optional[Union[ParserElement, str]] = None,
- *,
- failOn: typing.Optional[Union[ParserElement, str]] = None,
- ):
- super().__init__(other)
- failOn = failOn or fail_on
- if ignore is not None:
- self.ignore(ignore)
- self.mayReturnEmpty = True
- self.mayIndexError = False
- self.includeMatch = include
- self.saveAsList = False
- if isinstance(failOn, str_type):
- self.failOn = self._literalStringClass(failOn)
- else:
- self.failOn = failOn
- self.errmsg = "No match found for " + str(self.expr)
-
- def parseImpl(self, instring, loc, doActions=True):
- startloc = loc
- instrlen = len(instring)
- self_expr_parse = self.expr._parse
- self_failOn_canParseNext = (
- self.failOn.canParseNext if self.failOn is not None else None
- )
- self_preParse = self.preParse if self.callPreparse else None
-
- tmploc = loc
- while tmploc <= instrlen:
- if self_failOn_canParseNext is not None:
- # break if failOn expression matches
- if self_failOn_canParseNext(instring, tmploc):
- break
-
- if self_preParse is not None:
- # skip grammar-ignored expressions
- tmploc = self_preParse(instring, tmploc)
-
- try:
- self_expr_parse(instring, tmploc, doActions=False, callPreParse=False)
- except (ParseException, IndexError):
- # no match, advance loc in string
- tmploc += 1
- else:
- # matched skipto expr, done
- break
-
- else:
- # ran off the end of the input string without matching skipto expr, fail
- raise ParseException(instring, loc, self.errmsg, self)
-
- # build up return values
- loc = tmploc
- skiptext = instring[startloc:loc]
- skipresult = ParseResults(skiptext)
-
- if self.includeMatch:
- loc, mat = self_expr_parse(instring, loc, doActions, callPreParse=False)
- skipresult += mat
-
- return loc, skipresult
-
-
-class Forward(ParseElementEnhance):
- """
- Forward declaration of an expression to be defined later -
- used for recursive grammars, such as algebraic infix notation.
- When the expression is known, it is assigned to the ``Forward``
- variable using the ``'<<'`` operator.
-
- Note: take care when assigning to ``Forward`` not to overlook
- precedence of operators.
-
- Specifically, ``'|'`` has a lower precedence than ``'<<'``, so that::
-
- fwd_expr << a | b | c
-
- will actually be evaluated as::
-
- (fwd_expr << a) | b | c
-
- thereby leaving b and c out as parseable alternatives. It is recommended that you
- explicitly group the values inserted into the ``Forward``::
-
- fwd_expr << (a | b | c)
-
- Converting to use the ``'<<='`` operator instead will avoid this problem.
-
- See :class:`ParseResults.pprint` for an example of a recursive
- parser created using ``Forward``.
- """
-
- def __init__(self, other: typing.Optional[Union[ParserElement, str]] = None):
- self.caller_frame = traceback.extract_stack(limit=2)[0]
- super().__init__(other, savelist=False) # type: ignore[arg-type]
- self.lshift_line = None
-
- def __lshift__(self, other) -> "Forward":
- if hasattr(self, "caller_frame"):
- del self.caller_frame
- if isinstance(other, str_type):
- other = self._literalStringClass(other)
-
- if not isinstance(other, ParserElement):
- return NotImplemented
-
- self.expr = other
- self.streamlined = other.streamlined
- self.mayIndexError = self.expr.mayIndexError
- self.mayReturnEmpty = self.expr.mayReturnEmpty
- self.set_whitespace_chars(
- self.expr.whiteChars, copy_defaults=self.expr.copyDefaultWhiteChars
- )
- self.skipWhitespace = self.expr.skipWhitespace
- self.saveAsList = self.expr.saveAsList
- self.ignoreExprs.extend(self.expr.ignoreExprs)
- self.lshift_line = traceback.extract_stack(limit=2)[-2] # type: ignore[assignment]
- return self
-
- def __ilshift__(self, other) -> "Forward":
- if not isinstance(other, ParserElement):
- return NotImplemented
-
- return self << other
-
- def __or__(self, other) -> "ParserElement":
- caller_line = traceback.extract_stack(limit=2)[-2]
- if (
- __diag__.warn_on_match_first_with_lshift_operator
- and caller_line == self.lshift_line
- and Diagnostics.warn_on_match_first_with_lshift_operator
- not in self.suppress_warnings_
- ):
- warnings.warn(
- "using '<<' operator with '|' is probably an error, use '<<='",
- stacklevel=2,
- )
- ret = super().__or__(other)
- return ret
-
- def __del__(self):
- # see if we are getting dropped because of '=' reassignment of var instead of '<<=' or '<<'
- if (
- self.expr is None
- and __diag__.warn_on_assignment_to_Forward
- and Diagnostics.warn_on_assignment_to_Forward not in self.suppress_warnings_
- ):
- warnings.warn_explicit(
- "Forward defined here but no expression attached later using '<<=' or '<<'",
- UserWarning,
- filename=self.caller_frame.filename,
- lineno=self.caller_frame.lineno,
- )
-
- def parseImpl(self, instring, loc, doActions=True):
- if (
- self.expr is None
- and __diag__.warn_on_parse_using_empty_Forward
- and Diagnostics.warn_on_parse_using_empty_Forward
- not in self.suppress_warnings_
- ):
- # walk stack until parse_string, scan_string, search_string, or transform_string is found
- parse_fns = (
- "parse_string",
- "scan_string",
- "search_string",
- "transform_string",
- )
- tb = traceback.extract_stack(limit=200)
- for i, frm in enumerate(reversed(tb), start=1):
- if frm.name in parse_fns:
- stacklevel = i + 1
- break
- else:
- stacklevel = 2
- warnings.warn(
- "Forward expression was never assigned a value, will not parse any input",
- stacklevel=stacklevel,
- )
- if not ParserElement._left_recursion_enabled:
- return super().parseImpl(instring, loc, doActions)
- # ## Bounded Recursion algorithm ##
- # Recursion only needs to be processed at ``Forward`` elements, since they are
- # the only ones that can actually refer to themselves. The general idea is
- # to handle recursion stepwise: We start at no recursion, then recurse once,
- # recurse twice, ..., until more recursion offers no benefit (we hit the bound).
- #
- # The "trick" here is that each ``Forward`` gets evaluated in two contexts
- # - to *match* a specific recursion level, and
- # - to *search* the bounded recursion level
- # and the two run concurrently. The *search* must *match* each recursion level
- # to find the best possible match. This is handled by a memo table, which
- # provides the previous match to the next level match attempt.
- #
- # See also "Left Recursion in Parsing Expression Grammars", Medeiros et al.
- #
- # There is a complication since we not only *parse* but also *transform* via
- # actions: We do not want to run the actions too often while expanding. Thus,
- # we expand using `doActions=False` and only run `doActions=True` if the next
- # recursion level is acceptable.
- with ParserElement.recursion_lock:
- memo = ParserElement.recursion_memos
- try:
- # we are parsing at a specific recursion expansion - use it as-is
- prev_loc, prev_result = memo[loc, self, doActions]
- if isinstance(prev_result, Exception):
- raise prev_result
- return prev_loc, prev_result.copy()
- except KeyError:
- act_key = (loc, self, True)
- peek_key = (loc, self, False)
- # we are searching for the best recursion expansion - keep on improving
- # both `doActions` cases must be tracked separately here!
- prev_loc, prev_peek = memo[peek_key] = (
- loc - 1,
- ParseException(
- instring, loc, "Forward recursion without base case", self
- ),
- )
- if doActions:
- memo[act_key] = memo[peek_key]
- while True:
- try:
- new_loc, new_peek = super().parseImpl(instring, loc, False)
- except ParseException:
- # we failed before getting any match – do not hide the error
- if isinstance(prev_peek, Exception):
- raise
- new_loc, new_peek = prev_loc, prev_peek
- # the match did not get better: we are done
- if new_loc <= prev_loc:
- if doActions:
- # replace the match for doActions=False as well,
- # in case the action did backtrack
- prev_loc, prev_result = memo[peek_key] = memo[act_key]
- del memo[peek_key], memo[act_key]
- return prev_loc, prev_result.copy()
- del memo[peek_key]
- return prev_loc, prev_peek.copy()
- # the match did get better: see if we can improve further
- else:
- if doActions:
- try:
- memo[act_key] = super().parseImpl(instring, loc, True)
- except ParseException as e:
- memo[peek_key] = memo[act_key] = (new_loc, e)
- raise
- prev_loc, prev_peek = memo[peek_key] = new_loc, new_peek
-
- def leave_whitespace(self, recursive: bool = True) -> ParserElement:
- self.skipWhitespace = False
- return self
-
- def ignore_whitespace(self, recursive: bool = True) -> ParserElement:
- self.skipWhitespace = True
- return self
-
- def streamline(self) -> ParserElement:
- if not self.streamlined:
- self.streamlined = True
- if self.expr is not None:
- self.expr.streamline()
- return self
-
- def validate(self, validateTrace=None) -> None:
- warnings.warn(
- "ParserElement.validate() is deprecated, and should not be used to check for left recursion",
- DeprecationWarning,
- stacklevel=2,
- )
- if validateTrace is None:
- validateTrace = []
-
- if self not in validateTrace:
- tmp = validateTrace[:] + [self]
- if self.expr is not None:
- self.expr.validate(tmp)
- self._checkRecursion([])
-
- def _generateDefaultName(self) -> str:
- # Avoid infinite recursion by setting a temporary _defaultName
- self._defaultName = ": ..."
-
- # Use the string representation of main expression.
- retString = "..."
- try:
- if self.expr is not None:
- retString = str(self.expr)[:1000]
- else:
- retString = "None"
- finally:
- return self.__class__.__name__ + ": " + retString
-
- def copy(self) -> ParserElement:
- if self.expr is not None:
- return super().copy()
- else:
- ret = Forward()
- ret <<= self
- return ret
-
- def _setResultsName(self, name, list_all_matches=False):
- if (
- __diag__.warn_name_set_on_empty_Forward
- and Diagnostics.warn_name_set_on_empty_Forward
- not in self.suppress_warnings_
- ):
- if self.expr is None:
- warnings.warn(
- "{}: setting results name {!r} on {} expression "
- "that has no contained expression".format(
- "warn_name_set_on_empty_Forward", name, type(self).__name__
- ),
- stacklevel=3,
- )
-
- return super()._setResultsName(name, list_all_matches)
-
- # Compatibility synonyms
- # fmt: off
- @replaced_by_pep8(leave_whitespace)
- def leaveWhitespace(self): ...
-
- @replaced_by_pep8(ignore_whitespace)
- def ignoreWhitespace(self): ...
- # fmt: on
-
-
-class TokenConverter(ParseElementEnhance):
- """
- Abstract subclass of :class:`ParseExpression`, for converting parsed results.
- """
-
- def __init__(self, expr: Union[ParserElement, str], savelist=False):
- super().__init__(expr) # , savelist)
- self.saveAsList = False
-
-
-class Combine(TokenConverter):
- """Converter to concatenate all matching tokens to a single string.
- By default, the matching patterns must also be contiguous in the
- input string; this can be disabled by specifying
- ``'adjacent=False'`` in the constructor.
-
- Example::
-
- real = Word(nums) + '.' + Word(nums)
- print(real.parse_string('3.1416')) # -> ['3', '.', '1416']
- # will also erroneously match the following
- print(real.parse_string('3. 1416')) # -> ['3', '.', '1416']
-
- real = Combine(Word(nums) + '.' + Word(nums))
- print(real.parse_string('3.1416')) # -> ['3.1416']
- # no match when there are internal spaces
- print(real.parse_string('3. 1416')) # -> Exception: Expected W:(0123...)
- """
-
- def __init__(
- self,
- expr: ParserElement,
- join_string: str = "",
- adjacent: bool = True,
- *,
- joinString: typing.Optional[str] = None,
- ):
- super().__init__(expr)
- joinString = joinString if joinString is not None else join_string
- # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself
- if adjacent:
- self.leave_whitespace()
- self.adjacent = adjacent
- self.skipWhitespace = True
- self.joinString = joinString
- self.callPreparse = True
-
- def ignore(self, other) -> ParserElement:
- if self.adjacent:
- ParserElement.ignore(self, other)
- else:
- super().ignore(other)
- return self
-
- def postParse(self, instring, loc, tokenlist):
- retToks = tokenlist.copy()
- del retToks[:]
- retToks += ParseResults(
- ["".join(tokenlist._asStringList(self.joinString))], modal=self.modalResults
- )
-
- if self.resultsName and retToks.haskeys():
- return [retToks]
- else:
- return retToks
-
-
-class Group(TokenConverter):
- """Converter to return the matched tokens as a list - useful for
- returning tokens of :class:`ZeroOrMore` and :class:`OneOrMore` expressions.
-
- The optional ``aslist`` argument when set to True will return the
- parsed tokens as a Python list instead of a pyparsing ParseResults.
-
- Example::
-
- ident = Word(alphas)
- num = Word(nums)
- term = ident | num
- func = ident + Opt(DelimitedList(term))
- print(func.parse_string("fn a, b, 100"))
- # -> ['fn', 'a', 'b', '100']
-
- func = ident + Group(Opt(DelimitedList(term)))
- print(func.parse_string("fn a, b, 100"))
- # -> ['fn', ['a', 'b', '100']]
- """
-
- def __init__(self, expr: ParserElement, aslist: bool = False):
- super().__init__(expr)
- self.saveAsList = True
- self._asPythonList = aslist
-
- def postParse(self, instring, loc, tokenlist):
- if self._asPythonList:
- return ParseResults.List(
- tokenlist.asList()
- if isinstance(tokenlist, ParseResults)
- else list(tokenlist)
- )
- else:
- return [tokenlist]
-
-
-class Dict(TokenConverter):
- """Converter to return a repetitive expression as a list, but also
- as a dictionary. Each element can also be referenced using the first
- token in the expression as its key. Useful for tabular report
- scraping when the first column can be used as a item key.
-
- The optional ``asdict`` argument when set to True will return the
- parsed tokens as a Python dict instead of a pyparsing ParseResults.
-
- Example::
-
- data_word = Word(alphas)
- label = data_word + FollowedBy(':')
-
- text = "shape: SQUARE posn: upper left color: light blue texture: burlap"
- attr_expr = (label + Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join))
-
- # print attributes as plain groups
- print(attr_expr[1, ...].parse_string(text).dump())
-
- # instead of OneOrMore(expr), parse using Dict(Group(expr)[1, ...]) - Dict will auto-assign names
- result = Dict(Group(attr_expr)[1, ...]).parse_string(text)
- print(result.dump())
-
- # access named fields as dict entries, or output as dict
- print(result['shape'])
- print(result.as_dict())
-
- prints::
-
- ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap']
- [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']]
- - color: 'light blue'
- - posn: 'upper left'
- - shape: 'SQUARE'
- - texture: 'burlap'
- SQUARE
- {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'}
-
- See more examples at :class:`ParseResults` of accessing fields by results name.
- """
-
- def __init__(self, expr: ParserElement, asdict: bool = False):
- super().__init__(expr)
- self.saveAsList = True
- self._asPythonDict = asdict
-
- def postParse(self, instring, loc, tokenlist):
- for i, tok in enumerate(tokenlist):
- if len(tok) == 0:
- continue
-
- ikey = tok[0]
- if isinstance(ikey, int):
- ikey = str(ikey).strip()
-
- if len(tok) == 1:
- tokenlist[ikey] = _ParseResultsWithOffset("", i)
-
- elif len(tok) == 2 and not isinstance(tok[1], ParseResults):
- tokenlist[ikey] = _ParseResultsWithOffset(tok[1], i)
-
- else:
- try:
- dictvalue = tok.copy() # ParseResults(i)
- except Exception:
- exc = TypeError(
- "could not extract dict values from parsed results"
- " - Dict expression must contain Grouped expressions"
- )
- raise exc from None
-
- del dictvalue[0]
-
- if len(dictvalue) != 1 or (
- isinstance(dictvalue, ParseResults) and dictvalue.haskeys()
- ):
- tokenlist[ikey] = _ParseResultsWithOffset(dictvalue, i)
- else:
- tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0], i)
-
- if self._asPythonDict:
- return [tokenlist.as_dict()] if self.resultsName else tokenlist.as_dict()
- else:
- return [tokenlist] if self.resultsName else tokenlist
-
-
-class Suppress(TokenConverter):
- """Converter for ignoring the results of a parsed expression.
-
- Example::
-
- source = "a, b, c,d"
- wd = Word(alphas)
- wd_list1 = wd + (',' + wd)[...]
- print(wd_list1.parse_string(source))
-
- # often, delimiters that are useful during parsing are just in the
- # way afterward - use Suppress to keep them out of the parsed output
- wd_list2 = wd + (Suppress(',') + wd)[...]
- print(wd_list2.parse_string(source))
-
- # Skipped text (using '...') can be suppressed as well
- source = "lead in START relevant text END trailing text"
- start_marker = Keyword("START")
- end_marker = Keyword("END")
- find_body = Suppress(...) + start_marker + ... + end_marker
- print(find_body.parse_string(source)
-
- prints::
-
- ['a', ',', 'b', ',', 'c', ',', 'd']
- ['a', 'b', 'c', 'd']
- ['START', 'relevant text ', 'END']
-
- (See also :class:`DelimitedList`.)
- """
-
- def __init__(self, expr: Union[ParserElement, str], savelist: bool = False):
- if expr is ...:
- expr = _PendingSkip(NoMatch())
- super().__init__(expr)
-
- def __add__(self, other) -> "ParserElement":
- if isinstance(self.expr, _PendingSkip):
- return Suppress(SkipTo(other)) + other
- else:
- return super().__add__(other)
-
- def __sub__(self, other) -> "ParserElement":
- if isinstance(self.expr, _PendingSkip):
- return Suppress(SkipTo(other)) - other
- else:
- return super().__sub__(other)
-
- def postParse(self, instring, loc, tokenlist):
- return []
-
- def suppress(self) -> ParserElement:
- return self
-
-
-def trace_parse_action(f: ParseAction) -> ParseAction:
- """Decorator for debugging parse actions.
-
- When the parse action is called, this decorator will print
- ``">> entering method-name(line:<current_source_line>, <parse_location>, <matched_tokens>)"``.
- When the parse action completes, the decorator will print
- ``"<<"`` followed by the returned value, or any exception that the parse action raised.
-
- Example::
-
- wd = Word(alphas)
-
- @trace_parse_action
- def remove_duplicate_chars(tokens):
- return ''.join(sorted(set(''.join(tokens))))
-
- wds = wd[1, ...].set_parse_action(remove_duplicate_chars)
- print(wds.parse_string("slkdjs sld sldd sdlf sdljf"))
-
- prints::
-
- >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {}))
- <<leaving remove_duplicate_chars (ret: 'dfjkls')
- ['dfjkls']
- """
- f = _trim_arity(f)
-
- def z(*paArgs):
- thisFunc = f.__name__
- s, l, t = paArgs[-3:]
- if len(paArgs) > 3:
- thisFunc = paArgs[0].__class__.__name__ + "." + thisFunc
- sys.stderr.write(f">>entering {thisFunc}(line: {line(l, s)!r}, {l}, {t!r})\n")
- try:
- ret = f(*paArgs)
- except Exception as exc:
- sys.stderr.write(f"<<leaving {thisFunc} (exception: {exc})\n")
- raise
- sys.stderr.write(f"<<leaving {thisFunc} (ret: {ret!r})\n")
- return ret
-
- z.__name__ = f.__name__
- return z
-
-
-# convenience constants for positional expressions
-empty = Empty().set_name("empty")
-line_start = LineStart().set_name("line_start")
-line_end = LineEnd().set_name("line_end")
-string_start = StringStart().set_name("string_start")
-string_end = StringEnd().set_name("string_end")
-
-_escapedPunc = Regex(r"\\[\\[\]\/\-\*\.\$\+\^\?()~ ]").set_parse_action(
- lambda s, l, t: t[0][1]
-)
-_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").set_parse_action(
- lambda s, l, t: chr(int(t[0].lstrip(r"\0x"), 16))
-)
-_escapedOctChar = Regex(r"\\0[0-7]+").set_parse_action(
- lambda s, l, t: chr(int(t[0][1:], 8))
-)
-_singleChar = (
- _escapedPunc | _escapedHexChar | _escapedOctChar | CharsNotIn(r"\]", exact=1)
-)
-_charRange = Group(_singleChar + Suppress("-") + _singleChar)
-_reBracketExpr = (
- Literal("[")
- + Opt("^").set_results_name("negate")
- + Group(OneOrMore(_charRange | _singleChar)).set_results_name("body")
- + Literal("]")
-)
-
-
-def srange(s: str) -> str:
- r"""Helper to easily define string ranges for use in :class:`Word`
- construction. Borrows syntax from regexp ``'[]'`` string range
- definitions::
-
- srange("[0-9]") -> "0123456789"
- srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz"
- srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_"
-
- The input string must be enclosed in []'s, and the returned string
- is the expanded character set joined into a single string. The
- values enclosed in the []'s may be:
-
- - a single character
- - an escaped character with a leading backslash (such as ``\-``
- or ``\]``)
- - an escaped hex character with a leading ``'\x'``
- (``\x21``, which is a ``'!'`` character) (``\0x##``
- is also supported for backwards compatibility)
- - an escaped octal character with a leading ``'\0'``
- (``\041``, which is a ``'!'`` character)
- - a range of any of the above, separated by a dash (``'a-z'``,
- etc.)
- - any combination of the above (``'aeiouy'``,
- ``'a-zA-Z0-9_$'``, etc.)
- """
- _expanded = (
- lambda p: p
- if not isinstance(p, ParseResults)
- else "".join(chr(c) for c in range(ord(p[0]), ord(p[1]) + 1))
- )
- try:
- return "".join(_expanded(part) for part in _reBracketExpr.parse_string(s).body)
- except Exception as e:
- return ""
-
-
-def token_map(func, *args) -> ParseAction:
- """Helper to define a parse action by mapping a function to all
- elements of a :class:`ParseResults` list. If any additional args are passed,
- they are forwarded to the given function as additional arguments
- after the token, as in
- ``hex_integer = Word(hexnums).set_parse_action(token_map(int, 16))``,
- which will convert the parsed data to an integer using base 16.
-
- Example (compare the last to example in :class:`ParserElement.transform_string`::
-
- hex_ints = Word(hexnums)[1, ...].set_parse_action(token_map(int, 16))
- hex_ints.run_tests('''
- 00 11 22 aa FF 0a 0d 1a
- ''')
-
- upperword = Word(alphas).set_parse_action(token_map(str.upper))
- upperword[1, ...].run_tests('''
- my kingdom for a horse
- ''')
-
- wd = Word(alphas).set_parse_action(token_map(str.title))
- wd[1, ...].set_parse_action(' '.join).run_tests('''
- now is the winter of our discontent made glorious summer by this sun of york
- ''')
-
- prints::
-
- 00 11 22 aa FF 0a 0d 1a
- [0, 17, 34, 170, 255, 10, 13, 26]
-
- my kingdom for a horse
- ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE']
-
- now is the winter of our discontent made glorious summer by this sun of york
- ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York']
- """
-
- def pa(s, l, t):
- return [func(tokn, *args) for tokn in t]
-
- func_name = getattr(func, "__name__", getattr(func, "__class__").__name__)
- pa.__name__ = func_name
-
- return pa
-
-
-def autoname_elements() -> None:
- """
- Utility to simplify mass-naming of parser elements, for
- generating railroad diagram with named subdiagrams.
- """
- calling_frame = sys._getframe().f_back
- if calling_frame is None:
- return
- calling_frame = typing.cast(types.FrameType, calling_frame)
- for name, var in calling_frame.f_locals.items():
- if isinstance(var, ParserElement) and not var.customName:
- var.set_name(name)
-
-
-dbl_quoted_string = Combine(
- Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*') + '"'
-).set_name("string enclosed in double quotes")
-
-sgl_quoted_string = Combine(
- Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*") + "'"
-).set_name("string enclosed in single quotes")
-
-quoted_string = Combine(
- (Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*') + '"').set_name(
- "double quoted string"
- )
- | (Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*") + "'").set_name(
- "single quoted string"
- )
-).set_name("quoted string using single or double quotes")
-
-python_quoted_string = Combine(
- (Regex(r'"""(?:[^"\\]|""(?!")|"(?!"")|\\.)*', flags=re.MULTILINE) + '"""').set_name(
- "multiline double quoted string"
- )
- ^ (
- Regex(r"'''(?:[^'\\]|''(?!')|'(?!'')|\\.)*", flags=re.MULTILINE) + "'''"
- ).set_name("multiline single quoted string")
- ^ (Regex(r'"(?:[^"\n\r\\]|(?:\\")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*') + '"').set_name(
- "double quoted string"
- )
- ^ (Regex(r"'(?:[^'\n\r\\]|(?:\\')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*") + "'").set_name(
- "single quoted string"
- )
-).set_name("Python quoted string")
-
-unicode_string = Combine("u" + quoted_string.copy()).set_name("unicode string literal")
-
-
-alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]")
-punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]")
-
-# build list of built-in expressions, for future reference if a global default value
-# gets updated
-_builtin_exprs: List[ParserElement] = [
- v for v in vars().values() if isinstance(v, ParserElement)
-]
-
-# backward compatibility names
-# fmt: off
-sglQuotedString = sgl_quoted_string
-dblQuotedString = dbl_quoted_string
-quotedString = quoted_string
-unicodeString = unicode_string
-lineStart = line_start
-lineEnd = line_end
-stringStart = string_start
-stringEnd = string_end
-
-@replaced_by_pep8(null_debug_action)
-def nullDebugAction(): ...
-
-@replaced_by_pep8(trace_parse_action)
-def traceParseAction(): ...
-
-@replaced_by_pep8(condition_as_parse_action)
-def conditionAsParseAction(): ...
-
-@replaced_by_pep8(token_map)
-def tokenMap(): ...
-# fmt: on
diff --git a/contrib/python/pip/pip/_vendor/pyparsing/diagram/__init__.py b/contrib/python/pip/pip/_vendor/pyparsing/diagram/__init__.py
deleted file mode 100644
index 83f9018ee9..0000000000
--- a/contrib/python/pip/pip/_vendor/pyparsing/diagram/__init__.py
+++ /dev/null
@@ -1,656 +0,0 @@
-# mypy: ignore-errors
-import railroad
-from pip._vendor import pyparsing
-import typing
-from typing import (
- List,
- NamedTuple,
- Generic,
- TypeVar,
- Dict,
- Callable,
- Set,
- Iterable,
-)
-from jinja2 import Template
-from io import StringIO
-import inspect
-
-
-jinja2_template_source = """\
-{% if not embed %}
-<!DOCTYPE html>
-<html>
-<head>
-{% endif %}
- {% if not head %}
- <style>
- .railroad-heading {
- font-family: monospace;
- }
- </style>
- {% else %}
- {{ head | safe }}
- {% endif %}
-{% if not embed %}
-</head>
-<body>
-{% endif %}
-{{ body | safe }}
-{% for diagram in diagrams %}
- <div class="railroad-group">
- <h1 class="railroad-heading">{{ diagram.title }}</h1>
- <div class="railroad-description">{{ diagram.text }}</div>
- <div class="railroad-svg">
- {{ diagram.svg }}
- </div>
- </div>
-{% endfor %}
-{% if not embed %}
-</body>
-</html>
-{% endif %}
-"""
-
-template = Template(jinja2_template_source)
-
-# Note: ideally this would be a dataclass, but we're supporting Python 3.5+ so we can't do this yet
-NamedDiagram = NamedTuple(
- "NamedDiagram",
- [("name", str), ("diagram", typing.Optional[railroad.DiagramItem]), ("index", int)],
-)
-"""
-A simple structure for associating a name with a railroad diagram
-"""
-
-T = TypeVar("T")
-
-
-class EachItem(railroad.Group):
- """
- Custom railroad item to compose a:
- - Group containing a
- - OneOrMore containing a
- - Choice of the elements in the Each
- with the group label indicating that all must be matched
- """
-
- all_label = "[ALL]"
-
- def __init__(self, *items):
- choice_item = railroad.Choice(len(items) - 1, *items)
- one_or_more_item = railroad.OneOrMore(item=choice_item)
- super().__init__(one_or_more_item, label=self.all_label)
-
-
-class AnnotatedItem(railroad.Group):
- """
- Simple subclass of Group that creates an annotation label
- """
-
- def __init__(self, label: str, item):
- super().__init__(item=item, label="[{}]".format(label) if label else label)
-
-
-class EditablePartial(Generic[T]):
- """
- Acts like a functools.partial, but can be edited. In other words, it represents a type that hasn't yet been
- constructed.
- """
-
- # We need this here because the railroad constructors actually transform the data, so can't be called until the
- # entire tree is assembled
-
- def __init__(self, func: Callable[..., T], args: list, kwargs: dict):
- self.func = func
- self.args = args
- self.kwargs = kwargs
-
- @classmethod
- def from_call(cls, func: Callable[..., T], *args, **kwargs) -> "EditablePartial[T]":
- """
- If you call this function in the same way that you would call the constructor, it will store the arguments
- as you expect. For example EditablePartial.from_call(Fraction, 1, 3)() == Fraction(1, 3)
- """
- return EditablePartial(func=func, args=list(args), kwargs=kwargs)
-
- @property
- def name(self):
- return self.kwargs["name"]
-
- def __call__(self) -> T:
- """
- Evaluate the partial and return the result
- """
- args = self.args.copy()
- kwargs = self.kwargs.copy()
-
- # This is a helpful hack to allow you to specify varargs parameters (e.g. *args) as keyword args (e.g.
- # args=['list', 'of', 'things'])
- arg_spec = inspect.getfullargspec(self.func)
- if arg_spec.varargs in self.kwargs:
- args += kwargs.pop(arg_spec.varargs)
-
- return self.func(*args, **kwargs)
-
-
-def railroad_to_html(diagrams: List[NamedDiagram], embed=False, **kwargs) -> str:
- """
- Given a list of NamedDiagram, produce a single HTML string that visualises those diagrams
- :params kwargs: kwargs to be passed in to the template
- """
- data = []
- for diagram in diagrams:
- if diagram.diagram is None:
- continue
- io = StringIO()
- try:
- css = kwargs.get('css')
- diagram.diagram.writeStandalone(io.write, css=css)
- except AttributeError:
- diagram.diagram.writeSvg(io.write)
- title = diagram.name
- if diagram.index == 0:
- title += " (root)"
- data.append({"title": title, "text": "", "svg": io.getvalue()})
-
- return template.render(diagrams=data, embed=embed, **kwargs)
-
-
-def resolve_partial(partial: "EditablePartial[T]") -> T:
- """
- Recursively resolves a collection of Partials into whatever type they are
- """
- if isinstance(partial, EditablePartial):
- partial.args = resolve_partial(partial.args)
- partial.kwargs = resolve_partial(partial.kwargs)
- return partial()
- elif isinstance(partial, list):
- return [resolve_partial(x) for x in partial]
- elif isinstance(partial, dict):
- return {key: resolve_partial(x) for key, x in partial.items()}
- else:
- return partial
-
-
-def to_railroad(
- element: pyparsing.ParserElement,
- diagram_kwargs: typing.Optional[dict] = None,
- vertical: int = 3,
- show_results_names: bool = False,
- show_groups: bool = False,
-) -> List[NamedDiagram]:
- """
- Convert a pyparsing element tree into a list of diagrams. This is the recommended entrypoint to diagram
- creation if you want to access the Railroad tree before it is converted to HTML
- :param element: base element of the parser being diagrammed
- :param diagram_kwargs: kwargs to pass to the Diagram() constructor
- :param vertical: (optional) - int - limit at which number of alternatives should be
- shown vertically instead of horizontally
- :param show_results_names - bool to indicate whether results name annotations should be
- included in the diagram
- :param show_groups - bool to indicate whether groups should be highlighted with an unlabeled
- surrounding box
- """
- # Convert the whole tree underneath the root
- lookup = ConverterState(diagram_kwargs=diagram_kwargs or {})
- _to_diagram_element(
- element,
- lookup=lookup,
- parent=None,
- vertical=vertical,
- show_results_names=show_results_names,
- show_groups=show_groups,
- )
-
- root_id = id(element)
- # Convert the root if it hasn't been already
- if root_id in lookup:
- if not element.customName:
- lookup[root_id].name = ""
- lookup[root_id].mark_for_extraction(root_id, lookup, force=True)
-
- # Now that we're finished, we can convert from intermediate structures into Railroad elements
- diags = list(lookup.diagrams.values())
- if len(diags) > 1:
- # collapse out duplicate diags with the same name
- seen = set()
- deduped_diags = []
- for d in diags:
- # don't extract SkipTo elements, they are uninformative as subdiagrams
- if d.name == "...":
- continue
- if d.name is not None and d.name not in seen:
- seen.add(d.name)
- deduped_diags.append(d)
- resolved = [resolve_partial(partial) for partial in deduped_diags]
- else:
- # special case - if just one diagram, always display it, even if
- # it has no name
- resolved = [resolve_partial(partial) for partial in diags]
- return sorted(resolved, key=lambda diag: diag.index)
-
-
-def _should_vertical(
- specification: int, exprs: Iterable[pyparsing.ParserElement]
-) -> bool:
- """
- Returns true if we should return a vertical list of elements
- """
- if specification is None:
- return False
- else:
- return len(_visible_exprs(exprs)) >= specification
-
-
-class ElementState:
- """
- State recorded for an individual pyparsing Element
- """
-
- # Note: this should be a dataclass, but we have to support Python 3.5
- def __init__(
- self,
- element: pyparsing.ParserElement,
- converted: EditablePartial,
- parent: EditablePartial,
- number: int,
- name: str = None,
- parent_index: typing.Optional[int] = None,
- ):
- #: The pyparsing element that this represents
- self.element: pyparsing.ParserElement = element
- #: The name of the element
- self.name: typing.Optional[str] = name
- #: The output Railroad element in an unconverted state
- self.converted: EditablePartial = converted
- #: The parent Railroad element, which we store so that we can extract this if it's duplicated
- self.parent: EditablePartial = parent
- #: The order in which we found this element, used for sorting diagrams if this is extracted into a diagram
- self.number: int = number
- #: The index of this inside its parent
- self.parent_index: typing.Optional[int] = parent_index
- #: If true, we should extract this out into a subdiagram
- self.extract: bool = False
- #: If true, all of this element's children have been filled out
- self.complete: bool = False
-
- def mark_for_extraction(
- self, el_id: int, state: "ConverterState", name: str = None, force: bool = False
- ):
- """
- Called when this instance has been seen twice, and thus should eventually be extracted into a sub-diagram
- :param el_id: id of the element
- :param state: element/diagram state tracker
- :param name: name to use for this element's text
- :param force: If true, force extraction now, regardless of the state of this. Only useful for extracting the
- root element when we know we're finished
- """
- self.extract = True
-
- # Set the name
- if not self.name:
- if name:
- # Allow forcing a custom name
- self.name = name
- elif self.element.customName:
- self.name = self.element.customName
- else:
- self.name = ""
-
- # Just because this is marked for extraction doesn't mean we can do it yet. We may have to wait for children
- # to be added
- # Also, if this is just a string literal etc, don't bother extracting it
- if force or (self.complete and _worth_extracting(self.element)):
- state.extract_into_diagram(el_id)
-
-
-class ConverterState:
- """
- Stores some state that persists between recursions into the element tree
- """
-
- def __init__(self, diagram_kwargs: typing.Optional[dict] = None):
- #: A dictionary mapping ParserElements to state relating to them
- self._element_diagram_states: Dict[int, ElementState] = {}
- #: A dictionary mapping ParserElement IDs to subdiagrams generated from them
- self.diagrams: Dict[int, EditablePartial[NamedDiagram]] = {}
- #: The index of the next unnamed element
- self.unnamed_index: int = 1
- #: The index of the next element. This is used for sorting
- self.index: int = 0
- #: Shared kwargs that are used to customize the construction of diagrams
- self.diagram_kwargs: dict = diagram_kwargs or {}
- self.extracted_diagram_names: Set[str] = set()
-
- def __setitem__(self, key: int, value: ElementState):
- self._element_diagram_states[key] = value
-
- def __getitem__(self, key: int) -> ElementState:
- return self._element_diagram_states[key]
-
- def __delitem__(self, key: int):
- del self._element_diagram_states[key]
-
- def __contains__(self, key: int):
- return key in self._element_diagram_states
-
- def generate_unnamed(self) -> int:
- """
- Generate a number used in the name of an otherwise unnamed diagram
- """
- self.unnamed_index += 1
- return self.unnamed_index
-
- def generate_index(self) -> int:
- """
- Generate a number used to index a diagram
- """
- self.index += 1
- return self.index
-
- def extract_into_diagram(self, el_id: int):
- """
- Used when we encounter the same token twice in the same tree. When this
- happens, we replace all instances of that token with a terminal, and
- create a new subdiagram for the token
- """
- position = self[el_id]
-
- # Replace the original definition of this element with a regular block
- if position.parent:
- ret = EditablePartial.from_call(railroad.NonTerminal, text=position.name)
- if "item" in position.parent.kwargs:
- position.parent.kwargs["item"] = ret
- elif "items" in position.parent.kwargs:
- position.parent.kwargs["items"][position.parent_index] = ret
-
- # If the element we're extracting is a group, skip to its content but keep the title
- if position.converted.func == railroad.Group:
- content = position.converted.kwargs["item"]
- else:
- content = position.converted
-
- self.diagrams[el_id] = EditablePartial.from_call(
- NamedDiagram,
- name=position.name,
- diagram=EditablePartial.from_call(
- railroad.Diagram, content, **self.diagram_kwargs
- ),
- index=position.number,
- )
-
- del self[el_id]
-
-
-def _worth_extracting(element: pyparsing.ParserElement) -> bool:
- """
- Returns true if this element is worth having its own sub-diagram. Simply, if any of its children
- themselves have children, then its complex enough to extract
- """
- children = element.recurse()
- return any(child.recurse() for child in children)
-
-
-def _apply_diagram_item_enhancements(fn):
- """
- decorator to ensure enhancements to a diagram item (such as results name annotations)
- get applied on return from _to_diagram_element (we do this since there are several
- returns in _to_diagram_element)
- """
-
- def _inner(
- element: pyparsing.ParserElement,
- parent: typing.Optional[EditablePartial],
- lookup: ConverterState = None,
- vertical: int = None,
- index: int = 0,
- name_hint: str = None,
- show_results_names: bool = False,
- show_groups: bool = False,
- ) -> typing.Optional[EditablePartial]:
- ret = fn(
- element,
- parent,
- lookup,
- vertical,
- index,
- name_hint,
- show_results_names,
- show_groups,
- )
-
- # apply annotation for results name, if present
- if show_results_names and ret is not None:
- element_results_name = element.resultsName
- if element_results_name:
- # add "*" to indicate if this is a "list all results" name
- element_results_name += "" if element.modalResults else "*"
- ret = EditablePartial.from_call(
- railroad.Group, item=ret, label=element_results_name
- )
-
- return ret
-
- return _inner
-
-
-def _visible_exprs(exprs: Iterable[pyparsing.ParserElement]):
- non_diagramming_exprs = (
- pyparsing.ParseElementEnhance,
- pyparsing.PositionToken,
- pyparsing.And._ErrorStop,
- )
- return [
- e
- for e in exprs
- if not (e.customName or e.resultsName or isinstance(e, non_diagramming_exprs))
- ]
-
-
-@_apply_diagram_item_enhancements
-def _to_diagram_element(
- element: pyparsing.ParserElement,
- parent: typing.Optional[EditablePartial],
- lookup: ConverterState = None,
- vertical: int = None,
- index: int = 0,
- name_hint: str = None,
- show_results_names: bool = False,
- show_groups: bool = False,
-) -> typing.Optional[EditablePartial]:
- """
- Recursively converts a PyParsing Element to a railroad Element
- :param lookup: The shared converter state that keeps track of useful things
- :param index: The index of this element within the parent
- :param parent: The parent of this element in the output tree
- :param vertical: Controls at what point we make a list of elements vertical. If this is an integer (the default),
- it sets the threshold of the number of items before we go vertical. If True, always go vertical, if False, never
- do so
- :param name_hint: If provided, this will override the generated name
- :param show_results_names: bool flag indicating whether to add annotations for results names
- :returns: The converted version of the input element, but as a Partial that hasn't yet been constructed
- :param show_groups: bool flag indicating whether to show groups using bounding box
- """
- exprs = element.recurse()
- name = name_hint or element.customName or element.__class__.__name__
-
- # Python's id() is used to provide a unique identifier for elements
- el_id = id(element)
-
- element_results_name = element.resultsName
-
- # Here we basically bypass processing certain wrapper elements if they contribute nothing to the diagram
- if not element.customName:
- if isinstance(
- element,
- (
- # pyparsing.TokenConverter,
- # pyparsing.Forward,
- pyparsing.Located,
- ),
- ):
- # However, if this element has a useful custom name, and its child does not, we can pass it on to the child
- if exprs:
- if not exprs[0].customName:
- propagated_name = name
- else:
- propagated_name = None
-
- return _to_diagram_element(
- element.expr,
- parent=parent,
- lookup=lookup,
- vertical=vertical,
- index=index,
- name_hint=propagated_name,
- show_results_names=show_results_names,
- show_groups=show_groups,
- )
-
- # If the element isn't worth extracting, we always treat it as the first time we say it
- if _worth_extracting(element):
- if el_id in lookup:
- # If we've seen this element exactly once before, we are only just now finding out that it's a duplicate,
- # so we have to extract it into a new diagram.
- looked_up = lookup[el_id]
- looked_up.mark_for_extraction(el_id, lookup, name=name_hint)
- ret = EditablePartial.from_call(railroad.NonTerminal, text=looked_up.name)
- return ret
-
- elif el_id in lookup.diagrams:
- # If we have seen the element at least twice before, and have already extracted it into a subdiagram, we
- # just put in a marker element that refers to the sub-diagram
- ret = EditablePartial.from_call(
- railroad.NonTerminal, text=lookup.diagrams[el_id].kwargs["name"]
- )
- return ret
-
- # Recursively convert child elements
- # Here we find the most relevant Railroad element for matching pyparsing Element
- # We use ``items=[]`` here to hold the place for where the child elements will go once created
- if isinstance(element, pyparsing.And):
- # detect And's created with ``expr*N`` notation - for these use a OneOrMore with a repeat
- # (all will have the same name, and resultsName)
- if not exprs:
- return None
- if len(set((e.name, e.resultsName) for e in exprs)) == 1:
- ret = EditablePartial.from_call(
- railroad.OneOrMore, item="", repeat=str(len(exprs))
- )
- elif _should_vertical(vertical, exprs):
- ret = EditablePartial.from_call(railroad.Stack, items=[])
- else:
- ret = EditablePartial.from_call(railroad.Sequence, items=[])
- elif isinstance(element, (pyparsing.Or, pyparsing.MatchFirst)):
- if not exprs:
- return None
- if _should_vertical(vertical, exprs):
- ret = EditablePartial.from_call(railroad.Choice, 0, items=[])
- else:
- ret = EditablePartial.from_call(railroad.HorizontalChoice, items=[])
- elif isinstance(element, pyparsing.Each):
- if not exprs:
- return None
- ret = EditablePartial.from_call(EachItem, items=[])
- elif isinstance(element, pyparsing.NotAny):
- ret = EditablePartial.from_call(AnnotatedItem, label="NOT", item="")
- elif isinstance(element, pyparsing.FollowedBy):
- ret = EditablePartial.from_call(AnnotatedItem, label="LOOKAHEAD", item="")
- elif isinstance(element, pyparsing.PrecededBy):
- ret = EditablePartial.from_call(AnnotatedItem, label="LOOKBEHIND", item="")
- elif isinstance(element, pyparsing.Group):
- if show_groups:
- ret = EditablePartial.from_call(AnnotatedItem, label="", item="")
- else:
- ret = EditablePartial.from_call(railroad.Group, label="", item="")
- elif isinstance(element, pyparsing.TokenConverter):
- label = type(element).__name__.lower()
- if label == "tokenconverter":
- ret = EditablePartial.from_call(railroad.Sequence, items=[])
- else:
- ret = EditablePartial.from_call(AnnotatedItem, label=label, item="")
- elif isinstance(element, pyparsing.Opt):
- ret = EditablePartial.from_call(railroad.Optional, item="")
- elif isinstance(element, pyparsing.OneOrMore):
- ret = EditablePartial.from_call(railroad.OneOrMore, item="")
- elif isinstance(element, pyparsing.ZeroOrMore):
- ret = EditablePartial.from_call(railroad.ZeroOrMore, item="")
- elif isinstance(element, pyparsing.Group):
- ret = EditablePartial.from_call(
- railroad.Group, item=None, label=element_results_name
- )
- elif isinstance(element, pyparsing.Empty) and not element.customName:
- # Skip unnamed "Empty" elements
- ret = None
- elif isinstance(element, pyparsing.ParseElementEnhance):
- ret = EditablePartial.from_call(railroad.Sequence, items=[])
- elif len(exprs) > 0 and not element_results_name:
- ret = EditablePartial.from_call(railroad.Group, item="", label=name)
- elif len(exprs) > 0:
- ret = EditablePartial.from_call(railroad.Sequence, items=[])
- else:
- terminal = EditablePartial.from_call(railroad.Terminal, element.defaultName)
- ret = terminal
-
- if ret is None:
- return
-
- # Indicate this element's position in the tree so we can extract it if necessary
- lookup[el_id] = ElementState(
- element=element,
- converted=ret,
- parent=parent,
- parent_index=index,
- number=lookup.generate_index(),
- )
- if element.customName:
- lookup[el_id].mark_for_extraction(el_id, lookup, element.customName)
-
- i = 0
- for expr in exprs:
- # Add a placeholder index in case we have to extract the child before we even add it to the parent
- if "items" in ret.kwargs:
- ret.kwargs["items"].insert(i, None)
-
- item = _to_diagram_element(
- expr,
- parent=ret,
- lookup=lookup,
- vertical=vertical,
- index=i,
- show_results_names=show_results_names,
- show_groups=show_groups,
- )
-
- # Some elements don't need to be shown in the diagram
- if item is not None:
- if "item" in ret.kwargs:
- ret.kwargs["item"] = item
- elif "items" in ret.kwargs:
- # If we've already extracted the child, don't touch this index, since it's occupied by a nonterminal
- ret.kwargs["items"][i] = item
- i += 1
- elif "items" in ret.kwargs:
- # If we're supposed to skip this element, remove it from the parent
- del ret.kwargs["items"][i]
-
- # If all this items children are none, skip this item
- if ret and (
- ("items" in ret.kwargs and len(ret.kwargs["items"]) == 0)
- or ("item" in ret.kwargs and ret.kwargs["item"] is None)
- ):
- ret = EditablePartial.from_call(railroad.Terminal, name)
-
- # Mark this element as "complete", ie it has all of its children
- if el_id in lookup:
- lookup[el_id].complete = True
-
- if el_id in lookup and lookup[el_id].extract and lookup[el_id].complete:
- lookup.extract_into_diagram(el_id)
- if ret is not None:
- ret = EditablePartial.from_call(
- railroad.NonTerminal, text=lookup.diagrams[el_id].kwargs["name"]
- )
-
- return ret
diff --git a/contrib/python/pip/pip/_vendor/pyparsing/exceptions.py b/contrib/python/pip/pip/_vendor/pyparsing/exceptions.py
deleted file mode 100644
index 12219f124a..0000000000
--- a/contrib/python/pip/pip/_vendor/pyparsing/exceptions.py
+++ /dev/null
@@ -1,299 +0,0 @@
-# exceptions.py
-
-import re
-import sys
-import typing
-
-from .util import (
- col,
- line,
- lineno,
- _collapse_string_to_ranges,
- replaced_by_pep8,
-)
-from .unicode import pyparsing_unicode as ppu
-
-
-class ExceptionWordUnicode(ppu.Latin1, ppu.LatinA, ppu.LatinB, ppu.Greek, ppu.Cyrillic):
- pass
-
-
-_extract_alphanums = _collapse_string_to_ranges(ExceptionWordUnicode.alphanums)
-_exception_word_extractor = re.compile("([" + _extract_alphanums + "]{1,16})|.")
-
-
-class ParseBaseException(Exception):
- """base exception class for all parsing runtime exceptions"""
-
- loc: int
- msg: str
- pstr: str
- parser_element: typing.Any # "ParserElement"
- args: typing.Tuple[str, int, typing.Optional[str]]
-
- __slots__ = (
- "loc",
- "msg",
- "pstr",
- "parser_element",
- "args",
- )
-
- # Performance tuning: we construct a *lot* of these, so keep this
- # constructor as small and fast as possible
- def __init__(
- self,
- pstr: str,
- loc: int = 0,
- msg: typing.Optional[str] = None,
- elem=None,
- ):
- self.loc = loc
- if msg is None:
- self.msg = pstr
- self.pstr = ""
- else:
- self.msg = msg
- self.pstr = pstr
- self.parser_element = elem
- self.args = (pstr, loc, msg)
-
- @staticmethod
- def explain_exception(exc, depth=16):
- """
- Method to take an exception and translate the Python internal traceback into a list
- of the pyparsing expressions that caused the exception to be raised.
-
- Parameters:
-
- - exc - exception raised during parsing (need not be a ParseException, in support
- of Python exceptions that might be raised in a parse action)
- - depth (default=16) - number of levels back in the stack trace to list expression
- and function names; if None, the full stack trace names will be listed; if 0, only
- the failing input line, marker, and exception string will be shown
-
- Returns a multi-line string listing the ParserElements and/or function names in the
- exception's stack trace.
- """
- import inspect
- from .core import ParserElement
-
- if depth is None:
- depth = sys.getrecursionlimit()
- ret = []
- if isinstance(exc, ParseBaseException):
- ret.append(exc.line)
- ret.append(" " * (exc.column - 1) + "^")
- ret.append(f"{type(exc).__name__}: {exc}")
-
- if depth > 0:
- callers = inspect.getinnerframes(exc.__traceback__, context=depth)
- seen = set()
- for i, ff in enumerate(callers[-depth:]):
- frm = ff[0]
-
- f_self = frm.f_locals.get("self", None)
- if isinstance(f_self, ParserElement):
- if not frm.f_code.co_name.startswith(
- ("parseImpl", "_parseNoCache")
- ):
- continue
- if id(f_self) in seen:
- continue
- seen.add(id(f_self))
-
- self_type = type(f_self)
- ret.append(
- f"{self_type.__module__}.{self_type.__name__} - {f_self}"
- )
-
- elif f_self is not None:
- self_type = type(f_self)
- ret.append(f"{self_type.__module__}.{self_type.__name__}")
-
- else:
- code = frm.f_code
- if code.co_name in ("wrapper", "<module>"):
- continue
-
- ret.append(code.co_name)
-
- depth -= 1
- if not depth:
- break
-
- return "\n".join(ret)
-
- @classmethod
- def _from_exception(cls, pe):
- """
- internal factory method to simplify creating one type of ParseException
- from another - avoids having __init__ signature conflicts among subclasses
- """
- return cls(pe.pstr, pe.loc, pe.msg, pe.parser_element)
-
- @property
- def line(self) -> str:
- """
- Return the line of text where the exception occurred.
- """
- return line(self.loc, self.pstr)
-
- @property
- def lineno(self) -> int:
- """
- Return the 1-based line number of text where the exception occurred.
- """
- return lineno(self.loc, self.pstr)
-
- @property
- def col(self) -> int:
- """
- Return the 1-based column on the line of text where the exception occurred.
- """
- return col(self.loc, self.pstr)
-
- @property
- def column(self) -> int:
- """
- Return the 1-based column on the line of text where the exception occurred.
- """
- return col(self.loc, self.pstr)
-
- # pre-PEP8 compatibility
- @property
- def parserElement(self):
- return self.parser_element
-
- @parserElement.setter
- def parserElement(self, elem):
- self.parser_element = elem
-
- def __str__(self) -> str:
- if self.pstr:
- if self.loc >= len(self.pstr):
- foundstr = ", found end of text"
- else:
- # pull out next word at error location
- found_match = _exception_word_extractor.match(self.pstr, self.loc)
- if found_match is not None:
- found = found_match.group(0)
- else:
- found = self.pstr[self.loc : self.loc + 1]
- foundstr = (", found %r" % found).replace(r"\\", "\\")
- else:
- foundstr = ""
- return f"{self.msg}{foundstr} (at char {self.loc}), (line:{self.lineno}, col:{self.column})"
-
- def __repr__(self):
- return str(self)
-
- def mark_input_line(
- self, marker_string: typing.Optional[str] = None, *, markerString: str = ">!<"
- ) -> str:
- """
- Extracts the exception line from the input string, and marks
- the location of the exception with a special symbol.
- """
- markerString = marker_string if marker_string is not None else markerString
- line_str = self.line
- line_column = self.column - 1
- if markerString:
- line_str = "".join(
- (line_str[:line_column], markerString, line_str[line_column:])
- )
- return line_str.strip()
-
- def explain(self, depth=16) -> str:
- """
- Method to translate the Python internal traceback into a list
- of the pyparsing expressions that caused the exception to be raised.
-
- Parameters:
-
- - depth (default=16) - number of levels back in the stack trace to list expression
- and function names; if None, the full stack trace names will be listed; if 0, only
- the failing input line, marker, and exception string will be shown
-
- Returns a multi-line string listing the ParserElements and/or function names in the
- exception's stack trace.
-
- Example::
-
- expr = pp.Word(pp.nums) * 3
- try:
- expr.parse_string("123 456 A789")
- except pp.ParseException as pe:
- print(pe.explain(depth=0))
-
- prints::
-
- 123 456 A789
- ^
- ParseException: Expected W:(0-9), found 'A' (at char 8), (line:1, col:9)
-
- Note: the diagnostic output will include string representations of the expressions
- that failed to parse. These representations will be more helpful if you use `set_name` to
- give identifiable names to your expressions. Otherwise they will use the default string
- forms, which may be cryptic to read.
-
- Note: pyparsing's default truncation of exception tracebacks may also truncate the
- stack of expressions that are displayed in the ``explain`` output. To get the full listing
- of parser expressions, you may have to set ``ParserElement.verbose_stacktrace = True``
- """
- return self.explain_exception(self, depth)
-
- # fmt: off
- @replaced_by_pep8(mark_input_line)
- def markInputline(self): ...
- # fmt: on
-
-
-class ParseException(ParseBaseException):
- """
- Exception thrown when a parse expression doesn't match the input string
-
- Example::
-
- try:
- Word(nums).set_name("integer").parse_string("ABC")
- except ParseException as pe:
- print(pe)
- print("column: {}".format(pe.column))
-
- prints::
-
- Expected integer (at char 0), (line:1, col:1)
- column: 1
-
- """
-
-
-class ParseFatalException(ParseBaseException):
- """
- User-throwable exception thrown when inconsistent parse content
- is found; stops all parsing immediately
- """
-
-
-class ParseSyntaxException(ParseFatalException):
- """
- Just like :class:`ParseFatalException`, but thrown internally
- when an :class:`ErrorStop<And._ErrorStop>` ('-' operator) indicates
- that parsing is to stop immediately because an unbacktrackable
- syntax error has been found.
- """
-
-
-class RecursiveGrammarException(Exception):
- """
- Exception thrown by :class:`ParserElement.validate` if the
- grammar could be left-recursive; parser may need to enable
- left recursion using :class:`ParserElement.enable_left_recursion<ParserElement.enable_left_recursion>`
- """
-
- def __init__(self, parseElementList):
- self.parseElementTrace = parseElementList
-
- def __str__(self) -> str:
- return f"RecursiveGrammarException: {self.parseElementTrace}"
diff --git a/contrib/python/pip/pip/_vendor/pyparsing/helpers.py b/contrib/python/pip/pip/_vendor/pyparsing/helpers.py
deleted file mode 100644
index 018f0d6ac8..0000000000
--- a/contrib/python/pip/pip/_vendor/pyparsing/helpers.py
+++ /dev/null
@@ -1,1100 +0,0 @@
-# helpers.py
-import html.entities
-import re
-import sys
-import typing
-
-from . import __diag__
-from .core import *
-from .util import (
- _bslash,
- _flatten,
- _escape_regex_range_chars,
- replaced_by_pep8,
-)
-
-
-#
-# global helpers
-#
-def counted_array(
- expr: ParserElement,
- int_expr: typing.Optional[ParserElement] = None,
- *,
- intExpr: typing.Optional[ParserElement] = None,
-) -> ParserElement:
- """Helper to define a counted list of expressions.
-
- This helper defines a pattern of the form::
-
- integer expr expr expr...
-
- where the leading integer tells how many expr expressions follow.
- The matched tokens returns the array of expr tokens as a list - the
- leading count token is suppressed.
-
- If ``int_expr`` is specified, it should be a pyparsing expression
- that produces an integer value.
-
- Example::
-
- counted_array(Word(alphas)).parse_string('2 ab cd ef') # -> ['ab', 'cd']
-
- # in this parser, the leading integer value is given in binary,
- # '10' indicating that 2 values are in the array
- binary_constant = Word('01').set_parse_action(lambda t: int(t[0], 2))
- counted_array(Word(alphas), int_expr=binary_constant).parse_string('10 ab cd ef') # -> ['ab', 'cd']
-
- # if other fields must be parsed after the count but before the
- # list items, give the fields results names and they will
- # be preserved in the returned ParseResults:
- count_with_metadata = integer + Word(alphas)("type")
- typed_array = counted_array(Word(alphanums), int_expr=count_with_metadata)("items")
- result = typed_array.parse_string("3 bool True True False")
- print(result.dump())
-
- # prints
- # ['True', 'True', 'False']
- # - items: ['True', 'True', 'False']
- # - type: 'bool'
- """
- intExpr = intExpr or int_expr
- array_expr = Forward()
-
- def count_field_parse_action(s, l, t):
- nonlocal array_expr
- n = t[0]
- array_expr <<= (expr * n) if n else Empty()
- # clear list contents, but keep any named results
- del t[:]
-
- if intExpr is None:
- intExpr = Word(nums).set_parse_action(lambda t: int(t[0]))
- else:
- intExpr = intExpr.copy()
- intExpr.set_name("arrayLen")
- intExpr.add_parse_action(count_field_parse_action, call_during_try=True)
- return (intExpr + array_expr).set_name("(len) " + str(expr) + "...")
-
-
-def match_previous_literal(expr: ParserElement) -> ParserElement:
- """Helper to define an expression that is indirectly defined from
- the tokens matched in a previous expression, that is, it looks for
- a 'repeat' of a previous expression. For example::
-
- first = Word(nums)
- second = match_previous_literal(first)
- match_expr = first + ":" + second
-
- will match ``"1:1"``, but not ``"1:2"``. Because this
- matches a previous literal, will also match the leading
- ``"1:1"`` in ``"1:10"``. If this is not desired, use
- :class:`match_previous_expr`. Do *not* use with packrat parsing
- enabled.
- """
- rep = Forward()
-
- def copy_token_to_repeater(s, l, t):
- if t:
- if len(t) == 1:
- rep << t[0]
- else:
- # flatten t tokens
- tflat = _flatten(t.as_list())
- rep << And(Literal(tt) for tt in tflat)
- else:
- rep << Empty()
-
- expr.add_parse_action(copy_token_to_repeater, callDuringTry=True)
- rep.set_name("(prev) " + str(expr))
- return rep
-
-
-def match_previous_expr(expr: ParserElement) -> ParserElement:
- """Helper to define an expression that is indirectly defined from
- the tokens matched in a previous expression, that is, it looks for
- a 'repeat' of a previous expression. For example::
-
- first = Word(nums)
- second = match_previous_expr(first)
- match_expr = first + ":" + second
-
- will match ``"1:1"``, but not ``"1:2"``. Because this
- matches by expressions, will *not* match the leading ``"1:1"``
- in ``"1:10"``; the expressions are evaluated first, and then
- compared, so ``"1"`` is compared with ``"10"``. Do *not* use
- with packrat parsing enabled.
- """
- rep = Forward()
- e2 = expr.copy()
- rep <<= e2
-
- def copy_token_to_repeater(s, l, t):
- matchTokens = _flatten(t.as_list())
-
- def must_match_these_tokens(s, l, t):
- theseTokens = _flatten(t.as_list())
- if theseTokens != matchTokens:
- raise ParseException(
- s, l, f"Expected {matchTokens}, found{theseTokens}"
- )
-
- rep.set_parse_action(must_match_these_tokens, callDuringTry=True)
-
- expr.add_parse_action(copy_token_to_repeater, callDuringTry=True)
- rep.set_name("(prev) " + str(expr))
- return rep
-
-
-def one_of(
- strs: Union[typing.Iterable[str], str],
- caseless: bool = False,
- use_regex: bool = True,
- as_keyword: bool = False,
- *,
- useRegex: bool = True,
- asKeyword: bool = False,
-) -> ParserElement:
- """Helper to quickly define a set of alternative :class:`Literal` s,
- and makes sure to do longest-first testing when there is a conflict,
- regardless of the input order, but returns
- a :class:`MatchFirst` for best performance.
-
- Parameters:
-
- - ``strs`` - a string of space-delimited literals, or a collection of
- string literals
- - ``caseless`` - treat all literals as caseless - (default= ``False``)
- - ``use_regex`` - as an optimization, will
- generate a :class:`Regex` object; otherwise, will generate
- a :class:`MatchFirst` object (if ``caseless=True`` or ``as_keyword=True``, or if
- creating a :class:`Regex` raises an exception) - (default= ``True``)
- - ``as_keyword`` - enforce :class:`Keyword`-style matching on the
- generated expressions - (default= ``False``)
- - ``asKeyword`` and ``useRegex`` are retained for pre-PEP8 compatibility,
- but will be removed in a future release
-
- Example::
-
- comp_oper = one_of("< = > <= >= !=")
- var = Word(alphas)
- number = Word(nums)
- term = var | number
- comparison_expr = term + comp_oper + term
- print(comparison_expr.search_string("B = 12 AA=23 B<=AA AA>12"))
-
- prints::
-
- [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']]
- """
- asKeyword = asKeyword or as_keyword
- useRegex = useRegex and use_regex
-
- if (
- isinstance(caseless, str_type)
- and __diag__.warn_on_multiple_string_args_to_oneof
- ):
- warnings.warn(
- "More than one string argument passed to one_of, pass"
- " choices as a list or space-delimited string",
- stacklevel=2,
- )
-
- if caseless:
- isequal = lambda a, b: a.upper() == b.upper()
- masks = lambda a, b: b.upper().startswith(a.upper())
- parseElementClass = CaselessKeyword if asKeyword else CaselessLiteral
- else:
- isequal = lambda a, b: a == b
- masks = lambda a, b: b.startswith(a)
- parseElementClass = Keyword if asKeyword else Literal
-
- symbols: List[str] = []
- if isinstance(strs, str_type):
- strs = typing.cast(str, strs)
- symbols = strs.split()
- elif isinstance(strs, Iterable):
- symbols = list(strs)
- else:
- raise TypeError("Invalid argument to one_of, expected string or iterable")
- if not symbols:
- return NoMatch()
-
- # reorder given symbols to take care to avoid masking longer choices with shorter ones
- # (but only if the given symbols are not just single characters)
- if any(len(sym) > 1 for sym in symbols):
- i = 0
- while i < len(symbols) - 1:
- cur = symbols[i]
- for j, other in enumerate(symbols[i + 1 :]):
- if isequal(other, cur):
- del symbols[i + j + 1]
- break
- elif masks(cur, other):
- del symbols[i + j + 1]
- symbols.insert(i, other)
- break
- else:
- i += 1
-
- if useRegex:
- re_flags: int = re.IGNORECASE if caseless else 0
-
- try:
- if all(len(sym) == 1 for sym in symbols):
- # symbols are just single characters, create range regex pattern
- patt = f"[{''.join(_escape_regex_range_chars(sym) for sym in symbols)}]"
- else:
- patt = "|".join(re.escape(sym) for sym in symbols)
-
- # wrap with \b word break markers if defining as keywords
- if asKeyword:
- patt = rf"\b(?:{patt})\b"
-
- ret = Regex(patt, flags=re_flags).set_name(" | ".join(symbols))
-
- if caseless:
- # add parse action to return symbols as specified, not in random
- # casing as found in input string
- symbol_map = {sym.lower(): sym for sym in symbols}
- ret.add_parse_action(lambda s, l, t: symbol_map[t[0].lower()])
-
- return ret
-
- except re.error:
- warnings.warn(
- "Exception creating Regex for one_of, building MatchFirst", stacklevel=2
- )
-
- # last resort, just use MatchFirst
- return MatchFirst(parseElementClass(sym) for sym in symbols).set_name(
- " | ".join(symbols)
- )
-
-
-def dict_of(key: ParserElement, value: ParserElement) -> ParserElement:
- """Helper to easily and clearly define a dictionary by specifying
- the respective patterns for the key and value. Takes care of
- defining the :class:`Dict`, :class:`ZeroOrMore`, and
- :class:`Group` tokens in the proper order. The key pattern
- can include delimiting markers or punctuation, as long as they are
- suppressed, thereby leaving the significant key text. The value
- pattern can include named results, so that the :class:`Dict` results
- can include named token fields.
-
- Example::
-
- text = "shape: SQUARE posn: upper left color: light blue texture: burlap"
- attr_expr = (label + Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join))
- print(attr_expr[1, ...].parse_string(text).dump())
-
- attr_label = label
- attr_value = Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join)
-
- # similar to Dict, but simpler call format
- result = dict_of(attr_label, attr_value).parse_string(text)
- print(result.dump())
- print(result['shape'])
- print(result.shape) # object attribute access works too
- print(result.as_dict())
-
- prints::
-
- [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']]
- - color: 'light blue'
- - posn: 'upper left'
- - shape: 'SQUARE'
- - texture: 'burlap'
- SQUARE
- SQUARE
- {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'}
- """
- return Dict(OneOrMore(Group(key + value)))
-
-
-def original_text_for(
- expr: ParserElement, as_string: bool = True, *, asString: bool = True
-) -> ParserElement:
- """Helper to return the original, untokenized text for a given
- expression. Useful to restore the parsed fields of an HTML start
- tag into the raw tag text itself, or to revert separate tokens with
- intervening whitespace back to the original matching input text. By
- default, returns a string containing the original parsed text.
-
- If the optional ``as_string`` argument is passed as
- ``False``, then the return value is
- a :class:`ParseResults` containing any results names that
- were originally matched, and a single token containing the original
- matched text from the input string. So if the expression passed to
- :class:`original_text_for` contains expressions with defined
- results names, you must set ``as_string`` to ``False`` if you
- want to preserve those results name values.
-
- The ``asString`` pre-PEP8 argument is retained for compatibility,
- but will be removed in a future release.
-
- Example::
-
- src = "this is test <b> bold <i>text</i> </b> normal text "
- for tag in ("b", "i"):
- opener, closer = make_html_tags(tag)
- patt = original_text_for(opener + ... + closer)
- print(patt.search_string(src)[0])
-
- prints::
-
- ['<b> bold <i>text</i> </b>']
- ['<i>text</i>']
- """
- asString = asString and as_string
-
- locMarker = Empty().set_parse_action(lambda s, loc, t: loc)
- endlocMarker = locMarker.copy()
- endlocMarker.callPreparse = False
- matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end")
- if asString:
- extractText = lambda s, l, t: s[t._original_start : t._original_end]
- else:
-
- def extractText(s, l, t):
- t[:] = [s[t.pop("_original_start") : t.pop("_original_end")]]
-
- matchExpr.set_parse_action(extractText)
- matchExpr.ignoreExprs = expr.ignoreExprs
- matchExpr.suppress_warning(Diagnostics.warn_ungrouped_named_tokens_in_collection)
- return matchExpr
-
-
-def ungroup(expr: ParserElement) -> ParserElement:
- """Helper to undo pyparsing's default grouping of And expressions,
- even if all but one are non-empty.
- """
- return TokenConverter(expr).add_parse_action(lambda t: t[0])
-
-
-def locatedExpr(expr: ParserElement) -> ParserElement:
- """
- (DEPRECATED - future code should use the :class:`Located` class)
- Helper to decorate a returned token with its starting and ending
- locations in the input string.
-
- This helper adds the following results names:
-
- - ``locn_start`` - location where matched expression begins
- - ``locn_end`` - location where matched expression ends
- - ``value`` - the actual parsed results
-
- Be careful if the input text contains ``<TAB>`` characters, you
- may want to call :class:`ParserElement.parse_with_tabs`
-
- Example::
-
- wd = Word(alphas)
- for match in locatedExpr(wd).search_string("ljsdf123lksdjjf123lkkjj1222"):
- print(match)
-
- prints::
-
- [[0, 'ljsdf', 5]]
- [[8, 'lksdjjf', 15]]
- [[18, 'lkkjj', 23]]
- """
- locator = Empty().set_parse_action(lambda ss, ll, tt: ll)
- return Group(
- locator("locn_start")
- + expr("value")
- + locator.copy().leaveWhitespace()("locn_end")
- )
-
-
-def nested_expr(
- opener: Union[str, ParserElement] = "(",
- closer: Union[str, ParserElement] = ")",
- content: typing.Optional[ParserElement] = None,
- ignore_expr: ParserElement = quoted_string(),
- *,
- ignoreExpr: ParserElement = quoted_string(),
-) -> ParserElement:
- """Helper method for defining nested lists enclosed in opening and
- closing delimiters (``"("`` and ``")"`` are the default).
-
- Parameters:
-
- - ``opener`` - opening character for a nested list
- (default= ``"("``); can also be a pyparsing expression
- - ``closer`` - closing character for a nested list
- (default= ``")"``); can also be a pyparsing expression
- - ``content`` - expression for items within the nested lists
- (default= ``None``)
- - ``ignore_expr`` - expression for ignoring opening and closing delimiters
- (default= :class:`quoted_string`)
- - ``ignoreExpr`` - this pre-PEP8 argument is retained for compatibility
- but will be removed in a future release
-
- If an expression is not provided for the content argument, the
- nested expression will capture all whitespace-delimited content
- between delimiters as a list of separate values.
-
- Use the ``ignore_expr`` argument to define expressions that may
- contain opening or closing characters that should not be treated as
- opening or closing characters for nesting, such as quoted_string or
- a comment expression. Specify multiple expressions using an
- :class:`Or` or :class:`MatchFirst`. The default is
- :class:`quoted_string`, but if no expressions are to be ignored, then
- pass ``None`` for this argument.
-
- Example::
-
- data_type = one_of("void int short long char float double")
- decl_data_type = Combine(data_type + Opt(Word('*')))
- ident = Word(alphas+'_', alphanums+'_')
- number = pyparsing_common.number
- arg = Group(decl_data_type + ident)
- LPAR, RPAR = map(Suppress, "()")
-
- code_body = nested_expr('{', '}', ignore_expr=(quoted_string | c_style_comment))
-
- c_function = (decl_data_type("type")
- + ident("name")
- + LPAR + Opt(DelimitedList(arg), [])("args") + RPAR
- + code_body("body"))
- c_function.ignore(c_style_comment)
-
- source_code = '''
- int is_odd(int x) {
- return (x%2);
- }
-
- int dec_to_hex(char hchar) {
- if (hchar >= '0' && hchar <= '9') {
- return (ord(hchar)-ord('0'));
- } else {
- return (10+ord(hchar)-ord('A'));
- }
- }
- '''
- for func in c_function.search_string(source_code):
- print("%(name)s (%(type)s) args: %(args)s" % func)
-
-
- prints::
-
- is_odd (int) args: [['int', 'x']]
- dec_to_hex (int) args: [['char', 'hchar']]
- """
- if ignoreExpr != ignore_expr:
- ignoreExpr = ignore_expr if ignoreExpr == quoted_string() else ignoreExpr
- if opener == closer:
- raise ValueError("opening and closing strings cannot be the same")
- if content is None:
- if isinstance(opener, str_type) and isinstance(closer, str_type):
- opener = typing.cast(str, opener)
- closer = typing.cast(str, closer)
- if len(opener) == 1 and len(closer) == 1:
- if ignoreExpr is not None:
- content = Combine(
- OneOrMore(
- ~ignoreExpr
- + CharsNotIn(
- opener + closer + ParserElement.DEFAULT_WHITE_CHARS,
- exact=1,
- )
- )
- ).set_parse_action(lambda t: t[0].strip())
- else:
- content = empty.copy() + CharsNotIn(
- opener + closer + ParserElement.DEFAULT_WHITE_CHARS
- ).set_parse_action(lambda t: t[0].strip())
- else:
- if ignoreExpr is not None:
- content = Combine(
- OneOrMore(
- ~ignoreExpr
- + ~Literal(opener)
- + ~Literal(closer)
- + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS, exact=1)
- )
- ).set_parse_action(lambda t: t[0].strip())
- else:
- content = Combine(
- OneOrMore(
- ~Literal(opener)
- + ~Literal(closer)
- + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS, exact=1)
- )
- ).set_parse_action(lambda t: t[0].strip())
- else:
- raise ValueError(
- "opening and closing arguments must be strings if no content expression is given"
- )
- ret = Forward()
- if ignoreExpr is not None:
- ret <<= Group(
- Suppress(opener) + ZeroOrMore(ignoreExpr | ret | content) + Suppress(closer)
- )
- else:
- ret <<= Group(Suppress(opener) + ZeroOrMore(ret | content) + Suppress(closer))
- ret.set_name("nested %s%s expression" % (opener, closer))
- return ret
-
-
-def _makeTags(tagStr, xml, suppress_LT=Suppress("<"), suppress_GT=Suppress(">")):
- """Internal helper to construct opening and closing tag expressions, given a tag name"""
- if isinstance(tagStr, str_type):
- resname = tagStr
- tagStr = Keyword(tagStr, caseless=not xml)
- else:
- resname = tagStr.name
-
- tagAttrName = Word(alphas, alphanums + "_-:")
- if xml:
- tagAttrValue = dbl_quoted_string.copy().set_parse_action(remove_quotes)
- openTag = (
- suppress_LT
- + tagStr("tag")
- + Dict(ZeroOrMore(Group(tagAttrName + Suppress("=") + tagAttrValue)))
- + Opt("/", default=[False])("empty").set_parse_action(
- lambda s, l, t: t[0] == "/"
- )
- + suppress_GT
- )
- else:
- tagAttrValue = quoted_string.copy().set_parse_action(remove_quotes) | Word(
- printables, exclude_chars=">"
- )
- openTag = (
- suppress_LT
- + tagStr("tag")
- + Dict(
- ZeroOrMore(
- Group(
- tagAttrName.set_parse_action(lambda t: t[0].lower())
- + Opt(Suppress("=") + tagAttrValue)
- )
- )
- )
- + Opt("/", default=[False])("empty").set_parse_action(
- lambda s, l, t: t[0] == "/"
- )
- + suppress_GT
- )
- closeTag = Combine(Literal("</") + tagStr + ">", adjacent=False)
-
- openTag.set_name("<%s>" % resname)
- # add start<tagname> results name in parse action now that ungrouped names are not reported at two levels
- openTag.add_parse_action(
- lambda t: t.__setitem__(
- "start" + "".join(resname.replace(":", " ").title().split()), t.copy()
- )
- )
- closeTag = closeTag(
- "end" + "".join(resname.replace(":", " ").title().split())
- ).set_name("</%s>" % resname)
- openTag.tag = resname
- closeTag.tag = resname
- openTag.tag_body = SkipTo(closeTag())
- return openTag, closeTag
-
-
-def make_html_tags(
- tag_str: Union[str, ParserElement]
-) -> Tuple[ParserElement, ParserElement]:
- """Helper to construct opening and closing tag expressions for HTML,
- given a tag name. Matches tags in either upper or lower case,
- attributes with namespaces and with quoted or unquoted values.
-
- Example::
-
- text = '<td>More info at the <a href="https://github.com/pyparsing/pyparsing/wiki">pyparsing</a> wiki page</td>'
- # make_html_tags returns pyparsing expressions for the opening and
- # closing tags as a 2-tuple
- a, a_end = make_html_tags("A")
- link_expr = a + SkipTo(a_end)("link_text") + a_end
-
- for link in link_expr.search_string(text):
- # attributes in the <A> tag (like "href" shown here) are
- # also accessible as named results
- print(link.link_text, '->', link.href)
-
- prints::
-
- pyparsing -> https://github.com/pyparsing/pyparsing/wiki
- """
- return _makeTags(tag_str, False)
-
-
-def make_xml_tags(
- tag_str: Union[str, ParserElement]
-) -> Tuple[ParserElement, ParserElement]:
- """Helper to construct opening and closing tag expressions for XML,
- given a tag name. Matches tags only in the given upper/lower case.
-
- Example: similar to :class:`make_html_tags`
- """
- return _makeTags(tag_str, True)
-
-
-any_open_tag: ParserElement
-any_close_tag: ParserElement
-any_open_tag, any_close_tag = make_html_tags(
- Word(alphas, alphanums + "_:").set_name("any tag")
-)
-
-_htmlEntityMap = {k.rstrip(";"): v for k, v in html.entities.html5.items()}
-common_html_entity = Regex("&(?P<entity>" + "|".join(_htmlEntityMap) + ");").set_name(
- "common HTML entity"
-)
-
-
-def replace_html_entity(s, l, t):
- """Helper parser action to replace common HTML entities with their special characters"""
- return _htmlEntityMap.get(t.entity)
-
-
-class OpAssoc(Enum):
- """Enumeration of operator associativity
- - used in constructing InfixNotationOperatorSpec for :class:`infix_notation`"""
-
- LEFT = 1
- RIGHT = 2
-
-
-InfixNotationOperatorArgType = Union[
- ParserElement, str, Tuple[Union[ParserElement, str], Union[ParserElement, str]]
-]
-InfixNotationOperatorSpec = Union[
- Tuple[
- InfixNotationOperatorArgType,
- int,
- OpAssoc,
- typing.Optional[ParseAction],
- ],
- Tuple[
- InfixNotationOperatorArgType,
- int,
- OpAssoc,
- ],
-]
-
-
-def infix_notation(
- base_expr: ParserElement,
- op_list: List[InfixNotationOperatorSpec],
- lpar: Union[str, ParserElement] = Suppress("("),
- rpar: Union[str, ParserElement] = Suppress(")"),
-) -> ParserElement:
- """Helper method for constructing grammars of expressions made up of
- operators working in a precedence hierarchy. Operators may be unary
- or binary, left- or right-associative. Parse actions can also be
- attached to operator expressions. The generated parser will also
- recognize the use of parentheses to override operator precedences
- (see example below).
-
- Note: if you define a deep operator list, you may see performance
- issues when using infix_notation. See
- :class:`ParserElement.enable_packrat` for a mechanism to potentially
- improve your parser performance.
-
- Parameters:
-
- - ``base_expr`` - expression representing the most basic operand to
- be used in the expression
- - ``op_list`` - list of tuples, one for each operator precedence level
- in the expression grammar; each tuple is of the form ``(op_expr,
- num_operands, right_left_assoc, (optional)parse_action)``, where:
-
- - ``op_expr`` is the pyparsing expression for the operator; may also
- be a string, which will be converted to a Literal; if ``num_operands``
- is 3, ``op_expr`` is a tuple of two expressions, for the two
- operators separating the 3 terms
- - ``num_operands`` is the number of terms for this operator (must be 1,
- 2, or 3)
- - ``right_left_assoc`` is the indicator whether the operator is right
- or left associative, using the pyparsing-defined constants
- ``OpAssoc.RIGHT`` and ``OpAssoc.LEFT``.
- - ``parse_action`` is the parse action to be associated with
- expressions matching this operator expression (the parse action
- tuple member may be omitted); if the parse action is passed
- a tuple or list of functions, this is equivalent to calling
- ``set_parse_action(*fn)``
- (:class:`ParserElement.set_parse_action`)
- - ``lpar`` - expression for matching left-parentheses; if passed as a
- str, then will be parsed as ``Suppress(lpar)``. If lpar is passed as
- an expression (such as ``Literal('(')``), then it will be kept in
- the parsed results, and grouped with them. (default= ``Suppress('(')``)
- - ``rpar`` - expression for matching right-parentheses; if passed as a
- str, then will be parsed as ``Suppress(rpar)``. If rpar is passed as
- an expression (such as ``Literal(')')``), then it will be kept in
- the parsed results, and grouped with them. (default= ``Suppress(')')``)
-
- Example::
-
- # simple example of four-function arithmetic with ints and
- # variable names
- integer = pyparsing_common.signed_integer
- varname = pyparsing_common.identifier
-
- arith_expr = infix_notation(integer | varname,
- [
- ('-', 1, OpAssoc.RIGHT),
- (one_of('* /'), 2, OpAssoc.LEFT),
- (one_of('+ -'), 2, OpAssoc.LEFT),
- ])
-
- arith_expr.run_tests('''
- 5+3*6
- (5+3)*6
- -2--11
- ''', full_dump=False)
-
- prints::
-
- 5+3*6
- [[5, '+', [3, '*', 6]]]
-
- (5+3)*6
- [[[5, '+', 3], '*', 6]]
-
- (5+x)*y
- [[[5, '+', 'x'], '*', 'y']]
-
- -2--11
- [[['-', 2], '-', ['-', 11]]]
- """
-
- # captive version of FollowedBy that does not do parse actions or capture results names
- class _FB(FollowedBy):
- def parseImpl(self, instring, loc, doActions=True):
- self.expr.try_parse(instring, loc)
- return loc, []
-
- _FB.__name__ = "FollowedBy>"
-
- ret = Forward()
- if isinstance(lpar, str):
- lpar = Suppress(lpar)
- if isinstance(rpar, str):
- rpar = Suppress(rpar)
-
- # if lpar and rpar are not suppressed, wrap in group
- if not (isinstance(rpar, Suppress) and isinstance(rpar, Suppress)):
- lastExpr = base_expr | Group(lpar + ret + rpar)
- else:
- lastExpr = base_expr | (lpar + ret + rpar)
-
- arity: int
- rightLeftAssoc: opAssoc
- pa: typing.Optional[ParseAction]
- opExpr1: ParserElement
- opExpr2: ParserElement
- for i, operDef in enumerate(op_list):
- opExpr, arity, rightLeftAssoc, pa = (operDef + (None,))[:4] # type: ignore[assignment]
- if isinstance(opExpr, str_type):
- opExpr = ParserElement._literalStringClass(opExpr)
- opExpr = typing.cast(ParserElement, opExpr)
- if arity == 3:
- if not isinstance(opExpr, (tuple, list)) or len(opExpr) != 2:
- raise ValueError(
- "if numterms=3, opExpr must be a tuple or list of two expressions"
- )
- opExpr1, opExpr2 = opExpr
- term_name = f"{opExpr1}{opExpr2} term"
- else:
- term_name = f"{opExpr} term"
-
- if not 1 <= arity <= 3:
- raise ValueError("operator must be unary (1), binary (2), or ternary (3)")
-
- if rightLeftAssoc not in (OpAssoc.LEFT, OpAssoc.RIGHT):
- raise ValueError("operator must indicate right or left associativity")
-
- thisExpr: ParserElement = Forward().set_name(term_name)
- thisExpr = typing.cast(Forward, thisExpr)
- if rightLeftAssoc is OpAssoc.LEFT:
- if arity == 1:
- matchExpr = _FB(lastExpr + opExpr) + Group(lastExpr + opExpr[1, ...])
- elif arity == 2:
- if opExpr is not None:
- matchExpr = _FB(lastExpr + opExpr + lastExpr) + Group(
- lastExpr + (opExpr + lastExpr)[1, ...]
- )
- else:
- matchExpr = _FB(lastExpr + lastExpr) + Group(lastExpr[2, ...])
- elif arity == 3:
- matchExpr = _FB(
- lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr
- ) + Group(lastExpr + OneOrMore(opExpr1 + lastExpr + opExpr2 + lastExpr))
- elif rightLeftAssoc is OpAssoc.RIGHT:
- if arity == 1:
- # try to avoid LR with this extra test
- if not isinstance(opExpr, Opt):
- opExpr = Opt(opExpr)
- matchExpr = _FB(opExpr.expr + thisExpr) + Group(opExpr + thisExpr)
- elif arity == 2:
- if opExpr is not None:
- matchExpr = _FB(lastExpr + opExpr + thisExpr) + Group(
- lastExpr + (opExpr + thisExpr)[1, ...]
- )
- else:
- matchExpr = _FB(lastExpr + thisExpr) + Group(
- lastExpr + thisExpr[1, ...]
- )
- elif arity == 3:
- matchExpr = _FB(
- lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr
- ) + Group(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr)
- if pa:
- if isinstance(pa, (tuple, list)):
- matchExpr.set_parse_action(*pa)
- else:
- matchExpr.set_parse_action(pa)
- thisExpr <<= (matchExpr | lastExpr).setName(term_name)
- lastExpr = thisExpr
- ret <<= lastExpr
- return ret
-
-
-def indentedBlock(blockStatementExpr, indentStack, indent=True, backup_stacks=[]):
- """
- (DEPRECATED - use :class:`IndentedBlock` class instead)
- Helper method for defining space-delimited indentation blocks,
- such as those used to define block statements in Python source code.
-
- Parameters:
-
- - ``blockStatementExpr`` - expression defining syntax of statement that
- is repeated within the indented block
- - ``indentStack`` - list created by caller to manage indentation stack
- (multiple ``statementWithIndentedBlock`` expressions within a single
- grammar should share a common ``indentStack``)
- - ``indent`` - boolean indicating whether block must be indented beyond
- the current level; set to ``False`` for block of left-most statements
- (default= ``True``)
-
- A valid block must contain at least one ``blockStatement``.
-
- (Note that indentedBlock uses internal parse actions which make it
- incompatible with packrat parsing.)
-
- Example::
-
- data = '''
- def A(z):
- A1
- B = 100
- G = A2
- A2
- A3
- B
- def BB(a,b,c):
- BB1
- def BBA():
- bba1
- bba2
- bba3
- C
- D
- def spam(x,y):
- def eggs(z):
- pass
- '''
-
-
- indentStack = [1]
- stmt = Forward()
-
- identifier = Word(alphas, alphanums)
- funcDecl = ("def" + identifier + Group("(" + Opt(delimitedList(identifier)) + ")") + ":")
- func_body = indentedBlock(stmt, indentStack)
- funcDef = Group(funcDecl + func_body)
-
- rvalue = Forward()
- funcCall = Group(identifier + "(" + Opt(delimitedList(rvalue)) + ")")
- rvalue << (funcCall | identifier | Word(nums))
- assignment = Group(identifier + "=" + rvalue)
- stmt << (funcDef | assignment | identifier)
-
- module_body = stmt[1, ...]
-
- parseTree = module_body.parseString(data)
- parseTree.pprint()
-
- prints::
-
- [['def',
- 'A',
- ['(', 'z', ')'],
- ':',
- [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]],
- 'B',
- ['def',
- 'BB',
- ['(', 'a', 'b', 'c', ')'],
- ':',
- [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]],
- 'C',
- 'D',
- ['def',
- 'spam',
- ['(', 'x', 'y', ')'],
- ':',
- [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]]
- """
- backup_stacks.append(indentStack[:])
-
- def reset_stack():
- indentStack[:] = backup_stacks[-1]
-
- def checkPeerIndent(s, l, t):
- if l >= len(s):
- return
- curCol = col(l, s)
- if curCol != indentStack[-1]:
- if curCol > indentStack[-1]:
- raise ParseException(s, l, "illegal nesting")
- raise ParseException(s, l, "not a peer entry")
-
- def checkSubIndent(s, l, t):
- curCol = col(l, s)
- if curCol > indentStack[-1]:
- indentStack.append(curCol)
- else:
- raise ParseException(s, l, "not a subentry")
-
- def checkUnindent(s, l, t):
- if l >= len(s):
- return
- curCol = col(l, s)
- if not (indentStack and curCol in indentStack):
- raise ParseException(s, l, "not an unindent")
- if curCol < indentStack[-1]:
- indentStack.pop()
-
- NL = OneOrMore(LineEnd().set_whitespace_chars("\t ").suppress())
- INDENT = (Empty() + Empty().set_parse_action(checkSubIndent)).set_name("INDENT")
- PEER = Empty().set_parse_action(checkPeerIndent).set_name("")
- UNDENT = Empty().set_parse_action(checkUnindent).set_name("UNINDENT")
- if indent:
- smExpr = Group(
- Opt(NL)
- + INDENT
- + OneOrMore(PEER + Group(blockStatementExpr) + Opt(NL))
- + UNDENT
- )
- else:
- smExpr = Group(
- Opt(NL)
- + OneOrMore(PEER + Group(blockStatementExpr) + Opt(NL))
- + Opt(UNDENT)
- )
-
- # add a parse action to remove backup_stack from list of backups
- smExpr.add_parse_action(
- lambda: backup_stacks.pop(-1) and None if backup_stacks else None
- )
- smExpr.set_fail_action(lambda a, b, c, d: reset_stack())
- blockStatementExpr.ignore(_bslash + LineEnd())
- return smExpr.set_name("indented block")
-
-
-# it's easy to get these comment structures wrong - they're very common, so may as well make them available
-c_style_comment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + "*/").set_name(
- "C style comment"
-)
-"Comment of the form ``/* ... */``"
-
-html_comment = Regex(r"<!--[\s\S]*?-->").set_name("HTML comment")
-"Comment of the form ``<!-- ... -->``"
-
-rest_of_line = Regex(r".*").leave_whitespace().set_name("rest of line")
-dbl_slash_comment = Regex(r"//(?:\\\n|[^\n])*").set_name("// comment")
-"Comment of the form ``// ... (to end of line)``"
-
-cpp_style_comment = Combine(
- Regex(r"/\*(?:[^*]|\*(?!/))*") + "*/" | dbl_slash_comment
-).set_name("C++ style comment")
-"Comment of either form :class:`c_style_comment` or :class:`dbl_slash_comment`"
-
-java_style_comment = cpp_style_comment
-"Same as :class:`cpp_style_comment`"
-
-python_style_comment = Regex(r"#.*").set_name("Python style comment")
-"Comment of the form ``# ... (to end of line)``"
-
-
-# build list of built-in expressions, for future reference if a global default value
-# gets updated
-_builtin_exprs: List[ParserElement] = [
- v for v in vars().values() if isinstance(v, ParserElement)
-]
-
-
-# compatibility function, superseded by DelimitedList class
-def delimited_list(
- expr: Union[str, ParserElement],
- delim: Union[str, ParserElement] = ",",
- combine: bool = False,
- min: typing.Optional[int] = None,
- max: typing.Optional[int] = None,
- *,
- allow_trailing_delim: bool = False,
-) -> ParserElement:
- """(DEPRECATED - use :class:`DelimitedList` class)"""
- return DelimitedList(
- expr, delim, combine, min, max, allow_trailing_delim=allow_trailing_delim
- )
-
-
-# pre-PEP8 compatible names
-# fmt: off
-opAssoc = OpAssoc
-anyOpenTag = any_open_tag
-anyCloseTag = any_close_tag
-commonHTMLEntity = common_html_entity
-cStyleComment = c_style_comment
-htmlComment = html_comment
-restOfLine = rest_of_line
-dblSlashComment = dbl_slash_comment
-cppStyleComment = cpp_style_comment
-javaStyleComment = java_style_comment
-pythonStyleComment = python_style_comment
-
-@replaced_by_pep8(DelimitedList)
-def delimitedList(): ...
-
-@replaced_by_pep8(DelimitedList)
-def delimited_list(): ...
-
-@replaced_by_pep8(counted_array)
-def countedArray(): ...
-
-@replaced_by_pep8(match_previous_literal)
-def matchPreviousLiteral(): ...
-
-@replaced_by_pep8(match_previous_expr)
-def matchPreviousExpr(): ...
-
-@replaced_by_pep8(one_of)
-def oneOf(): ...
-
-@replaced_by_pep8(dict_of)
-def dictOf(): ...
-
-@replaced_by_pep8(original_text_for)
-def originalTextFor(): ...
-
-@replaced_by_pep8(nested_expr)
-def nestedExpr(): ...
-
-@replaced_by_pep8(make_html_tags)
-def makeHTMLTags(): ...
-
-@replaced_by_pep8(make_xml_tags)
-def makeXMLTags(): ...
-
-@replaced_by_pep8(replace_html_entity)
-def replaceHTMLEntity(): ...
-
-@replaced_by_pep8(infix_notation)
-def infixNotation(): ...
-# fmt: on
diff --git a/contrib/python/pip/pip/_vendor/pyparsing/py.typed b/contrib/python/pip/pip/_vendor/pyparsing/py.typed
deleted file mode 100644
index e69de29bb2..0000000000
--- a/contrib/python/pip/pip/_vendor/pyparsing/py.typed
+++ /dev/null
diff --git a/contrib/python/pip/pip/_vendor/pyparsing/results.py b/contrib/python/pip/pip/_vendor/pyparsing/results.py
deleted file mode 100644
index 0313049763..0000000000
--- a/contrib/python/pip/pip/_vendor/pyparsing/results.py
+++ /dev/null
@@ -1,796 +0,0 @@
-# results.py
-from collections.abc import (
- MutableMapping,
- Mapping,
- MutableSequence,
- Iterator,
- Sequence,
- Container,
-)
-import pprint
-from typing import Tuple, Any, Dict, Set, List
-
-str_type: Tuple[type, ...] = (str, bytes)
-_generator_type = type((_ for _ in ()))
-
-
-class _ParseResultsWithOffset:
- tup: Tuple["ParseResults", int]
- __slots__ = ["tup"]
-
- def __init__(self, p1: "ParseResults", p2: int):
- self.tup: Tuple[ParseResults, int] = (p1, p2)
-
- def __getitem__(self, i):
- return self.tup[i]
-
- def __getstate__(self):
- return self.tup
-
- def __setstate__(self, *args):
- self.tup = args[0]
-
-
-class ParseResults:
- """Structured parse results, to provide multiple means of access to
- the parsed data:
-
- - as a list (``len(results)``)
- - by list index (``results[0], results[1]``, etc.)
- - by attribute (``results.<results_name>`` - see :class:`ParserElement.set_results_name`)
-
- Example::
-
- integer = Word(nums)
- date_str = (integer.set_results_name("year") + '/'
- + integer.set_results_name("month") + '/'
- + integer.set_results_name("day"))
- # equivalent form:
- # date_str = (integer("year") + '/'
- # + integer("month") + '/'
- # + integer("day"))
-
- # parse_string returns a ParseResults object
- result = date_str.parse_string("1999/12/31")
-
- def test(s, fn=repr):
- print(f"{s} -> {fn(eval(s))}")
- test("list(result)")
- test("result[0]")
- test("result['month']")
- test("result.day")
- test("'month' in result")
- test("'minutes' in result")
- test("result.dump()", str)
-
- prints::
-
- list(result) -> ['1999', '/', '12', '/', '31']
- result[0] -> '1999'
- result['month'] -> '12'
- result.day -> '31'
- 'month' in result -> True
- 'minutes' in result -> False
- result.dump() -> ['1999', '/', '12', '/', '31']
- - day: '31'
- - month: '12'
- - year: '1999'
- """
-
- _null_values: Tuple[Any, ...] = (None, [], ())
-
- _name: str
- _parent: "ParseResults"
- _all_names: Set[str]
- _modal: bool
- _toklist: List[Any]
- _tokdict: Dict[str, Any]
-
- __slots__ = (
- "_name",
- "_parent",
- "_all_names",
- "_modal",
- "_toklist",
- "_tokdict",
- )
-
- class List(list):
- """
- Simple wrapper class to distinguish parsed list results that should be preserved
- as actual Python lists, instead of being converted to :class:`ParseResults`::
-
- LBRACK, RBRACK = map(pp.Suppress, "[]")
- element = pp.Forward()
- item = ppc.integer
- element_list = LBRACK + pp.DelimitedList(element) + RBRACK
-
- # add parse actions to convert from ParseResults to actual Python collection types
- def as_python_list(t):
- return pp.ParseResults.List(t.as_list())
- element_list.add_parse_action(as_python_list)
-
- element <<= item | element_list
-
- element.run_tests('''
- 100
- [2,3,4]
- [[2, 1],3,4]
- [(2, 1),3,4]
- (2,3,4)
- ''', post_parse=lambda s, r: (r[0], type(r[0])))
-
- prints::
-
- 100
- (100, <class 'int'>)
-
- [2,3,4]
- ([2, 3, 4], <class 'list'>)
-
- [[2, 1],3,4]
- ([[2, 1], 3, 4], <class 'list'>)
-
- (Used internally by :class:`Group` when `aslist=True`.)
- """
-
- def __new__(cls, contained=None):
- if contained is None:
- contained = []
-
- if not isinstance(contained, list):
- raise TypeError(
- f"{cls.__name__} may only be constructed with a list, not {type(contained).__name__}"
- )
-
- return list.__new__(cls)
-
- def __new__(cls, toklist=None, name=None, **kwargs):
- if isinstance(toklist, ParseResults):
- return toklist
- self = object.__new__(cls)
- self._name = None
- self._parent = None
- self._all_names = set()
-
- if toklist is None:
- self._toklist = []
- elif isinstance(toklist, (list, _generator_type)):
- self._toklist = (
- [toklist[:]]
- if isinstance(toklist, ParseResults.List)
- else list(toklist)
- )
- else:
- self._toklist = [toklist]
- self._tokdict = dict()
- return self
-
- # Performance tuning: we construct a *lot* of these, so keep this
- # constructor as small and fast as possible
- def __init__(
- self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance
- ):
- self._tokdict: Dict[str, _ParseResultsWithOffset]
- self._modal = modal
- if name is not None and name != "":
- if isinstance(name, int):
- name = str(name)
- if not modal:
- self._all_names = {name}
- self._name = name
- if toklist not in self._null_values:
- if isinstance(toklist, (str_type, type)):
- toklist = [toklist]
- if asList:
- if isinstance(toklist, ParseResults):
- self[name] = _ParseResultsWithOffset(
- ParseResults(toklist._toklist), 0
- )
- else:
- self[name] = _ParseResultsWithOffset(
- ParseResults(toklist[0]), 0
- )
- self[name]._name = name
- else:
- try:
- self[name] = toklist[0]
- except (KeyError, TypeError, IndexError):
- if toklist is not self:
- self[name] = toklist
- else:
- self._name = name
-
- def __getitem__(self, i):
- if isinstance(i, (int, slice)):
- return self._toklist[i]
- else:
- if i not in self._all_names:
- return self._tokdict[i][-1][0]
- else:
- return ParseResults([v[0] for v in self._tokdict[i]])
-
- def __setitem__(self, k, v, isinstance=isinstance):
- if isinstance(v, _ParseResultsWithOffset):
- self._tokdict[k] = self._tokdict.get(k, list()) + [v]
- sub = v[0]
- elif isinstance(k, (int, slice)):
- self._toklist[k] = v
- sub = v
- else:
- self._tokdict[k] = self._tokdict.get(k, list()) + [
- _ParseResultsWithOffset(v, 0)
- ]
- sub = v
- if isinstance(sub, ParseResults):
- sub._parent = self
-
- def __delitem__(self, i):
- if isinstance(i, (int, slice)):
- mylen = len(self._toklist)
- del self._toklist[i]
-
- # convert int to slice
- if isinstance(i, int):
- if i < 0:
- i += mylen
- i = slice(i, i + 1)
- # get removed indices
- removed = list(range(*i.indices(mylen)))
- removed.reverse()
- # fixup indices in token dictionary
- for name, occurrences in self._tokdict.items():
- for j in removed:
- for k, (value, position) in enumerate(occurrences):
- occurrences[k] = _ParseResultsWithOffset(
- value, position - (position > j)
- )
- else:
- del self._tokdict[i]
-
- def __contains__(self, k) -> bool:
- return k in self._tokdict
-
- def __len__(self) -> int:
- return len(self._toklist)
-
- def __bool__(self) -> bool:
- return not not (self._toklist or self._tokdict)
-
- def __iter__(self) -> Iterator:
- return iter(self._toklist)
-
- def __reversed__(self) -> Iterator:
- return iter(self._toklist[::-1])
-
- def keys(self):
- return iter(self._tokdict)
-
- def values(self):
- return (self[k] for k in self.keys())
-
- def items(self):
- return ((k, self[k]) for k in self.keys())
-
- def haskeys(self) -> bool:
- """
- Since ``keys()`` returns an iterator, this method is helpful in bypassing
- code that looks for the existence of any defined results names."""
- return not not self._tokdict
-
- def pop(self, *args, **kwargs):
- """
- Removes and returns item at specified index (default= ``last``).
- Supports both ``list`` and ``dict`` semantics for ``pop()``. If
- passed no argument or an integer argument, it will use ``list``
- semantics and pop tokens from the list of parsed tokens. If passed
- a non-integer argument (most likely a string), it will use ``dict``
- semantics and pop the corresponding value from any defined results
- names. A second default return value argument is supported, just as in
- ``dict.pop()``.
-
- Example::
-
- numlist = Word(nums)[...]
- print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321']
-
- def remove_first(tokens):
- tokens.pop(0)
- numlist.add_parse_action(remove_first)
- print(numlist.parse_string("0 123 321")) # -> ['123', '321']
-
- label = Word(alphas)
- patt = label("LABEL") + Word(nums)[1, ...]
- print(patt.parse_string("AAB 123 321").dump())
-
- # Use pop() in a parse action to remove named result (note that corresponding value is not
- # removed from list form of results)
- def remove_LABEL(tokens):
- tokens.pop("LABEL")
- return tokens
- patt.add_parse_action(remove_LABEL)
- print(patt.parse_string("AAB 123 321").dump())
-
- prints::
-
- ['AAB', '123', '321']
- - LABEL: 'AAB'
-
- ['AAB', '123', '321']
- """
- if not args:
- args = [-1]
- for k, v in kwargs.items():
- if k == "default":
- args = (args[0], v)
- else:
- raise TypeError(f"pop() got an unexpected keyword argument {k!r}")
- if isinstance(args[0], int) or len(args) == 1 or args[0] in self:
- index = args[0]
- ret = self[index]
- del self[index]
- return ret
- else:
- defaultvalue = args[1]
- return defaultvalue
-
- def get(self, key, default_value=None):
- """
- Returns named result matching the given key, or if there is no
- such name, then returns the given ``default_value`` or ``None`` if no
- ``default_value`` is specified.
-
- Similar to ``dict.get()``.
-
- Example::
-
- integer = Word(nums)
- date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
-
- result = date_str.parse_string("1999/12/31")
- print(result.get("year")) # -> '1999'
- print(result.get("hour", "not specified")) # -> 'not specified'
- print(result.get("hour")) # -> None
- """
- if key in self:
- return self[key]
- else:
- return default_value
-
- def insert(self, index, ins_string):
- """
- Inserts new element at location index in the list of parsed tokens.
-
- Similar to ``list.insert()``.
-
- Example::
-
- numlist = Word(nums)[...]
- print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321']
-
- # use a parse action to insert the parse location in the front of the parsed results
- def insert_locn(locn, tokens):
- tokens.insert(0, locn)
- numlist.add_parse_action(insert_locn)
- print(numlist.parse_string("0 123 321")) # -> [0, '0', '123', '321']
- """
- self._toklist.insert(index, ins_string)
- # fixup indices in token dictionary
- for name, occurrences in self._tokdict.items():
- for k, (value, position) in enumerate(occurrences):
- occurrences[k] = _ParseResultsWithOffset(
- value, position + (position > index)
- )
-
- def append(self, item):
- """
- Add single element to end of ``ParseResults`` list of elements.
-
- Example::
-
- numlist = Word(nums)[...]
- print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321']
-
- # use a parse action to compute the sum of the parsed integers, and add it to the end
- def append_sum(tokens):
- tokens.append(sum(map(int, tokens)))
- numlist.add_parse_action(append_sum)
- print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321', 444]
- """
- self._toklist.append(item)
-
- def extend(self, itemseq):
- """
- Add sequence of elements to end of ``ParseResults`` list of elements.
-
- Example::
-
- patt = Word(alphas)[1, ...]
-
- # use a parse action to append the reverse of the matched strings, to make a palindrome
- def make_palindrome(tokens):
- tokens.extend(reversed([t[::-1] for t in tokens]))
- return ''.join(tokens)
- patt.add_parse_action(make_palindrome)
- print(patt.parse_string("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl'
- """
- if isinstance(itemseq, ParseResults):
- self.__iadd__(itemseq)
- else:
- self._toklist.extend(itemseq)
-
- def clear(self):
- """
- Clear all elements and results names.
- """
- del self._toklist[:]
- self._tokdict.clear()
-
- def __getattr__(self, name):
- try:
- return self[name]
- except KeyError:
- if name.startswith("__"):
- raise AttributeError(name)
- return ""
-
- def __add__(self, other: "ParseResults") -> "ParseResults":
- ret = self.copy()
- ret += other
- return ret
-
- def __iadd__(self, other: "ParseResults") -> "ParseResults":
- if not other:
- return self
-
- if other._tokdict:
- offset = len(self._toklist)
- addoffset = lambda a: offset if a < 0 else a + offset
- otheritems = other._tokdict.items()
- otherdictitems = [
- (k, _ParseResultsWithOffset(v[0], addoffset(v[1])))
- for k, vlist in otheritems
- for v in vlist
- ]
- for k, v in otherdictitems:
- self[k] = v
- if isinstance(v[0], ParseResults):
- v[0]._parent = self
-
- self._toklist += other._toklist
- self._all_names |= other._all_names
- return self
-
- def __radd__(self, other) -> "ParseResults":
- if isinstance(other, int) and other == 0:
- # useful for merging many ParseResults using sum() builtin
- return self.copy()
- else:
- # this may raise a TypeError - so be it
- return other + self
-
- def __repr__(self) -> str:
- return f"{type(self).__name__}({self._toklist!r}, {self.as_dict()})"
-
- def __str__(self) -> str:
- return (
- "["
- + ", ".join(
- [
- str(i) if isinstance(i, ParseResults) else repr(i)
- for i in self._toklist
- ]
- )
- + "]"
- )
-
- def _asStringList(self, sep=""):
- out = []
- for item in self._toklist:
- if out and sep:
- out.append(sep)
- if isinstance(item, ParseResults):
- out += item._asStringList()
- else:
- out.append(str(item))
- return out
-
- def as_list(self) -> list:
- """
- Returns the parse results as a nested list of matching tokens, all converted to strings.
-
- Example::
-
- patt = Word(alphas)[1, ...]
- result = patt.parse_string("sldkj lsdkj sldkj")
- # even though the result prints in string-like form, it is actually a pyparsing ParseResults
- print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj']
-
- # Use as_list() to create an actual list
- result_list = result.as_list()
- print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj']
- """
- return [
- res.as_list() if isinstance(res, ParseResults) else res
- for res in self._toklist
- ]
-
- def as_dict(self) -> dict:
- """
- Returns the named parse results as a nested dictionary.
-
- Example::
-
- integer = Word(nums)
- date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
-
- result = date_str.parse_string('12/31/1999')
- print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]})
-
- result_dict = result.as_dict()
- print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'}
-
- # even though a ParseResults supports dict-like access, sometime you just need to have a dict
- import json
- print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable
- print(json.dumps(result.as_dict())) # -> {"month": "31", "day": "1999", "year": "12"}
- """
-
- def to_item(obj):
- if isinstance(obj, ParseResults):
- return obj.as_dict() if obj.haskeys() else [to_item(v) for v in obj]
- else:
- return obj
-
- return dict((k, to_item(v)) for k, v in self.items())
-
- def copy(self) -> "ParseResults":
- """
- Returns a new shallow copy of a :class:`ParseResults` object. `ParseResults`
- items contained within the source are shared with the copy. Use
- :class:`ParseResults.deepcopy()` to create a copy with its own separate
- content values.
- """
- ret = ParseResults(self._toklist)
- ret._tokdict = self._tokdict.copy()
- ret._parent = self._parent
- ret._all_names |= self._all_names
- ret._name = self._name
- return ret
-
- def deepcopy(self) -> "ParseResults":
- """
- Returns a new deep copy of a :class:`ParseResults` object.
- """
- ret = self.copy()
- # replace values with copies if they are of known mutable types
- for i, obj in enumerate(self._toklist):
- if isinstance(obj, ParseResults):
- self._toklist[i] = obj.deepcopy()
- elif isinstance(obj, (str, bytes)):
- pass
- elif isinstance(obj, MutableMapping):
- self._toklist[i] = dest = type(obj)()
- for k, v in obj.items():
- dest[k] = v.deepcopy() if isinstance(v, ParseResults) else v
- elif isinstance(obj, Container):
- self._toklist[i] = type(obj)(
- v.deepcopy() if isinstance(v, ParseResults) else v for v in obj
- )
- return ret
-
- def get_name(self):
- r"""
- Returns the results name for this token expression. Useful when several
- different expressions might match at a particular location.
-
- Example::
-
- integer = Word(nums)
- ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d")
- house_number_expr = Suppress('#') + Word(nums, alphanums)
- user_data = (Group(house_number_expr)("house_number")
- | Group(ssn_expr)("ssn")
- | Group(integer)("age"))
- user_info = user_data[1, ...]
-
- result = user_info.parse_string("22 111-22-3333 #221B")
- for item in result:
- print(item.get_name(), ':', item[0])
-
- prints::
-
- age : 22
- ssn : 111-22-3333
- house_number : 221B
- """
- if self._name:
- return self._name
- elif self._parent:
- par: "ParseResults" = self._parent
- parent_tokdict_items = par._tokdict.items()
- return next(
- (
- k
- for k, vlist in parent_tokdict_items
- for v, loc in vlist
- if v is self
- ),
- None,
- )
- elif (
- len(self) == 1
- and len(self._tokdict) == 1
- and next(iter(self._tokdict.values()))[0][1] in (0, -1)
- ):
- return next(iter(self._tokdict.keys()))
- else:
- return None
-
- def dump(self, indent="", full=True, include_list=True, _depth=0) -> str:
- """
- Diagnostic method for listing out the contents of
- a :class:`ParseResults`. Accepts an optional ``indent`` argument so
- that this string can be embedded in a nested display of other data.
-
- Example::
-
- integer = Word(nums)
- date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
-
- result = date_str.parse_string('1999/12/31')
- print(result.dump())
-
- prints::
-
- ['1999', '/', '12', '/', '31']
- - day: '31'
- - month: '12'
- - year: '1999'
- """
- out = []
- NL = "\n"
- out.append(indent + str(self.as_list()) if include_list else "")
-
- if full:
- if self.haskeys():
- items = sorted((str(k), v) for k, v in self.items())
- for k, v in items:
- if out:
- out.append(NL)
- out.append(f"{indent}{(' ' * _depth)}- {k}: ")
- if isinstance(v, ParseResults):
- if v:
- out.append(
- v.dump(
- indent=indent,
- full=full,
- include_list=include_list,
- _depth=_depth + 1,
- )
- )
- else:
- out.append(str(v))
- else:
- out.append(repr(v))
- if any(isinstance(vv, ParseResults) for vv in self):
- v = self
- for i, vv in enumerate(v):
- if isinstance(vv, ParseResults):
- out.append(
- "\n{}{}[{}]:\n{}{}{}".format(
- indent,
- (" " * (_depth)),
- i,
- indent,
- (" " * (_depth + 1)),
- vv.dump(
- indent=indent,
- full=full,
- include_list=include_list,
- _depth=_depth + 1,
- ),
- )
- )
- else:
- out.append(
- "\n%s%s[%d]:\n%s%s%s"
- % (
- indent,
- (" " * (_depth)),
- i,
- indent,
- (" " * (_depth + 1)),
- str(vv),
- )
- )
-
- return "".join(out)
-
- def pprint(self, *args, **kwargs):
- """
- Pretty-printer for parsed results as a list, using the
- `pprint <https://docs.python.org/3/library/pprint.html>`_ module.
- Accepts additional positional or keyword args as defined for
- `pprint.pprint <https://docs.python.org/3/library/pprint.html#pprint.pprint>`_ .
-
- Example::
-
- ident = Word(alphas, alphanums)
- num = Word(nums)
- func = Forward()
- term = ident | num | Group('(' + func + ')')
- func <<= ident + Group(Optional(DelimitedList(term)))
- result = func.parse_string("fna a,b,(fnb c,d,200),100")
- result.pprint(width=40)
-
- prints::
-
- ['fna',
- ['a',
- 'b',
- ['(', 'fnb', ['c', 'd', '200'], ')'],
- '100']]
- """
- pprint.pprint(self.as_list(), *args, **kwargs)
-
- # add support for pickle protocol
- def __getstate__(self):
- return (
- self._toklist,
- (
- self._tokdict.copy(),
- None,
- self._all_names,
- self._name,
- ),
- )
-
- def __setstate__(self, state):
- self._toklist, (self._tokdict, par, inAccumNames, self._name) = state
- self._all_names = set(inAccumNames)
- self._parent = None
-
- def __getnewargs__(self):
- return self._toklist, self._name
-
- def __dir__(self):
- return dir(type(self)) + list(self.keys())
-
- @classmethod
- def from_dict(cls, other, name=None) -> "ParseResults":
- """
- Helper classmethod to construct a ``ParseResults`` from a ``dict``, preserving the
- name-value relations as results names. If an optional ``name`` argument is
- given, a nested ``ParseResults`` will be returned.
- """
-
- def is_iterable(obj):
- try:
- iter(obj)
- except Exception:
- return False
- # str's are iterable, but in pyparsing, we don't want to iterate over them
- else:
- return not isinstance(obj, str_type)
-
- ret = cls([])
- for k, v in other.items():
- if isinstance(v, Mapping):
- ret += cls.from_dict(v, name=k)
- else:
- ret += cls([v], name=k, asList=is_iterable(v))
- if name is not None:
- ret = cls([ret], name=name)
- return ret
-
- asList = as_list
- """Deprecated - use :class:`as_list`"""
- asDict = as_dict
- """Deprecated - use :class:`as_dict`"""
- getName = get_name
- """Deprecated - use :class:`get_name`"""
-
-
-MutableMapping.register(ParseResults)
-MutableSequence.register(ParseResults)
diff --git a/contrib/python/pip/pip/_vendor/pyparsing/testing.py b/contrib/python/pip/pip/_vendor/pyparsing/testing.py
deleted file mode 100644
index 6a254c1c5e..0000000000
--- a/contrib/python/pip/pip/_vendor/pyparsing/testing.py
+++ /dev/null
@@ -1,331 +0,0 @@
-# testing.py
-
-from contextlib import contextmanager
-import typing
-
-from .core import (
- ParserElement,
- ParseException,
- Keyword,
- __diag__,
- __compat__,
-)
-
-
-class pyparsing_test:
- """
- namespace class for classes useful in writing unit tests
- """
-
- class reset_pyparsing_context:
- """
- Context manager to be used when writing unit tests that modify pyparsing config values:
- - packrat parsing
- - bounded recursion parsing
- - default whitespace characters.
- - default keyword characters
- - literal string auto-conversion class
- - __diag__ settings
-
- Example::
-
- with reset_pyparsing_context():
- # test that literals used to construct a grammar are automatically suppressed
- ParserElement.inlineLiteralsUsing(Suppress)
-
- term = Word(alphas) | Word(nums)
- group = Group('(' + term[...] + ')')
-
- # assert that the '()' characters are not included in the parsed tokens
- self.assertParseAndCheckList(group, "(abc 123 def)", ['abc', '123', 'def'])
-
- # after exiting context manager, literals are converted to Literal expressions again
- """
-
- def __init__(self):
- self._save_context = {}
-
- def save(self):
- self._save_context["default_whitespace"] = ParserElement.DEFAULT_WHITE_CHARS
- self._save_context["default_keyword_chars"] = Keyword.DEFAULT_KEYWORD_CHARS
-
- self._save_context[
- "literal_string_class"
- ] = ParserElement._literalStringClass
-
- self._save_context["verbose_stacktrace"] = ParserElement.verbose_stacktrace
-
- self._save_context["packrat_enabled"] = ParserElement._packratEnabled
- if ParserElement._packratEnabled:
- self._save_context[
- "packrat_cache_size"
- ] = ParserElement.packrat_cache.size
- else:
- self._save_context["packrat_cache_size"] = None
- self._save_context["packrat_parse"] = ParserElement._parse
- self._save_context[
- "recursion_enabled"
- ] = ParserElement._left_recursion_enabled
-
- self._save_context["__diag__"] = {
- name: getattr(__diag__, name) for name in __diag__._all_names
- }
-
- self._save_context["__compat__"] = {
- "collect_all_And_tokens": __compat__.collect_all_And_tokens
- }
-
- return self
-
- def restore(self):
- # reset pyparsing global state
- if (
- ParserElement.DEFAULT_WHITE_CHARS
- != self._save_context["default_whitespace"]
- ):
- ParserElement.set_default_whitespace_chars(
- self._save_context["default_whitespace"]
- )
-
- ParserElement.verbose_stacktrace = self._save_context["verbose_stacktrace"]
-
- Keyword.DEFAULT_KEYWORD_CHARS = self._save_context["default_keyword_chars"]
- ParserElement.inlineLiteralsUsing(
- self._save_context["literal_string_class"]
- )
-
- for name, value in self._save_context["__diag__"].items():
- (__diag__.enable if value else __diag__.disable)(name)
-
- ParserElement._packratEnabled = False
- if self._save_context["packrat_enabled"]:
- ParserElement.enable_packrat(self._save_context["packrat_cache_size"])
- else:
- ParserElement._parse = self._save_context["packrat_parse"]
- ParserElement._left_recursion_enabled = self._save_context[
- "recursion_enabled"
- ]
-
- __compat__.collect_all_And_tokens = self._save_context["__compat__"]
-
- return self
-
- def copy(self):
- ret = type(self)()
- ret._save_context.update(self._save_context)
- return ret
-
- def __enter__(self):
- return self.save()
-
- def __exit__(self, *args):
- self.restore()
-
- class TestParseResultsAsserts:
- """
- A mixin class to add parse results assertion methods to normal unittest.TestCase classes.
- """
-
- def assertParseResultsEquals(
- self, result, expected_list=None, expected_dict=None, msg=None
- ):
- """
- Unit test assertion to compare a :class:`ParseResults` object with an optional ``expected_list``,
- and compare any defined results names with an optional ``expected_dict``.
- """
- if expected_list is not None:
- self.assertEqual(expected_list, result.as_list(), msg=msg)
- if expected_dict is not None:
- self.assertEqual(expected_dict, result.as_dict(), msg=msg)
-
- def assertParseAndCheckList(
- self, expr, test_string, expected_list, msg=None, verbose=True
- ):
- """
- Convenience wrapper assert to test a parser element and input string, and assert that
- the resulting ``ParseResults.asList()`` is equal to the ``expected_list``.
- """
- result = expr.parse_string(test_string, parse_all=True)
- if verbose:
- print(result.dump())
- else:
- print(result.as_list())
- self.assertParseResultsEquals(result, expected_list=expected_list, msg=msg)
-
- def assertParseAndCheckDict(
- self, expr, test_string, expected_dict, msg=None, verbose=True
- ):
- """
- Convenience wrapper assert to test a parser element and input string, and assert that
- the resulting ``ParseResults.asDict()`` is equal to the ``expected_dict``.
- """
- result = expr.parse_string(test_string, parseAll=True)
- if verbose:
- print(result.dump())
- else:
- print(result.as_list())
- self.assertParseResultsEquals(result, expected_dict=expected_dict, msg=msg)
-
- def assertRunTestResults(
- self, run_tests_report, expected_parse_results=None, msg=None
- ):
- """
- Unit test assertion to evaluate output of ``ParserElement.runTests()``. If a list of
- list-dict tuples is given as the ``expected_parse_results`` argument, then these are zipped
- with the report tuples returned by ``runTests`` and evaluated using ``assertParseResultsEquals``.
- Finally, asserts that the overall ``runTests()`` success value is ``True``.
-
- :param run_tests_report: tuple(bool, [tuple(str, ParseResults or Exception)]) returned from runTests
- :param expected_parse_results (optional): [tuple(str, list, dict, Exception)]
- """
- run_test_success, run_test_results = run_tests_report
-
- if expected_parse_results is not None:
- merged = [
- (*rpt, expected)
- for rpt, expected in zip(run_test_results, expected_parse_results)
- ]
- for test_string, result, expected in merged:
- # expected should be a tuple containing a list and/or a dict or an exception,
- # and optional failure message string
- # an empty tuple will skip any result validation
- fail_msg = next(
- (exp for exp in expected if isinstance(exp, str)), None
- )
- expected_exception = next(
- (
- exp
- for exp in expected
- if isinstance(exp, type) and issubclass(exp, Exception)
- ),
- None,
- )
- if expected_exception is not None:
- with self.assertRaises(
- expected_exception=expected_exception, msg=fail_msg or msg
- ):
- if isinstance(result, Exception):
- raise result
- else:
- expected_list = next(
- (exp for exp in expected if isinstance(exp, list)), None
- )
- expected_dict = next(
- (exp for exp in expected if isinstance(exp, dict)), None
- )
- if (expected_list, expected_dict) != (None, None):
- self.assertParseResultsEquals(
- result,
- expected_list=expected_list,
- expected_dict=expected_dict,
- msg=fail_msg or msg,
- )
- else:
- # warning here maybe?
- print(f"no validation for {test_string!r}")
-
- # do this last, in case some specific test results can be reported instead
- self.assertTrue(
- run_test_success, msg=msg if msg is not None else "failed runTests"
- )
-
- @contextmanager
- def assertRaisesParseException(self, exc_type=ParseException, msg=None):
- with self.assertRaises(exc_type, msg=msg):
- yield
-
- @staticmethod
- def with_line_numbers(
- s: str,
- start_line: typing.Optional[int] = None,
- end_line: typing.Optional[int] = None,
- expand_tabs: bool = True,
- eol_mark: str = "|",
- mark_spaces: typing.Optional[str] = None,
- mark_control: typing.Optional[str] = None,
- ) -> str:
- """
- Helpful method for debugging a parser - prints a string with line and column numbers.
- (Line and column numbers are 1-based.)
-
- :param s: tuple(bool, str - string to be printed with line and column numbers
- :param start_line: int - (optional) starting line number in s to print (default=1)
- :param end_line: int - (optional) ending line number in s to print (default=len(s))
- :param expand_tabs: bool - (optional) expand tabs to spaces, to match the pyparsing default
- :param eol_mark: str - (optional) string to mark the end of lines, helps visualize trailing spaces (default="|")
- :param mark_spaces: str - (optional) special character to display in place of spaces
- :param mark_control: str - (optional) convert non-printing control characters to a placeholding
- character; valid values:
- - "unicode" - replaces control chars with Unicode symbols, such as "␍" and "␊"
- - any single character string - replace control characters with given string
- - None (default) - string is displayed as-is
-
- :return: str - input string with leading line numbers and column number headers
- """
- if expand_tabs:
- s = s.expandtabs()
- if mark_control is not None:
- mark_control = typing.cast(str, mark_control)
- if mark_control == "unicode":
- transtable_map = {
- c: u for c, u in zip(range(0, 33), range(0x2400, 0x2433))
- }
- transtable_map[127] = 0x2421
- tbl = str.maketrans(transtable_map)
- eol_mark = ""
- else:
- ord_mark_control = ord(mark_control)
- tbl = str.maketrans(
- {c: ord_mark_control for c in list(range(0, 32)) + [127]}
- )
- s = s.translate(tbl)
- if mark_spaces is not None and mark_spaces != " ":
- if mark_spaces == "unicode":
- tbl = str.maketrans({9: 0x2409, 32: 0x2423})
- s = s.translate(tbl)
- else:
- s = s.replace(" ", mark_spaces)
- if start_line is None:
- start_line = 1
- if end_line is None:
- end_line = len(s)
- end_line = min(end_line, len(s))
- start_line = min(max(1, start_line), end_line)
-
- if mark_control != "unicode":
- s_lines = s.splitlines()[start_line - 1 : end_line]
- else:
- s_lines = [line + "␊" for line in s.split("␊")[start_line - 1 : end_line]]
- if not s_lines:
- return ""
-
- lineno_width = len(str(end_line))
- max_line_len = max(len(line) for line in s_lines)
- lead = " " * (lineno_width + 1)
- if max_line_len >= 99:
- header0 = (
- lead
- + "".join(
- f"{' ' * 99}{(i + 1) % 100}"
- for i in range(max(max_line_len // 100, 1))
- )
- + "\n"
- )
- else:
- header0 = ""
- header1 = (
- header0
- + lead
- + "".join(f" {(i + 1) % 10}" for i in range(-(-max_line_len // 10)))
- + "\n"
- )
- header2 = lead + "1234567890" * (-(-max_line_len // 10)) + "\n"
- return (
- header1
- + header2
- + "\n".join(
- f"{i:{lineno_width}d}:{line}{eol_mark}"
- for i, line in enumerate(s_lines, start=start_line)
- )
- + "\n"
- )
diff --git a/contrib/python/pip/pip/_vendor/pyparsing/unicode.py b/contrib/python/pip/pip/_vendor/pyparsing/unicode.py
deleted file mode 100644
index ec0b3a4fe6..0000000000
--- a/contrib/python/pip/pip/_vendor/pyparsing/unicode.py
+++ /dev/null
@@ -1,361 +0,0 @@
-# unicode.py
-
-import sys
-from itertools import filterfalse
-from typing import List, Tuple, Union
-
-
-class _lazyclassproperty:
- def __init__(self, fn):
- self.fn = fn
- self.__doc__ = fn.__doc__
- self.__name__ = fn.__name__
-
- def __get__(self, obj, cls):
- if cls is None:
- cls = type(obj)
- if not hasattr(cls, "_intern") or any(
- cls._intern is getattr(superclass, "_intern", [])
- for superclass in cls.__mro__[1:]
- ):
- cls._intern = {}
- attrname = self.fn.__name__
- if attrname not in cls._intern:
- cls._intern[attrname] = self.fn(cls)
- return cls._intern[attrname]
-
-
-UnicodeRangeList = List[Union[Tuple[int, int], Tuple[int]]]
-
-
-class unicode_set:
- """
- A set of Unicode characters, for language-specific strings for
- ``alphas``, ``nums``, ``alphanums``, and ``printables``.
- A unicode_set is defined by a list of ranges in the Unicode character
- set, in a class attribute ``_ranges``. Ranges can be specified using
- 2-tuples or a 1-tuple, such as::
-
- _ranges = [
- (0x0020, 0x007e),
- (0x00a0, 0x00ff),
- (0x0100,),
- ]
-
- Ranges are left- and right-inclusive. A 1-tuple of (x,) is treated as (x, x).
-
- A unicode set can also be defined using multiple inheritance of other unicode sets::
-
- class CJK(Chinese, Japanese, Korean):
- pass
- """
-
- _ranges: UnicodeRangeList = []
-
- @_lazyclassproperty
- def _chars_for_ranges(cls):
- ret = []
- for cc in cls.__mro__:
- if cc is unicode_set:
- break
- for rr in getattr(cc, "_ranges", ()):
- ret.extend(range(rr[0], rr[-1] + 1))
- return [chr(c) for c in sorted(set(ret))]
-
- @_lazyclassproperty
- def printables(cls):
- """all non-whitespace characters in this range"""
- return "".join(filterfalse(str.isspace, cls._chars_for_ranges))
-
- @_lazyclassproperty
- def alphas(cls):
- """all alphabetic characters in this range"""
- return "".join(filter(str.isalpha, cls._chars_for_ranges))
-
- @_lazyclassproperty
- def nums(cls):
- """all numeric digit characters in this range"""
- return "".join(filter(str.isdigit, cls._chars_for_ranges))
-
- @_lazyclassproperty
- def alphanums(cls):
- """all alphanumeric characters in this range"""
- return cls.alphas + cls.nums
-
- @_lazyclassproperty
- def identchars(cls):
- """all characters in this range that are valid identifier characters, plus underscore '_'"""
- return "".join(
- sorted(
- set(
- "".join(filter(str.isidentifier, cls._chars_for_ranges))
- + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzªµº"
- + "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ"
- + "_"
- )
- )
- )
-
- @_lazyclassproperty
- def identbodychars(cls):
- """
- all characters in this range that are valid identifier body characters,
- plus the digits 0-9, and · (Unicode MIDDLE DOT)
- """
- return "".join(
- sorted(
- set(
- cls.identchars
- + "0123456789·"
- + "".join(
- [c for c in cls._chars_for_ranges if ("_" + c).isidentifier()]
- )
- )
- )
- )
-
- @_lazyclassproperty
- def identifier(cls):
- """
- a pyparsing Word expression for an identifier using this range's definitions for
- identchars and identbodychars
- """
- from pip._vendor.pyparsing import Word
-
- return Word(cls.identchars, cls.identbodychars)
-
-
-class pyparsing_unicode(unicode_set):
- """
- A namespace class for defining common language unicode_sets.
- """
-
- # fmt: off
-
- # define ranges in language character sets
- _ranges: UnicodeRangeList = [
- (0x0020, sys.maxunicode),
- ]
-
- class BasicMultilingualPlane(unicode_set):
- """Unicode set for the Basic Multilingual Plane"""
- _ranges: UnicodeRangeList = [
- (0x0020, 0xFFFF),
- ]
-
- class Latin1(unicode_set):
- """Unicode set for Latin-1 Unicode Character Range"""
- _ranges: UnicodeRangeList = [
- (0x0020, 0x007E),
- (0x00A0, 0x00FF),
- ]
-
- class LatinA(unicode_set):
- """Unicode set for Latin-A Unicode Character Range"""
- _ranges: UnicodeRangeList = [
- (0x0100, 0x017F),
- ]
-
- class LatinB(unicode_set):
- """Unicode set for Latin-B Unicode Character Range"""
- _ranges: UnicodeRangeList = [
- (0x0180, 0x024F),
- ]
-
- class Greek(unicode_set):
- """Unicode set for Greek Unicode Character Ranges"""
- _ranges: UnicodeRangeList = [
- (0x0342, 0x0345),
- (0x0370, 0x0377),
- (0x037A, 0x037F),
- (0x0384, 0x038A),
- (0x038C,),
- (0x038E, 0x03A1),
- (0x03A3, 0x03E1),
- (0x03F0, 0x03FF),
- (0x1D26, 0x1D2A),
- (0x1D5E,),
- (0x1D60,),
- (0x1D66, 0x1D6A),
- (0x1F00, 0x1F15),
- (0x1F18, 0x1F1D),
- (0x1F20, 0x1F45),
- (0x1F48, 0x1F4D),
- (0x1F50, 0x1F57),
- (0x1F59,),
- (0x1F5B,),
- (0x1F5D,),
- (0x1F5F, 0x1F7D),
- (0x1F80, 0x1FB4),
- (0x1FB6, 0x1FC4),
- (0x1FC6, 0x1FD3),
- (0x1FD6, 0x1FDB),
- (0x1FDD, 0x1FEF),
- (0x1FF2, 0x1FF4),
- (0x1FF6, 0x1FFE),
- (0x2129,),
- (0x2719, 0x271A),
- (0xAB65,),
- (0x10140, 0x1018D),
- (0x101A0,),
- (0x1D200, 0x1D245),
- (0x1F7A1, 0x1F7A7),
- ]
-
- class Cyrillic(unicode_set):
- """Unicode set for Cyrillic Unicode Character Range"""
- _ranges: UnicodeRangeList = [
- (0x0400, 0x052F),
- (0x1C80, 0x1C88),
- (0x1D2B,),
- (0x1D78,),
- (0x2DE0, 0x2DFF),
- (0xA640, 0xA672),
- (0xA674, 0xA69F),
- (0xFE2E, 0xFE2F),
- ]
-
- class Chinese(unicode_set):
- """Unicode set for Chinese Unicode Character Range"""
- _ranges: UnicodeRangeList = [
- (0x2E80, 0x2E99),
- (0x2E9B, 0x2EF3),
- (0x31C0, 0x31E3),
- (0x3400, 0x4DB5),
- (0x4E00, 0x9FEF),
- (0xA700, 0xA707),
- (0xF900, 0xFA6D),
- (0xFA70, 0xFAD9),
- (0x16FE2, 0x16FE3),
- (0x1F210, 0x1F212),
- (0x1F214, 0x1F23B),
- (0x1F240, 0x1F248),
- (0x20000, 0x2A6D6),
- (0x2A700, 0x2B734),
- (0x2B740, 0x2B81D),
- (0x2B820, 0x2CEA1),
- (0x2CEB0, 0x2EBE0),
- (0x2F800, 0x2FA1D),
- ]
-
- class Japanese(unicode_set):
- """Unicode set for Japanese Unicode Character Range, combining Kanji, Hiragana, and Katakana ranges"""
-
- class Kanji(unicode_set):
- "Unicode set for Kanji Unicode Character Range"
- _ranges: UnicodeRangeList = [
- (0x4E00, 0x9FBF),
- (0x3000, 0x303F),
- ]
-
- class Hiragana(unicode_set):
- """Unicode set for Hiragana Unicode Character Range"""
- _ranges: UnicodeRangeList = [
- (0x3041, 0x3096),
- (0x3099, 0x30A0),
- (0x30FC,),
- (0xFF70,),
- (0x1B001,),
- (0x1B150, 0x1B152),
- (0x1F200,),
- ]
-
- class Katakana(unicode_set):
- """Unicode set for Katakana Unicode Character Range"""
- _ranges: UnicodeRangeList = [
- (0x3099, 0x309C),
- (0x30A0, 0x30FF),
- (0x31F0, 0x31FF),
- (0x32D0, 0x32FE),
- (0xFF65, 0xFF9F),
- (0x1B000,),
- (0x1B164, 0x1B167),
- (0x1F201, 0x1F202),
- (0x1F213,),
- ]
-
- 漢字 = Kanji
- カタカナ = Katakana
- ひらがな = Hiragana
-
- _ranges = (
- Kanji._ranges
- + Hiragana._ranges
- + Katakana._ranges
- )
-
- class Hangul(unicode_set):
- """Unicode set for Hangul (Korean) Unicode Character Range"""
- _ranges: UnicodeRangeList = [
- (0x1100, 0x11FF),
- (0x302E, 0x302F),
- (0x3131, 0x318E),
- (0x3200, 0x321C),
- (0x3260, 0x327B),
- (0x327E,),
- (0xA960, 0xA97C),
- (0xAC00, 0xD7A3),
- (0xD7B0, 0xD7C6),
- (0xD7CB, 0xD7FB),
- (0xFFA0, 0xFFBE),
- (0xFFC2, 0xFFC7),
- (0xFFCA, 0xFFCF),
- (0xFFD2, 0xFFD7),
- (0xFFDA, 0xFFDC),
- ]
-
- Korean = Hangul
-
- class CJK(Chinese, Japanese, Hangul):
- """Unicode set for combined Chinese, Japanese, and Korean (CJK) Unicode Character Range"""
-
- class Thai(unicode_set):
- """Unicode set for Thai Unicode Character Range"""
- _ranges: UnicodeRangeList = [
- (0x0E01, 0x0E3A),
- (0x0E3F, 0x0E5B)
- ]
-
- class Arabic(unicode_set):
- """Unicode set for Arabic Unicode Character Range"""
- _ranges: UnicodeRangeList = [
- (0x0600, 0x061B),
- (0x061E, 0x06FF),
- (0x0700, 0x077F),
- ]
-
- class Hebrew(unicode_set):
- """Unicode set for Hebrew Unicode Character Range"""
- _ranges: UnicodeRangeList = [
- (0x0591, 0x05C7),
- (0x05D0, 0x05EA),
- (0x05EF, 0x05F4),
- (0xFB1D, 0xFB36),
- (0xFB38, 0xFB3C),
- (0xFB3E,),
- (0xFB40, 0xFB41),
- (0xFB43, 0xFB44),
- (0xFB46, 0xFB4F),
- ]
-
- class Devanagari(unicode_set):
- """Unicode set for Devanagari Unicode Character Range"""
- _ranges: UnicodeRangeList = [
- (0x0900, 0x097F),
- (0xA8E0, 0xA8FF)
- ]
-
- BMP = BasicMultilingualPlane
-
- # add language identifiers using language Unicode
- العربية = Arabic
- 中文 = Chinese
- кириллица = Cyrillic
- Ελληνικά = Greek
- עִברִית = Hebrew
- 日本語 = Japanese
- 한국어 = Korean
- ไทย = Thai
- देवनागरी = Devanagari
-
- # fmt: on
diff --git a/contrib/python/pip/pip/_vendor/pyparsing/util.py b/contrib/python/pip/pip/_vendor/pyparsing/util.py
deleted file mode 100644
index d8d3f414cc..0000000000
--- a/contrib/python/pip/pip/_vendor/pyparsing/util.py
+++ /dev/null
@@ -1,284 +0,0 @@
-# util.py
-import inspect
-import warnings
-import types
-import collections
-import itertools
-from functools import lru_cache, wraps
-from typing import Callable, List, Union, Iterable, TypeVar, cast
-
-_bslash = chr(92)
-C = TypeVar("C", bound=Callable)
-
-
-class __config_flags:
- """Internal class for defining compatibility and debugging flags"""
-
- _all_names: List[str] = []
- _fixed_names: List[str] = []
- _type_desc = "configuration"
-
- @classmethod
- def _set(cls, dname, value):
- if dname in cls._fixed_names:
- warnings.warn(
- f"{cls.__name__}.{dname} {cls._type_desc} is {str(getattr(cls, dname)).upper()}"
- f" and cannot be overridden",
- stacklevel=3,
- )
- return
- if dname in cls._all_names:
- setattr(cls, dname, value)
- else:
- raise ValueError(f"no such {cls._type_desc} {dname!r}")
-
- enable = classmethod(lambda cls, name: cls._set(name, True))
- disable = classmethod(lambda cls, name: cls._set(name, False))
-
-
-@lru_cache(maxsize=128)
-def col(loc: int, strg: str) -> int:
- """
- Returns current column within a string, counting newlines as line separators.
- The first column is number 1.
-
- Note: the default parsing behavior is to expand tabs in the input string
- before starting the parsing process. See
- :class:`ParserElement.parse_string` for more
- information on parsing strings containing ``<TAB>`` s, and suggested
- methods to maintain a consistent view of the parsed string, the parse
- location, and line and column positions within the parsed string.
- """
- s = strg
- return 1 if 0 < loc < len(s) and s[loc - 1] == "\n" else loc - s.rfind("\n", 0, loc)
-
-
-@lru_cache(maxsize=128)
-def lineno(loc: int, strg: str) -> int:
- """Returns current line number within a string, counting newlines as line separators.
- The first line is number 1.
-
- Note - the default parsing behavior is to expand tabs in the input string
- before starting the parsing process. See :class:`ParserElement.parse_string`
- for more information on parsing strings containing ``<TAB>`` s, and
- suggested methods to maintain a consistent view of the parsed string, the
- parse location, and line and column positions within the parsed string.
- """
- return strg.count("\n", 0, loc) + 1
-
-
-@lru_cache(maxsize=128)
-def line(loc: int, strg: str) -> str:
- """
- Returns the line of text containing loc within a string, counting newlines as line separators.
- """
- last_cr = strg.rfind("\n", 0, loc)
- next_cr = strg.find("\n", loc)
- return strg[last_cr + 1 : next_cr] if next_cr >= 0 else strg[last_cr + 1 :]
-
-
-class _UnboundedCache:
- def __init__(self):
- cache = {}
- cache_get = cache.get
- self.not_in_cache = not_in_cache = object()
-
- def get(_, key):
- return cache_get(key, not_in_cache)
-
- def set_(_, key, value):
- cache[key] = value
-
- def clear(_):
- cache.clear()
-
- self.size = None
- self.get = types.MethodType(get, self)
- self.set = types.MethodType(set_, self)
- self.clear = types.MethodType(clear, self)
-
-
-class _FifoCache:
- def __init__(self, size):
- self.not_in_cache = not_in_cache = object()
- cache = {}
- keyring = [object()] * size
- cache_get = cache.get
- cache_pop = cache.pop
- keyiter = itertools.cycle(range(size))
-
- def get(_, key):
- return cache_get(key, not_in_cache)
-
- def set_(_, key, value):
- cache[key] = value
- i = next(keyiter)
- cache_pop(keyring[i], None)
- keyring[i] = key
-
- def clear(_):
- cache.clear()
- keyring[:] = [object()] * size
-
- self.size = size
- self.get = types.MethodType(get, self)
- self.set = types.MethodType(set_, self)
- self.clear = types.MethodType(clear, self)
-
-
-class LRUMemo:
- """
- A memoizing mapping that retains `capacity` deleted items
-
- The memo tracks retained items by their access order; once `capacity` items
- are retained, the least recently used item is discarded.
- """
-
- def __init__(self, capacity):
- self._capacity = capacity
- self._active = {}
- self._memory = collections.OrderedDict()
-
- def __getitem__(self, key):
- try:
- return self._active[key]
- except KeyError:
- self._memory.move_to_end(key)
- return self._memory[key]
-
- def __setitem__(self, key, value):
- self._memory.pop(key, None)
- self._active[key] = value
-
- def __delitem__(self, key):
- try:
- value = self._active.pop(key)
- except KeyError:
- pass
- else:
- while len(self._memory) >= self._capacity:
- self._memory.popitem(last=False)
- self._memory[key] = value
-
- def clear(self):
- self._active.clear()
- self._memory.clear()
-
-
-class UnboundedMemo(dict):
- """
- A memoizing mapping that retains all deleted items
- """
-
- def __delitem__(self, key):
- pass
-
-
-def _escape_regex_range_chars(s: str) -> str:
- # escape these chars: ^-[]
- for c in r"\^-[]":
- s = s.replace(c, _bslash + c)
- s = s.replace("\n", r"\n")
- s = s.replace("\t", r"\t")
- return str(s)
-
-
-def _collapse_string_to_ranges(
- s: Union[str, Iterable[str]], re_escape: bool = True
-) -> str:
- def is_consecutive(c):
- c_int = ord(c)
- is_consecutive.prev, prev = c_int, is_consecutive.prev
- if c_int - prev > 1:
- is_consecutive.value = next(is_consecutive.counter)
- return is_consecutive.value
-
- is_consecutive.prev = 0 # type: ignore [attr-defined]
- is_consecutive.counter = itertools.count() # type: ignore [attr-defined]
- is_consecutive.value = -1 # type: ignore [attr-defined]
-
- def escape_re_range_char(c):
- return "\\" + c if c in r"\^-][" else c
-
- def no_escape_re_range_char(c):
- return c
-
- if not re_escape:
- escape_re_range_char = no_escape_re_range_char
-
- ret = []
- s = "".join(sorted(set(s)))
- if len(s) > 3:
- for _, chars in itertools.groupby(s, key=is_consecutive):
- first = last = next(chars)
- last = collections.deque(
- itertools.chain(iter([last]), chars), maxlen=1
- ).pop()
- if first == last:
- ret.append(escape_re_range_char(first))
- else:
- sep = "" if ord(last) == ord(first) + 1 else "-"
- ret.append(
- f"{escape_re_range_char(first)}{sep}{escape_re_range_char(last)}"
- )
- else:
- ret = [escape_re_range_char(c) for c in s]
-
- return "".join(ret)
-
-
-def _flatten(ll: list) -> list:
- ret = []
- for i in ll:
- if isinstance(i, list):
- ret.extend(_flatten(i))
- else:
- ret.append(i)
- return ret
-
-
-def _make_synonym_function(compat_name: str, fn: C) -> C:
- # In a future version, uncomment the code in the internal _inner() functions
- # to begin emitting DeprecationWarnings.
-
- # Unwrap staticmethod/classmethod
- fn = getattr(fn, "__func__", fn)
-
- # (Presence of 'self' arg in signature is used by explain_exception() methods, so we take
- # some extra steps to add it if present in decorated function.)
- if "self" == list(inspect.signature(fn).parameters)[0]:
-
- @wraps(fn)
- def _inner(self, *args, **kwargs):
- # warnings.warn(
- # f"Deprecated - use {fn.__name__}", DeprecationWarning, stacklevel=3
- # )
- return fn(self, *args, **kwargs)
-
- else:
-
- @wraps(fn)
- def _inner(*args, **kwargs):
- # warnings.warn(
- # f"Deprecated - use {fn.__name__}", DeprecationWarning, stacklevel=3
- # )
- return fn(*args, **kwargs)
-
- _inner.__doc__ = f"""Deprecated - use :class:`{fn.__name__}`"""
- _inner.__name__ = compat_name
- _inner.__annotations__ = fn.__annotations__
- if isinstance(fn, types.FunctionType):
- _inner.__kwdefaults__ = fn.__kwdefaults__
- elif isinstance(fn, type) and hasattr(fn, "__init__"):
- _inner.__kwdefaults__ = fn.__init__.__kwdefaults__
- else:
- _inner.__kwdefaults__ = None
- _inner.__qualname__ = fn.__qualname__
- return cast(C, _inner)
-
-
-def replaced_by_pep8(fn: C) -> Callable[[Callable], C]:
- """
- Decorator for pre-PEP8 compatibility synonyms, to link them to the new function.
- """
- return lambda other: _make_synonym_function(other.__name__, fn)
diff --git a/contrib/python/pip/pip/_vendor/requests/__init__.py b/contrib/python/pip/pip/_vendor/requests/__init__.py
index 10ff67ff4d..04230fc8d9 100644
--- a/contrib/python/pip/pip/_vendor/requests/__init__.py
+++ b/contrib/python/pip/pip/_vendor/requests/__init__.py
@@ -45,11 +45,7 @@ from pip._vendor import urllib3
from .exceptions import RequestsDependencyWarning
charset_normalizer_version = None
-
-try:
- from pip._vendor.chardet import __version__ as chardet_version
-except ImportError:
- chardet_version = None
+chardet_version = None
def check_compatibility(urllib3_version, chardet_version, charset_normalizer_version):
@@ -80,7 +76,8 @@ def check_compatibility(urllib3_version, chardet_version, charset_normalizer_ver
# charset_normalizer >= 2.0.0 < 4.0.0
assert (2, 0, 0) <= (major, minor, patch) < (4, 0, 0)
else:
- raise Exception("You need either charset_normalizer or chardet installed")
+ # pip does not need or use character detection
+ pass
def _check_cryptography(cryptography_version):
diff --git a/contrib/python/pip/pip/_vendor/requests/__version__.py b/contrib/python/pip/pip/_vendor/requests/__version__.py
index 5063c3f8ee..1ac168734e 100644
--- a/contrib/python/pip/pip/_vendor/requests/__version__.py
+++ b/contrib/python/pip/pip/_vendor/requests/__version__.py
@@ -5,10 +5,10 @@
__title__ = "requests"
__description__ = "Python HTTP for Humans."
__url__ = "https://requests.readthedocs.io"
-__version__ = "2.31.0"
-__build__ = 0x023100
+__version__ = "2.32.0"
+__build__ = 0x023200
__author__ = "Kenneth Reitz"
__author_email__ = "me@kennethreitz.org"
-__license__ = "Apache 2.0"
+__license__ = "Apache-2.0"
__copyright__ = "Copyright Kenneth Reitz"
__cake__ = "\u2728 \U0001f370 \u2728"
diff --git a/contrib/python/pip/pip/_vendor/requests/adapters.py b/contrib/python/pip/pip/_vendor/requests/adapters.py
index 10c176790b..4d9d9c6306 100644
--- a/contrib/python/pip/pip/_vendor/requests/adapters.py
+++ b/contrib/python/pip/pip/_vendor/requests/adapters.py
@@ -8,6 +8,7 @@ and maintain connections.
import os.path
import socket # noqa: F401
+import typing
from pip._vendor.urllib3.exceptions import ClosedPoolError, ConnectTimeoutError
from pip._vendor.urllib3.exceptions import HTTPError as _HTTPError
@@ -25,6 +26,7 @@ from pip._vendor.urllib3.poolmanager import PoolManager, proxy_from_url
from pip._vendor.urllib3.util import Timeout as TimeoutSauce
from pip._vendor.urllib3.util import parse_url
from pip._vendor.urllib3.util.retry import Retry
+from pip._vendor.urllib3.util.ssl_ import create_urllib3_context
from .auth import _basic_auth_str
from .compat import basestring, urlparse
@@ -61,11 +63,57 @@ except ImportError:
raise InvalidSchema("Missing dependencies for SOCKS support.")
+if typing.TYPE_CHECKING:
+ from .models import PreparedRequest
+
+
DEFAULT_POOLBLOCK = False
DEFAULT_POOLSIZE = 10
DEFAULT_RETRIES = 0
DEFAULT_POOL_TIMEOUT = None
+_preloaded_ssl_context = create_urllib3_context()
+_preloaded_ssl_context.load_verify_locations(
+ extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH)
+)
+
+
+def _urllib3_request_context(
+ request: "PreparedRequest",
+ verify: "bool | str | None",
+ client_cert: "typing.Tuple[str, str] | str | None",
+) -> "(typing.Dict[str, typing.Any], typing.Dict[str, typing.Any])":
+ host_params = {}
+ pool_kwargs = {}
+ parsed_request_url = urlparse(request.url)
+ scheme = parsed_request_url.scheme.lower()
+ port = parsed_request_url.port
+ cert_reqs = "CERT_REQUIRED"
+ if verify is False:
+ cert_reqs = "CERT_NONE"
+ elif verify is True:
+ pool_kwargs["ssl_context"] = _preloaded_ssl_context
+ elif isinstance(verify, str):
+ if not os.path.isdir(verify):
+ pool_kwargs["ca_certs"] = verify
+ else:
+ pool_kwargs["ca_cert_dir"] = verify
+ pool_kwargs["cert_reqs"] = cert_reqs
+ if client_cert is not None:
+ if isinstance(client_cert, tuple) and len(client_cert) == 2:
+ pool_kwargs["cert_file"] = client_cert[0]
+ pool_kwargs["key_file"] = client_cert[1]
+ else:
+ # According to our docs, we allow users to specify just the client
+ # cert path
+ pool_kwargs["cert_file"] = client_cert
+ host_params = {
+ "scheme": scheme,
+ "host": parsed_request_url.hostname,
+ "port": port,
+ }
+ return host_params, pool_kwargs
+
class BaseAdapter:
"""The Base Transport Adapter"""
@@ -247,28 +295,26 @@ class HTTPAdapter(BaseAdapter):
:param cert: The SSL certificate to verify.
"""
if url.lower().startswith("https") and verify:
+ conn.cert_reqs = "CERT_REQUIRED"
- cert_loc = None
-
- # Allow self-specified cert location.
+ # Only load the CA certificates if 'verify' is a string indicating the CA bundle to use.
+ # Otherwise, if verify is a boolean, we don't load anything since
+ # the connection will be using a context with the default certificates already loaded,
+ # and this avoids a call to the slow load_verify_locations()
if verify is not True:
+ # `verify` must be a str with a path then
cert_loc = verify
- if not cert_loc:
- cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH)
+ if not os.path.exists(cert_loc):
+ raise OSError(
+ f"Could not find a suitable TLS CA certificate bundle, "
+ f"invalid path: {cert_loc}"
+ )
- if not cert_loc or not os.path.exists(cert_loc):
- raise OSError(
- f"Could not find a suitable TLS CA certificate bundle, "
- f"invalid path: {cert_loc}"
- )
-
- conn.cert_reqs = "CERT_REQUIRED"
-
- if not os.path.isdir(cert_loc):
- conn.ca_certs = cert_loc
- else:
- conn.ca_cert_dir = cert_loc
+ if not os.path.isdir(cert_loc):
+ conn.ca_certs = cert_loc
+ else:
+ conn.ca_cert_dir = cert_loc
else:
conn.cert_reqs = "CERT_NONE"
conn.ca_certs = None
@@ -328,6 +374,35 @@ class HTTPAdapter(BaseAdapter):
return response
+ def _get_connection(self, request, verify, proxies=None, cert=None):
+ # Replace the existing get_connection without breaking things and
+ # ensure that TLS settings are considered when we interact with
+ # urllib3 HTTP Pools
+ proxy = select_proxy(request.url, proxies)
+ try:
+ host_params, pool_kwargs = _urllib3_request_context(request, verify, cert)
+ except ValueError as e:
+ raise InvalidURL(e, request=request)
+ if proxy:
+ proxy = prepend_scheme_if_needed(proxy, "http")
+ proxy_url = parse_url(proxy)
+ if not proxy_url.host:
+ raise InvalidProxyURL(
+ "Please check proxy URL. It is malformed "
+ "and could be missing the host."
+ )
+ proxy_manager = self.proxy_manager_for(proxy)
+ conn = proxy_manager.connection_from_host(
+ **host_params, pool_kwargs=pool_kwargs
+ )
+ else:
+ # Only scheme should be lower case
+ conn = self.poolmanager.connection_from_host(
+ **host_params, pool_kwargs=pool_kwargs
+ )
+
+ return conn
+
def get_connection(self, url, proxies=None):
"""Returns a urllib3 connection for the given URL. This should not be
called from user code, and is only exposed for use when subclassing the
@@ -391,6 +466,9 @@ class HTTPAdapter(BaseAdapter):
using_socks_proxy = proxy_scheme.startswith("socks")
url = request.path_url
+ if url.startswith("//"): # Don't confuse urllib3
+ url = f"/{url.lstrip('/')}"
+
if is_proxied_http_request and not using_socks_proxy:
url = urldefragauth(request.url)
@@ -451,7 +529,7 @@ class HTTPAdapter(BaseAdapter):
"""
try:
- conn = self.get_connection(request.url, proxies)
+ conn = self._get_connection(request, verify, proxies=proxies, cert=cert)
except LocationValueError as e:
raise InvalidURL(e, request=request)
diff --git a/contrib/python/pip/pip/_vendor/requests/api.py b/contrib/python/pip/pip/_vendor/requests/api.py
index cd0b3eeac3..5960744552 100644
--- a/contrib/python/pip/pip/_vendor/requests/api.py
+++ b/contrib/python/pip/pip/_vendor/requests/api.py
@@ -25,7 +25,7 @@ def request(method, url, **kwargs):
:param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`.
:param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload.
``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')``
- or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string
+ or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content_type'`` is a string
defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers
to add for the file.
:param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth.
diff --git a/contrib/python/pip/pip/_vendor/requests/auth.py b/contrib/python/pip/pip/_vendor/requests/auth.py
index 9733686ddb..4a7ce6dc14 100644
--- a/contrib/python/pip/pip/_vendor/requests/auth.py
+++ b/contrib/python/pip/pip/_vendor/requests/auth.py
@@ -258,7 +258,6 @@ class HTTPDigestAuth(AuthBase):
s_auth = r.headers.get("www-authenticate", "")
if "digest" in s_auth.lower() and self._thread_local.num_401_calls < 2:
-
self._thread_local.num_401_calls += 1
pat = re.compile(r"digest ", flags=re.IGNORECASE)
self._thread_local.chal = parse_dict_header(pat.sub("", s_auth, count=1))
diff --git a/contrib/python/pip/pip/_vendor/requests/compat.py b/contrib/python/pip/pip/_vendor/requests/compat.py
index 9ab2bb4865..7081da756a 100644
--- a/contrib/python/pip/pip/_vendor/requests/compat.py
+++ b/contrib/python/pip/pip/_vendor/requests/compat.py
@@ -7,10 +7,21 @@ between Python 2 and Python 3. It remains for backwards
compatibility until the next major version.
"""
-from pip._vendor import chardet
-
import sys
+# -------------------
+# Character Detection
+# -------------------
+
+
+def _resolve_char_detection():
+ """Find supported character detection libraries."""
+ chardet = None
+ return chardet
+
+
+chardet = _resolve_char_detection()
+
# -------
# Pythons
# -------
diff --git a/contrib/python/pip/pip/_vendor/requests/cookies.py b/contrib/python/pip/pip/_vendor/requests/cookies.py
index bf54ab237e..f69d0cda9e 100644
--- a/contrib/python/pip/pip/_vendor/requests/cookies.py
+++ b/contrib/python/pip/pip/_vendor/requests/cookies.py
@@ -2,7 +2,7 @@
requests.cookies
~~~~~~~~~~~~~~~~
-Compatibility code to be able to use `cookielib.CookieJar` with requests.
+Compatibility code to be able to use `http.cookiejar.CookieJar` with requests.
requests.utils imports from here, so be careful with imports.
"""
@@ -23,7 +23,7 @@ except ImportError:
class MockRequest:
"""Wraps a `requests.Request` to mimic a `urllib2.Request`.
- The code in `cookielib.CookieJar` expects this interface in order to correctly
+ The code in `http.cookiejar.CookieJar` expects this interface in order to correctly
manage cookie policies, i.e., determine whether a cookie can be set, given the
domains of the request and the cookie.
@@ -76,7 +76,7 @@ class MockRequest:
return self._r.headers.get(name, self._new_headers.get(name, default))
def add_header(self, key, val):
- """cookielib has no legitimate use for this method; add it back if you find one."""
+ """cookiejar has no legitimate use for this method; add it back if you find one."""
raise NotImplementedError(
"Cookie headers should be added with add_unredirected_header()"
)
@@ -104,11 +104,11 @@ class MockResponse:
"""Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`.
...what? Basically, expose the parsed HTTP headers from the server response
- the way `cookielib` expects to see them.
+ the way `http.cookiejar` expects to see them.
"""
def __init__(self, headers):
- """Make a MockResponse for `cookielib` to read.
+ """Make a MockResponse for `cookiejar` to read.
:param headers: a httplib.HTTPMessage or analogous carrying the headers
"""
@@ -124,7 +124,7 @@ class MockResponse:
def extract_cookies_to_jar(jar, request, response):
"""Extract the cookies from the response into a CookieJar.
- :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar)
+ :param jar: http.cookiejar.CookieJar (not necessarily a RequestsCookieJar)
:param request: our own requests.Request object
:param response: urllib3.HTTPResponse object
"""
@@ -174,7 +174,7 @@ class CookieConflictError(RuntimeError):
class RequestsCookieJar(cookielib.CookieJar, MutableMapping):
- """Compatibility class; is a cookielib.CookieJar, but exposes a dict
+ """Compatibility class; is a http.cookiejar.CookieJar, but exposes a dict
interface.
This is the CookieJar we create by default for requests and sessions that
@@ -341,7 +341,7 @@ class RequestsCookieJar(cookielib.CookieJar, MutableMapping):
self.set(name, value)
def __delitem__(self, name):
- """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s
+ """Deletes a cookie given a name. Wraps ``http.cookiejar.CookieJar``'s
``remove_cookie_by_name()``.
"""
remove_cookie_by_name(self, name)
diff --git a/contrib/python/pip/pip/_vendor/requests/exceptions.py b/contrib/python/pip/pip/_vendor/requests/exceptions.py
index 168d07390d..7f3660f00d 100644
--- a/contrib/python/pip/pip/_vendor/requests/exceptions.py
+++ b/contrib/python/pip/pip/_vendor/requests/exceptions.py
@@ -41,6 +41,16 @@ class JSONDecodeError(InvalidJSONError, CompatJSONDecodeError):
CompatJSONDecodeError.__init__(self, *args)
InvalidJSONError.__init__(self, *self.args, **kwargs)
+ def __reduce__(self):
+ """
+ The __reduce__ method called when pickling the object must
+ be the one from the JSONDecodeError (be it json/simplejson)
+ as it expects all the arguments for instantiation, not just
+ one like the IOError, and the MRO would by default call the
+ __reduce__ method from the IOError due to the inheritance order.
+ """
+ return CompatJSONDecodeError.__reduce__(self)
+
class HTTPError(RequestException):
"""An HTTP error occurred."""
diff --git a/contrib/python/pip/pip/_vendor/requests/help.py b/contrib/python/pip/pip/_vendor/requests/help.py
index 2d292c2f06..ddbb6150d6 100644
--- a/contrib/python/pip/pip/_vendor/requests/help.py
+++ b/contrib/python/pip/pip/_vendor/requests/help.py
@@ -11,11 +11,7 @@ from pip._vendor import urllib3
from . import __version__ as requests_version
charset_normalizer = None
-
-try:
- from pip._vendor import chardet
-except ImportError:
- chardet = None
+chardet = None
try:
from pip._vendor.urllib3.contrib import pyopenssl
diff --git a/contrib/python/pip/pip/_vendor/requests/models.py b/contrib/python/pip/pip/_vendor/requests/models.py
index 76e6f199c0..85a008cfb5 100644
--- a/contrib/python/pip/pip/_vendor/requests/models.py
+++ b/contrib/python/pip/pip/_vendor/requests/models.py
@@ -170,7 +170,7 @@ class RequestEncodingMixin:
)
)
- for (k, v) in files:
+ for k, v in files:
# support for explicit filename
ft = None
fh = None
@@ -268,7 +268,6 @@ class Request(RequestHooksMixin):
hooks=None,
json=None,
):
-
# Default empty dicts for dict params.
data = [] if data is None else data
files = [] if files is None else files
@@ -277,7 +276,7 @@ class Request(RequestHooksMixin):
hooks = {} if hooks is None else hooks
self.hooks = default_hooks()
- for (k, v) in list(hooks.items()):
+ for k, v in list(hooks.items()):
self.register_hook(event=k, hook=v)
self.method = method
@@ -790,7 +789,12 @@ class Response:
@property
def apparent_encoding(self):
"""The apparent encoding, provided by the charset_normalizer or chardet libraries."""
- return chardet.detect(self.content)["encoding"]
+ if chardet is not None:
+ return chardet.detect(self.content)["encoding"]
+ else:
+ # If no character detection library is available, we'll fall back
+ # to a standard Python utf-8 str.
+ return "utf-8"
def iter_content(self, chunk_size=1, decode_unicode=False):
"""Iterates over the response data. When stream=True is set on the
@@ -865,7 +869,6 @@ class Response:
for chunk in self.iter_content(
chunk_size=chunk_size, decode_unicode=decode_unicode
):
-
if pending is not None:
chunk = pending + chunk
diff --git a/contrib/python/pip/pip/_vendor/requests/packages.py b/contrib/python/pip/pip/_vendor/requests/packages.py
index 9582fa730f..200c38287f 100644
--- a/contrib/python/pip/pip/_vendor/requests/packages.py
+++ b/contrib/python/pip/pip/_vendor/requests/packages.py
@@ -1,9 +1,11 @@
import sys
+from .compat import chardet
+
# This code exists for backwards compatibility reasons.
# I don't like it either. Just look the other way. :)
-for package in ('urllib3', 'idna', 'chardet'):
+for package in ("urllib3", "idna"):
vendored_package = "pip._vendor." + package
locals()[package] = __import__(vendored_package)
# This traversal is apparently necessary such that the identities are
@@ -13,4 +15,11 @@ for package in ('urllib3', 'idna', 'chardet'):
unprefixed_mod = mod[len("pip._vendor."):]
sys.modules['pip._vendor.requests.packages.' + unprefixed_mod] = sys.modules[mod]
-# Kinda cool, though, right?
+if chardet is not None:
+ target = chardet.__name__
+ for mod in list(sys.modules):
+ if mod == target or mod.startswith(f"{target}."):
+ imported_mod = sys.modules[mod]
+ sys.modules[f"requests.packages.{mod}"] = imported_mod
+ mod = mod.replace(target, "chardet")
+ sys.modules[f"requests.packages.{mod}"] = imported_mod
diff --git a/contrib/python/pip/pip/_vendor/requests/sessions.py b/contrib/python/pip/pip/_vendor/requests/sessions.py
index dbcf2a7b0e..b387bc36df 100644
--- a/contrib/python/pip/pip/_vendor/requests/sessions.py
+++ b/contrib/python/pip/pip/_vendor/requests/sessions.py
@@ -262,7 +262,6 @@ class SessionRedirectMixin:
if yield_requests:
yield req
else:
-
resp = self.send(
req,
stream=stream,
@@ -326,7 +325,7 @@ class SessionRedirectMixin:
# urllib3 handles proxy authorization for us in the standard adapter.
# Avoid appending this to TLS tunneled requests where it may be leaked.
- if not scheme.startswith('https') and username and password:
+ if not scheme.startswith("https") and username and password:
headers["Proxy-Authorization"] = _basic_auth_str(username, password)
return new_proxies
@@ -389,7 +388,6 @@ class Session(SessionRedirectMixin):
]
def __init__(self):
-
#: A case-insensitive dictionary of headers to be sent on each
#: :class:`Request <Request>` sent from this
#: :class:`Session <Session>`.
@@ -545,6 +543,8 @@ class Session(SessionRedirectMixin):
:type allow_redirects: bool
:param proxies: (optional) Dictionary mapping protocol or protocol and
hostname to the URL of the proxy.
+ :param hooks: (optional) Dictionary mapping hook name to one event or
+ list of events, event must be callable.
:param stream: (optional) whether to immediately download the response
content. Defaults to ``False``.
:param verify: (optional) Either a boolean, in which case it controls whether we verify
@@ -711,7 +711,6 @@ class Session(SessionRedirectMixin):
# Persist cookies
if r.history:
-
# If the hooks create history then we want those cookies too
for resp in r.history:
extract_cookies_to_jar(self.cookies, resp.request, resp.raw)
@@ -759,7 +758,7 @@ class Session(SessionRedirectMixin):
# Set environment's proxies.
no_proxy = proxies.get("no_proxy") if proxies is not None else None
env_proxies = get_environ_proxies(url, no_proxy=no_proxy)
- for (k, v) in env_proxies.items():
+ for k, v in env_proxies.items():
proxies.setdefault(k, v)
# Look for requests environment configuration
@@ -785,8 +784,7 @@ class Session(SessionRedirectMixin):
:rtype: requests.adapters.BaseAdapter
"""
- for (prefix, adapter) in self.adapters.items():
-
+ for prefix, adapter in self.adapters.items():
if url.lower().startswith(prefix.lower()):
return adapter
diff --git a/contrib/python/pip/pip/_vendor/requests/status_codes.py b/contrib/python/pip/pip/_vendor/requests/status_codes.py
index 4bd072be97..c7945a2f06 100644
--- a/contrib/python/pip/pip/_vendor/requests/status_codes.py
+++ b/contrib/python/pip/pip/_vendor/requests/status_codes.py
@@ -24,7 +24,7 @@ _codes = {
# Informational.
100: ("continue",),
101: ("switching_protocols",),
- 102: ("processing",),
+ 102: ("processing", "early-hints"),
103: ("checkpoint",),
122: ("uri_too_long", "request_uri_too_long"),
200: ("ok", "okay", "all_ok", "all_okay", "all_good", "\\o/", "✓"),
@@ -65,8 +65,8 @@ _codes = {
410: ("gone",),
411: ("length_required",),
412: ("precondition_failed", "precondition"),
- 413: ("request_entity_too_large",),
- 414: ("request_uri_too_large",),
+ 413: ("request_entity_too_large", "content_too_large"),
+ 414: ("request_uri_too_large", "uri_too_long"),
415: ("unsupported_media_type", "unsupported_media", "media_type"),
416: (
"requested_range_not_satisfiable",
@@ -76,10 +76,10 @@ _codes = {
417: ("expectation_failed",),
418: ("im_a_teapot", "teapot", "i_am_a_teapot"),
421: ("misdirected_request",),
- 422: ("unprocessable_entity", "unprocessable"),
+ 422: ("unprocessable_entity", "unprocessable", "unprocessable_content"),
423: ("locked",),
424: ("failed_dependency", "dependency"),
- 425: ("unordered_collection", "unordered"),
+ 425: ("unordered_collection", "unordered", "too_early"),
426: ("upgrade_required", "upgrade"),
428: ("precondition_required", "precondition"),
429: ("too_many_requests", "too_many"),
diff --git a/contrib/python/pip/pip/_vendor/requests/utils.py b/contrib/python/pip/pip/_vendor/requests/utils.py
index 36607eda2e..a35ce47866 100644
--- a/contrib/python/pip/pip/_vendor/requests/utils.py
+++ b/contrib/python/pip/pip/_vendor/requests/utils.py
@@ -97,6 +97,8 @@ if sys.platform == "win32":
# '<local>' string by the localhost entry and the corresponding
# canonical entry.
proxyOverride = proxyOverride.split(";")
+ # filter out empty strings to avoid re.match return true in the following code.
+ proxyOverride = filter(None, proxyOverride)
# now check if we match one of the registry values.
for test in proxyOverride:
if test == "<local>":
@@ -134,6 +136,9 @@ def super_len(o):
total_length = None
current_position = 0
+ if isinstance(o, str):
+ o = o.encode("utf-8")
+
if hasattr(o, "__len__"):
total_length = len(o)
@@ -466,11 +471,7 @@ def dict_from_cookiejar(cj):
:rtype: dict
"""
- cookie_dict = {}
-
- for cookie in cj:
- cookie_dict[cookie.name] = cookie.value
-
+ cookie_dict = {cookie.name: cookie.value for cookie in cj}
return cookie_dict
@@ -767,6 +768,7 @@ def should_bypass_proxies(url, no_proxy):
:rtype: bool
"""
+
# Prioritize lowercase environment variables over uppercase
# to keep a consistent behaviour with other http projects (curl, wget).
def get_proxy(key):
@@ -862,7 +864,7 @@ def select_proxy(url, proxies):
def resolve_proxies(request, proxies, trust_env=True):
"""This method takes proxy information from a request and configuration
input to resolve a mapping of target proxies. This will consider settings
- such a NO_PROXY to strip proxy configurations.
+ such as NO_PROXY to strip proxy configurations.
:param request: Request or PreparedRequest
:param proxies: A dictionary of schemes or schemes and hosts to proxy URLs
@@ -1054,7 +1056,7 @@ def _validate_header_part(header, header_part, header_validator_index):
if not validator.match(header_part):
header_kind = "name" if header_validator_index == 0 else "value"
raise InvalidHeader(
- f"Invalid leading whitespace, reserved character(s), or return"
+ f"Invalid leading whitespace, reserved character(s), or return "
f"character(s) in header {header_kind}: {header_part!r}"
)
diff --git a/contrib/python/pip/pip/_vendor/rich/__main__.py b/contrib/python/pip/pip/_vendor/rich/__main__.py
index 270629fd80..efb7fb79bf 100644
--- a/contrib/python/pip/pip/_vendor/rich/__main__.py
+++ b/contrib/python/pip/pip/_vendor/rich/__main__.py
@@ -207,7 +207,6 @@ Supports much of the *markdown* __syntax__!
if __name__ == "__main__": # pragma: no cover
-
console = Console(
file=io.StringIO(),
force_terminal=True,
diff --git a/contrib/python/pip/pip/_vendor/rich/_cell_widths.py b/contrib/python/pip/pip/_vendor/rich/_cell_widths.py
index 36286df379..608ae3a75d 100644
--- a/contrib/python/pip/pip/_vendor/rich/_cell_widths.py
+++ b/contrib/python/pip/pip/_vendor/rich/_cell_widths.py
@@ -4,6 +4,7 @@ CELL_WIDTHS = [
(0, 0, 0),
(1, 31, -1),
(127, 159, -1),
+ (173, 173, 0),
(768, 879, 0),
(1155, 1161, 0),
(1425, 1469, 0),
@@ -11,13 +12,16 @@ CELL_WIDTHS = [
(1473, 1474, 0),
(1476, 1477, 0),
(1479, 1479, 0),
+ (1536, 1541, 0),
(1552, 1562, 0),
+ (1564, 1564, 0),
(1611, 1631, 0),
(1648, 1648, 0),
- (1750, 1756, 0),
+ (1750, 1757, 0),
(1759, 1764, 0),
(1767, 1768, 0),
(1770, 1773, 0),
+ (1807, 1807, 0),
(1809, 1809, 0),
(1840, 1866, 0),
(1958, 1968, 0),
@@ -28,149 +32,137 @@ CELL_WIDTHS = [
(2085, 2087, 0),
(2089, 2093, 0),
(2137, 2139, 0),
- (2259, 2273, 0),
- (2275, 2306, 0),
- (2362, 2362, 0),
- (2364, 2364, 0),
- (2369, 2376, 0),
- (2381, 2381, 0),
+ (2192, 2193, 0),
+ (2200, 2207, 0),
+ (2250, 2307, 0),
+ (2362, 2364, 0),
+ (2366, 2383, 0),
(2385, 2391, 0),
(2402, 2403, 0),
- (2433, 2433, 0),
+ (2433, 2435, 0),
(2492, 2492, 0),
- (2497, 2500, 0),
- (2509, 2509, 0),
+ (2494, 2500, 0),
+ (2503, 2504, 0),
+ (2507, 2509, 0),
+ (2519, 2519, 0),
(2530, 2531, 0),
(2558, 2558, 0),
- (2561, 2562, 0),
+ (2561, 2563, 0),
(2620, 2620, 0),
- (2625, 2626, 0),
+ (2622, 2626, 0),
(2631, 2632, 0),
(2635, 2637, 0),
(2641, 2641, 0),
(2672, 2673, 0),
(2677, 2677, 0),
- (2689, 2690, 0),
+ (2689, 2691, 0),
(2748, 2748, 0),
- (2753, 2757, 0),
- (2759, 2760, 0),
- (2765, 2765, 0),
+ (2750, 2757, 0),
+ (2759, 2761, 0),
+ (2763, 2765, 0),
(2786, 2787, 0),
(2810, 2815, 0),
- (2817, 2817, 0),
+ (2817, 2819, 0),
(2876, 2876, 0),
- (2879, 2879, 0),
- (2881, 2884, 0),
- (2893, 2893, 0),
- (2901, 2902, 0),
+ (2878, 2884, 0),
+ (2887, 2888, 0),
+ (2891, 2893, 0),
+ (2901, 2903, 0),
(2914, 2915, 0),
(2946, 2946, 0),
- (3008, 3008, 0),
- (3021, 3021, 0),
- (3072, 3072, 0),
- (3076, 3076, 0),
- (3134, 3136, 0),
+ (3006, 3010, 0),
+ (3014, 3016, 0),
+ (3018, 3021, 0),
+ (3031, 3031, 0),
+ (3072, 3076, 0),
+ (3132, 3132, 0),
+ (3134, 3140, 0),
(3142, 3144, 0),
(3146, 3149, 0),
(3157, 3158, 0),
(3170, 3171, 0),
- (3201, 3201, 0),
+ (3201, 3203, 0),
(3260, 3260, 0),
- (3263, 3263, 0),
- (3270, 3270, 0),
- (3276, 3277, 0),
+ (3262, 3268, 0),
+ (3270, 3272, 0),
+ (3274, 3277, 0),
+ (3285, 3286, 0),
(3298, 3299, 0),
- (3328, 3329, 0),
+ (3315, 3315, 0),
+ (3328, 3331, 0),
(3387, 3388, 0),
- (3393, 3396, 0),
- (3405, 3405, 0),
+ (3390, 3396, 0),
+ (3398, 3400, 0),
+ (3402, 3405, 0),
+ (3415, 3415, 0),
(3426, 3427, 0),
- (3457, 3457, 0),
+ (3457, 3459, 0),
(3530, 3530, 0),
- (3538, 3540, 0),
+ (3535, 3540, 0),
(3542, 3542, 0),
+ (3544, 3551, 0),
+ (3570, 3571, 0),
(3633, 3633, 0),
(3636, 3642, 0),
(3655, 3662, 0),
(3761, 3761, 0),
(3764, 3772, 0),
- (3784, 3789, 0),
+ (3784, 3790, 0),
(3864, 3865, 0),
(3893, 3893, 0),
(3895, 3895, 0),
(3897, 3897, 0),
- (3953, 3966, 0),
- (3968, 3972, 0),
+ (3902, 3903, 0),
+ (3953, 3972, 0),
(3974, 3975, 0),
(3981, 3991, 0),
(3993, 4028, 0),
(4038, 4038, 0),
- (4141, 4144, 0),
- (4146, 4151, 0),
- (4153, 4154, 0),
- (4157, 4158, 0),
- (4184, 4185, 0),
+ (4139, 4158, 0),
+ (4182, 4185, 0),
(4190, 4192, 0),
+ (4194, 4196, 0),
+ (4199, 4205, 0),
(4209, 4212, 0),
- (4226, 4226, 0),
- (4229, 4230, 0),
- (4237, 4237, 0),
- (4253, 4253, 0),
+ (4226, 4237, 0),
+ (4239, 4239, 0),
+ (4250, 4253, 0),
(4352, 4447, 2),
+ (4448, 4607, 0),
(4957, 4959, 0),
- (5906, 5908, 0),
+ (5906, 5909, 0),
(5938, 5940, 0),
(5970, 5971, 0),
(6002, 6003, 0),
- (6068, 6069, 0),
- (6071, 6077, 0),
- (6086, 6086, 0),
- (6089, 6099, 0),
+ (6068, 6099, 0),
(6109, 6109, 0),
- (6155, 6157, 0),
+ (6155, 6159, 0),
(6277, 6278, 0),
(6313, 6313, 0),
- (6432, 6434, 0),
- (6439, 6440, 0),
- (6450, 6450, 0),
- (6457, 6459, 0),
- (6679, 6680, 0),
- (6683, 6683, 0),
- (6742, 6742, 0),
- (6744, 6750, 0),
- (6752, 6752, 0),
- (6754, 6754, 0),
- (6757, 6764, 0),
- (6771, 6780, 0),
+ (6432, 6443, 0),
+ (6448, 6459, 0),
+ (6679, 6683, 0),
+ (6741, 6750, 0),
+ (6752, 6780, 0),
(6783, 6783, 0),
- (6832, 6848, 0),
- (6912, 6915, 0),
- (6964, 6964, 0),
- (6966, 6970, 0),
- (6972, 6972, 0),
- (6978, 6978, 0),
+ (6832, 6862, 0),
+ (6912, 6916, 0),
+ (6964, 6980, 0),
(7019, 7027, 0),
- (7040, 7041, 0),
- (7074, 7077, 0),
- (7080, 7081, 0),
- (7083, 7085, 0),
- (7142, 7142, 0),
- (7144, 7145, 0),
- (7149, 7149, 0),
- (7151, 7153, 0),
- (7212, 7219, 0),
- (7222, 7223, 0),
+ (7040, 7042, 0),
+ (7073, 7085, 0),
+ (7142, 7155, 0),
+ (7204, 7223, 0),
(7376, 7378, 0),
- (7380, 7392, 0),
- (7394, 7400, 0),
+ (7380, 7400, 0),
(7405, 7405, 0),
(7412, 7412, 0),
- (7416, 7417, 0),
- (7616, 7673, 0),
- (7675, 7679, 0),
+ (7415, 7417, 0),
+ (7616, 7679, 0),
(8203, 8207, 0),
(8232, 8238, 0),
- (8288, 8291, 0),
+ (8288, 8292, 0),
+ (8294, 8303, 0),
(8400, 8432, 0),
(8986, 8987, 2),
(9001, 9002, 2),
@@ -212,17 +204,16 @@ CELL_WIDTHS = [
(11904, 11929, 2),
(11931, 12019, 2),
(12032, 12245, 2),
- (12272, 12283, 2),
- (12288, 12329, 2),
- (12330, 12333, 0),
- (12334, 12350, 2),
+ (12272, 12329, 2),
+ (12330, 12335, 0),
+ (12336, 12350, 2),
(12353, 12438, 2),
(12441, 12442, 0),
(12443, 12543, 2),
(12549, 12591, 2),
(12593, 12686, 2),
(12688, 12771, 2),
- (12784, 12830, 2),
+ (12783, 12830, 2),
(12832, 12871, 2),
(12880, 19903, 2),
(19968, 42124, 2),
@@ -234,36 +225,33 @@ CELL_WIDTHS = [
(43010, 43010, 0),
(43014, 43014, 0),
(43019, 43019, 0),
- (43045, 43046, 0),
+ (43043, 43047, 0),
(43052, 43052, 0),
- (43204, 43205, 0),
+ (43136, 43137, 0),
+ (43188, 43205, 0),
(43232, 43249, 0),
(43263, 43263, 0),
(43302, 43309, 0),
- (43335, 43345, 0),
+ (43335, 43347, 0),
(43360, 43388, 2),
- (43392, 43394, 0),
- (43443, 43443, 0),
- (43446, 43449, 0),
- (43452, 43453, 0),
+ (43392, 43395, 0),
+ (43443, 43456, 0),
(43493, 43493, 0),
- (43561, 43566, 0),
- (43569, 43570, 0),
- (43573, 43574, 0),
+ (43561, 43574, 0),
(43587, 43587, 0),
- (43596, 43596, 0),
- (43644, 43644, 0),
+ (43596, 43597, 0),
+ (43643, 43645, 0),
(43696, 43696, 0),
(43698, 43700, 0),
(43703, 43704, 0),
(43710, 43711, 0),
(43713, 43713, 0),
- (43756, 43757, 0),
- (43766, 43766, 0),
- (44005, 44005, 0),
- (44008, 44008, 0),
- (44013, 44013, 0),
+ (43755, 43759, 0),
+ (43765, 43766, 0),
+ (44003, 44010, 0),
+ (44012, 44013, 0),
(44032, 55203, 2),
+ (55216, 55295, 0),
(63744, 64255, 2),
(64286, 64286, 0),
(65024, 65039, 0),
@@ -272,8 +260,10 @@ CELL_WIDTHS = [
(65072, 65106, 2),
(65108, 65126, 2),
(65128, 65131, 2),
+ (65279, 65279, 0),
(65281, 65376, 2),
(65504, 65510, 2),
+ (65529, 65531, 0),
(66045, 66045, 0),
(66272, 66272, 0),
(66422, 66426, 0),
@@ -285,102 +275,108 @@ CELL_WIDTHS = [
(68325, 68326, 0),
(68900, 68903, 0),
(69291, 69292, 0),
+ (69373, 69375, 0),
(69446, 69456, 0),
- (69633, 69633, 0),
+ (69506, 69509, 0),
+ (69632, 69634, 0),
(69688, 69702, 0),
- (69759, 69761, 0),
- (69811, 69814, 0),
- (69817, 69818, 0),
+ (69744, 69744, 0),
+ (69747, 69748, 0),
+ (69759, 69762, 0),
+ (69808, 69818, 0),
+ (69821, 69821, 0),
+ (69826, 69826, 0),
+ (69837, 69837, 0),
(69888, 69890, 0),
- (69927, 69931, 0),
- (69933, 69940, 0),
+ (69927, 69940, 0),
+ (69957, 69958, 0),
(70003, 70003, 0),
- (70016, 70017, 0),
- (70070, 70078, 0),
+ (70016, 70018, 0),
+ (70067, 70080, 0),
(70089, 70092, 0),
- (70095, 70095, 0),
- (70191, 70193, 0),
- (70196, 70196, 0),
- (70198, 70199, 0),
+ (70094, 70095, 0),
+ (70188, 70199, 0),
(70206, 70206, 0),
- (70367, 70367, 0),
- (70371, 70378, 0),
- (70400, 70401, 0),
+ (70209, 70209, 0),
+ (70367, 70378, 0),
+ (70400, 70403, 0),
(70459, 70460, 0),
- (70464, 70464, 0),
+ (70462, 70468, 0),
+ (70471, 70472, 0),
+ (70475, 70477, 0),
+ (70487, 70487, 0),
+ (70498, 70499, 0),
(70502, 70508, 0),
(70512, 70516, 0),
- (70712, 70719, 0),
- (70722, 70724, 0),
- (70726, 70726, 0),
+ (70709, 70726, 0),
(70750, 70750, 0),
- (70835, 70840, 0),
- (70842, 70842, 0),
- (70847, 70848, 0),
- (70850, 70851, 0),
- (71090, 71093, 0),
- (71100, 71101, 0),
- (71103, 71104, 0),
+ (70832, 70851, 0),
+ (71087, 71093, 0),
+ (71096, 71104, 0),
(71132, 71133, 0),
- (71219, 71226, 0),
- (71229, 71229, 0),
- (71231, 71232, 0),
- (71339, 71339, 0),
- (71341, 71341, 0),
- (71344, 71349, 0),
- (71351, 71351, 0),
- (71453, 71455, 0),
- (71458, 71461, 0),
- (71463, 71467, 0),
- (71727, 71735, 0),
- (71737, 71738, 0),
- (71995, 71996, 0),
- (71998, 71998, 0),
- (72003, 72003, 0),
- (72148, 72151, 0),
- (72154, 72155, 0),
- (72160, 72160, 0),
+ (71216, 71232, 0),
+ (71339, 71351, 0),
+ (71453, 71467, 0),
+ (71724, 71738, 0),
+ (71984, 71989, 0),
+ (71991, 71992, 0),
+ (71995, 71998, 0),
+ (72000, 72000, 0),
+ (72002, 72003, 0),
+ (72145, 72151, 0),
+ (72154, 72160, 0),
+ (72164, 72164, 0),
(72193, 72202, 0),
- (72243, 72248, 0),
+ (72243, 72249, 0),
(72251, 72254, 0),
(72263, 72263, 0),
- (72273, 72278, 0),
- (72281, 72283, 0),
- (72330, 72342, 0),
- (72344, 72345, 0),
- (72752, 72758, 0),
- (72760, 72765, 0),
- (72767, 72767, 0),
+ (72273, 72283, 0),
+ (72330, 72345, 0),
+ (72751, 72758, 0),
+ (72760, 72767, 0),
(72850, 72871, 0),
- (72874, 72880, 0),
- (72882, 72883, 0),
- (72885, 72886, 0),
+ (72873, 72886, 0),
(73009, 73014, 0),
(73018, 73018, 0),
(73020, 73021, 0),
(73023, 73029, 0),
(73031, 73031, 0),
+ (73098, 73102, 0),
(73104, 73105, 0),
- (73109, 73109, 0),
- (73111, 73111, 0),
- (73459, 73460, 0),
+ (73107, 73111, 0),
+ (73459, 73462, 0),
+ (73472, 73473, 0),
+ (73475, 73475, 0),
+ (73524, 73530, 0),
+ (73534, 73538, 0),
+ (78896, 78912, 0),
+ (78919, 78933, 0),
(92912, 92916, 0),
(92976, 92982, 0),
(94031, 94031, 0),
+ (94033, 94087, 0),
(94095, 94098, 0),
(94176, 94179, 2),
(94180, 94180, 0),
- (94192, 94193, 2),
+ (94192, 94193, 0),
(94208, 100343, 2),
(100352, 101589, 2),
(101632, 101640, 2),
- (110592, 110878, 2),
+ (110576, 110579, 2),
+ (110581, 110587, 2),
+ (110589, 110590, 2),
+ (110592, 110882, 2),
+ (110898, 110898, 2),
(110928, 110930, 2),
+ (110933, 110933, 2),
(110948, 110951, 2),
(110960, 111355, 2),
(113821, 113822, 0),
- (119143, 119145, 0),
- (119163, 119170, 0),
+ (113824, 113827, 0),
+ (118528, 118573, 0),
+ (118576, 118598, 0),
+ (119141, 119145, 0),
+ (119149, 119170, 0),
(119173, 119179, 0),
(119210, 119213, 0),
(119362, 119364, 0),
@@ -395,8 +391,11 @@ CELL_WIDTHS = [
(122907, 122913, 0),
(122915, 122916, 0),
(122918, 122922, 0),
+ (123023, 123023, 0),
(123184, 123190, 0),
+ (123566, 123566, 0),
(123628, 123631, 0),
+ (124140, 124143, 0),
(125136, 125142, 0),
(125252, 125258, 0),
(126980, 126980, 2),
@@ -416,7 +415,9 @@ CELL_WIDTHS = [
(127951, 127955, 2),
(127968, 127984, 2),
(127988, 127988, 2),
- (127992, 128062, 2),
+ (127992, 127994, 2),
+ (127995, 127999, 0),
+ (128000, 128062, 2),
(128064, 128064, 2),
(128066, 128252, 2),
(128255, 128317, 2),
@@ -430,22 +431,24 @@ CELL_WIDTHS = [
(128716, 128716, 2),
(128720, 128722, 2),
(128725, 128727, 2),
+ (128732, 128735, 2),
(128747, 128748, 2),
(128756, 128764, 2),
(128992, 129003, 2),
+ (129008, 129008, 2),
(129292, 129338, 2),
(129340, 129349, 2),
- (129351, 129400, 2),
- (129402, 129483, 2),
- (129485, 129535, 2),
- (129648, 129652, 2),
- (129656, 129658, 2),
- (129664, 129670, 2),
- (129680, 129704, 2),
- (129712, 129718, 2),
- (129728, 129730, 2),
- (129744, 129750, 2),
+ (129351, 129535, 2),
+ (129648, 129660, 2),
+ (129664, 129672, 2),
+ (129680, 129725, 2),
+ (129727, 129733, 2),
+ (129742, 129755, 2),
+ (129760, 129768, 2),
+ (129776, 129784, 2),
(131072, 196605, 2),
(196608, 262141, 2),
+ (917505, 917505, 0),
+ (917536, 917631, 0),
(917760, 917999, 0),
]
diff --git a/contrib/python/pip/pip/_vendor/rich/_export_format.py b/contrib/python/pip/pip/_vendor/rich/_export_format.py
index 094d2dc226..e7527e52f6 100644
--- a/contrib/python/pip/pip/_vendor/rich/_export_format.py
+++ b/contrib/python/pip/pip/_vendor/rich/_export_format.py
@@ -1,5 +1,6 @@
CONSOLE_HTML_FORMAT = """\
<!DOCTYPE html>
+<html>
<head>
<meta charset="UTF-8">
<style>
@@ -10,9 +11,8 @@ body {{
}}
</style>
</head>
-<html>
<body>
- <pre style="font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace"><code>{code}</code></pre>
+ <pre style="font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace"><code style="font-family:inherit">{code}</code></pre>
</body>
</html>
"""
diff --git a/contrib/python/pip/pip/_vendor/rich/_ratio.py b/contrib/python/pip/pip/_vendor/rich/_ratio.py
index e8a3a674e0..95267b0cb6 100644
--- a/contrib/python/pip/pip/_vendor/rich/_ratio.py
+++ b/contrib/python/pip/pip/_vendor/rich/_ratio.py
@@ -151,7 +151,6 @@ if __name__ == "__main__":
@dataclass
class E:
-
size: Optional[int] = None
ratio: int = 1
minimum_size: int = 1
diff --git a/contrib/python/pip/pip/_vendor/rich/_windows.py b/contrib/python/pip/pip/_vendor/rich/_windows.py
index 10fc0d7e9f..7520a9f90a 100644
--- a/contrib/python/pip/pip/_vendor/rich/_windows.py
+++ b/contrib/python/pip/pip/_vendor/rich/_windows.py
@@ -30,7 +30,6 @@ try:
)
except (AttributeError, ImportError, ValueError):
-
# Fallback if we can't load the Windows DLL
def get_windows_console_features() -> WindowsConsoleFeatures:
features = WindowsConsoleFeatures()
diff --git a/contrib/python/pip/pip/_vendor/rich/_wrap.py b/contrib/python/pip/pip/_vendor/rich/_wrap.py
index c45f193f74..2e94ff6f43 100644
--- a/contrib/python/pip/pip/_vendor/rich/_wrap.py
+++ b/contrib/python/pip/pip/_vendor/rich/_wrap.py
@@ -1,5 +1,7 @@
+from __future__ import annotations
+
import re
-from typing import Iterable, List, Tuple
+from typing import Iterable
from ._loop import loop_last
from .cells import cell_len, chop_cells
@@ -7,7 +9,11 @@ from .cells import cell_len, chop_cells
re_word = re.compile(r"\s*\S+\s*")
-def words(text: str) -> Iterable[Tuple[int, int, str]]:
+def words(text: str) -> Iterable[tuple[int, int, str]]:
+ """Yields each word from the text as a tuple
+ containing (start_index, end_index, word). A "word" in this context may
+ include the actual word and any whitespace to the right.
+ """
position = 0
word_match = re_word.match(text, position)
while word_match is not None:
@@ -17,35 +23,59 @@ def words(text: str) -> Iterable[Tuple[int, int, str]]:
word_match = re_word.match(text, end)
-def divide_line(text: str, width: int, fold: bool = True) -> List[int]:
- divides: List[int] = []
- append = divides.append
- line_position = 0
+def divide_line(text: str, width: int, fold: bool = True) -> list[int]:
+ """Given a string of text, and a width (measured in cells), return a list
+ of cell offsets which the string should be split at in order for it to fit
+ within the given width.
+
+ Args:
+ text: The text to examine.
+ width: The available cell width.
+ fold: If True, words longer than `width` will be folded onto a new line.
+
+ Returns:
+ A list of indices to break the line at.
+ """
+ break_positions: list[int] = [] # offsets to insert the breaks at
+ append = break_positions.append
+ cell_offset = 0
_cell_len = cell_len
+
for start, _end, word in words(text):
word_length = _cell_len(word.rstrip())
- if line_position + word_length > width:
+ remaining_space = width - cell_offset
+ word_fits_remaining_space = remaining_space >= word_length
+
+ if word_fits_remaining_space:
+ # Simplest case - the word fits within the remaining width for this line.
+ cell_offset += _cell_len(word)
+ else:
+ # Not enough space remaining for this word on the current line.
if word_length > width:
+ # The word doesn't fit on any line, so we can't simply
+ # place it on the next line...
if fold:
- chopped_words = chop_cells(word, max_size=width, position=0)
- for last, line in loop_last(chopped_words):
+ # Fold the word across multiple lines.
+ folded_word = chop_cells(word, width=width)
+ for last, line in loop_last(folded_word):
if start:
append(start)
-
if last:
- line_position = _cell_len(line)
+ cell_offset = _cell_len(line)
else:
start += len(line)
else:
+ # Folding isn't allowed, so crop the word.
if start:
append(start)
- line_position = _cell_len(word)
- elif line_position and start:
+ cell_offset = _cell_len(word)
+ elif cell_offset and start:
+ # The word doesn't fit within the remaining space on the current
+ # line, but it *can* fit on to the next (empty) line.
append(start)
- line_position = _cell_len(word)
- else:
- line_position += _cell_len(word)
- return divides
+ cell_offset = _cell_len(word)
+
+ return break_positions
if __name__ == "__main__": # pragma: no cover
@@ -53,4 +83,11 @@ if __name__ == "__main__": # pragma: no cover
console = Console(width=10)
console.print("12345 abcdefghijklmnopqrstuvwyxzABCDEFGHIJKLMNOPQRSTUVWXYZ 12345")
- print(chop_cells("abcdefghijklmnopqrstuvwxyz", 10, position=2))
+ print(chop_cells("abcdefghijklmnopqrstuvwxyz", 10))
+
+ console = Console(width=20)
+ console.rule()
+ console.print("TextualはPythonの高速アプリケーション開発フレームワークです")
+
+ console.rule()
+ console.print("アプリケーションは1670万色を使用でき")
diff --git a/contrib/python/pip/pip/_vendor/rich/align.py b/contrib/python/pip/pip/_vendor/rich/align.py
index c310b66e78..f7b734fd72 100644
--- a/contrib/python/pip/pip/_vendor/rich/align.py
+++ b/contrib/python/pip/pip/_vendor/rich/align.py
@@ -27,7 +27,7 @@ class Align(JupyterMixin):
renderable (RenderableType): A console renderable.
align (AlignMethod): One of "left", "center", or "right""
style (StyleType, optional): An optional style to apply to the background.
- vertical (Optional[VerticalAlginMethod], optional): Optional vertical align, one of "top", "middle", or "bottom". Defaults to None.
+ vertical (Optional[VerticalAlignMethod], optional): Optional vertical align, one of "top", "middle", or "bottom". Defaults to None.
pad (bool, optional): Pad the right with spaces. Defaults to True.
width (int, optional): Restrict contents to given width, or None to use default width. Defaults to None.
height (int, optional): Set height of align renderable, or None to fit to contents. Defaults to None.
diff --git a/contrib/python/pip/pip/_vendor/rich/bar.py b/contrib/python/pip/pip/_vendor/rich/bar.py
index ed86a552d1..022284b578 100644
--- a/contrib/python/pip/pip/_vendor/rich/bar.py
+++ b/contrib/python/pip/pip/_vendor/rich/bar.py
@@ -48,7 +48,6 @@ class Bar(JupyterMixin):
def __rich_console__(
self, console: Console, options: ConsoleOptions
) -> RenderResult:
-
width = min(
self.width if self.width is not None else options.max_width,
options.max_width,
diff --git a/contrib/python/pip/pip/_vendor/rich/box.py b/contrib/python/pip/pip/_vendor/rich/box.py
index 97d2a94445..0511a9e48b 100644
--- a/contrib/python/pip/pip/_vendor/rich/box.py
+++ b/contrib/python/pip/pip/_vendor/rich/box.py
@@ -188,260 +188,224 @@ class Box:
return "".join(parts)
+# fmt: off
ASCII: Box = Box(
- """\
-+--+
-| ||
-|-+|
-| ||
-|-+|
-|-+|
-| ||
-+--+
-""",
+ "+--+\n"
+ "| ||\n"
+ "|-+|\n"
+ "| ||\n"
+ "|-+|\n"
+ "|-+|\n"
+ "| ||\n"
+ "+--+\n",
ascii=True,
)
ASCII2: Box = Box(
- """\
-+-++
-| ||
-+-++
-| ||
-+-++
-+-++
-| ||
-+-++
-""",
+ "+-++\n"
+ "| ||\n"
+ "+-++\n"
+ "| ||\n"
+ "+-++\n"
+ "+-++\n"
+ "| ||\n"
+ "+-++\n",
ascii=True,
)
ASCII_DOUBLE_HEAD: Box = Box(
- """\
-+-++
-| ||
-+=++
-| ||
-+-++
-+-++
-| ||
-+-++
-""",
+ "+-++\n"
+ "| ||\n"
+ "+=++\n"
+ "| ||\n"
+ "+-++\n"
+ "+-++\n"
+ "| ||\n"
+ "+-++\n",
ascii=True,
)
SQUARE: Box = Box(
- """\
-┌─┬┐
-│ ││
-├─┼┤
-│ ││
-├─┼┤
-├─┼┤
-│ ││
-└─┴┘
-"""
+ "┌─┬┐\n"
+ "│ ││\n"
+ "├─┼┤\n"
+ "│ ││\n"
+ "├─┼┤\n"
+ "├─┼┤\n"
+ "│ ││\n"
+ "└─┴┘\n"
)
SQUARE_DOUBLE_HEAD: Box = Box(
- """\
-┌─┬┐
-│ ││
-╞═╪╡
-│ ││
-├─┼┤
-├─┼┤
-│ ││
-└─┴┘
-"""
+ "┌─┬┐\n"
+ "│ ││\n"
+ "╞═╪╡\n"
+ "│ ││\n"
+ "├─┼┤\n"
+ "├─┼┤\n"
+ "│ ││\n"
+ "└─┴┘\n"
)
MINIMAL: Box = Box(
- """\
- ╷
- │
-╶─┼╴
- │
-╶─┼╴
-╶─┼╴
- │
- ╵
-"""
+ " ╷ \n"
+ " │ \n"
+ "╶─┼╴\n"
+ " │ \n"
+ "╶─┼╴\n"
+ "╶─┼╴\n"
+ " │ \n"
+ " ╵ \n"
)
MINIMAL_HEAVY_HEAD: Box = Box(
- """\
- ╷
- │
-╺━┿╸
- │
-╶─┼╴
-╶─┼╴
- │
- ╵
-"""
+ " ╷ \n"
+ " │ \n"
+ "╺━┿╸\n"
+ " │ \n"
+ "╶─┼╴\n"
+ "╶─┼╴\n"
+ " │ \n"
+ " ╵ \n"
)
MINIMAL_DOUBLE_HEAD: Box = Box(
- """\
- ╷
- │
- ═╪
- │
- ─┼
- ─┼
- │
- ╵
-"""
+ " ╷ \n"
+ " │ \n"
+ " ═╪ \n"
+ " │ \n"
+ " ─┼ \n"
+ " ─┼ \n"
+ " │ \n"
+ " ╵ \n"
)
SIMPLE: Box = Box(
- """\
-
-
- ──
-
-
- ──
-
-
-"""
+ " \n"
+ " \n"
+ " ── \n"
+ " \n"
+ " \n"
+ " ── \n"
+ " \n"
+ " \n"
)
SIMPLE_HEAD: Box = Box(
- """\
-
-
- ──
-
-
-
-
-
-"""
+ " \n"
+ " \n"
+ " ── \n"
+ " \n"
+ " \n"
+ " \n"
+ " \n"
+ " \n"
)
SIMPLE_HEAVY: Box = Box(
- """\
-
-
- ━━
-
-
- ━━
-
-
-"""
+ " \n"
+ " \n"
+ " ━━ \n"
+ " \n"
+ " \n"
+ " ━━ \n"
+ " \n"
+ " \n"
)
HORIZONTALS: Box = Box(
- """\
- ──
-
- ──
-
- ──
- ──
-
- ──
-"""
+ " ── \n"
+ " \n"
+ " ── \n"
+ " \n"
+ " ── \n"
+ " ── \n"
+ " \n"
+ " ── \n"
)
ROUNDED: Box = Box(
- """\
-╭─┬╮
-│ ││
-├─┼┤
-│ ││
-├─┼┤
-├─┼┤
-│ ││
-╰─┴╯
-"""
+ "╭─┬╮\n"
+ "│ ││\n"
+ "├─┼┤\n"
+ "│ ││\n"
+ "├─┼┤\n"
+ "├─┼┤\n"
+ "│ ││\n"
+ "╰─┴╯\n"
)
HEAVY: Box = Box(
- """\
-┏━┳┓
-┃ ┃┃
-┣━╋┫
-┃ ┃┃
-┣━╋┫
-┣━╋┫
-┃ ┃┃
-┗━┻┛
-"""
+ "┏━┳┓\n"
+ "┃ ┃┃\n"
+ "┣━╋┫\n"
+ "┃ ┃┃\n"
+ "┣━╋┫\n"
+ "┣━╋┫\n"
+ "┃ ┃┃\n"
+ "┗━┻┛\n"
)
HEAVY_EDGE: Box = Box(
- """\
-┏━┯┓
-┃ │┃
-┠─┼┨
-┃ │┃
-┠─┼┨
-┠─┼┨
-┃ │┃
-┗━┷┛
-"""
+ "┏━┯┓\n"
+ "┃ │┃\n"
+ "┠─┼┨\n"
+ "┃ │┃\n"
+ "┠─┼┨\n"
+ "┠─┼┨\n"
+ "┃ │┃\n"
+ "┗━┷┛\n"
)
HEAVY_HEAD: Box = Box(
- """\
-┏━┳┓
-┃ ┃┃
-┡━╇┩
-│ ││
-├─┼┤
-├─┼┤
-│ ││
-└─┴┘
-"""
+ "┏━┳┓\n"
+ "┃ ┃┃\n"
+ "┡━╇┩\n"
+ "│ ││\n"
+ "├─┼┤\n"
+ "├─┼┤\n"
+ "│ ││\n"
+ "└─┴┘\n"
)
DOUBLE: Box = Box(
- """\
-╔═╦╗
-║ ║║
-╠═╬╣
-║ ║║
-╠═╬╣
-╠═╬╣
-║ ║║
-╚═╩╝
-"""
+ "╔═╦╗\n"
+ "║ ║║\n"
+ "╠═╬╣\n"
+ "║ ║║\n"
+ "╠═╬╣\n"
+ "╠═╬╣\n"
+ "║ ║║\n"
+ "╚═╩╝\n"
)
DOUBLE_EDGE: Box = Box(
- """\
-╔═╤╗
-║ │║
-╟─┼╢
-║ │║
-╟─┼╢
-╟─┼╢
-║ │║
-╚═╧╝
-"""
+ "╔═╤╗\n"
+ "║ │║\n"
+ "╟─┼╢\n"
+ "║ │║\n"
+ "╟─┼╢\n"
+ "╟─┼╢\n"
+ "║ │║\n"
+ "╚═╧╝\n"
)
MARKDOWN: Box = Box(
- """\
-
-| ||
-|-||
-| ||
-|-||
-|-||
-| ||
-
-""",
+ " \n"
+ "| ||\n"
+ "|-||\n"
+ "| ||\n"
+ "|-||\n"
+ "|-||\n"
+ "| ||\n"
+ " \n",
ascii=True,
)
+# fmt: on
# Map Boxes that don't render with raster fonts on to equivalent that do
LEGACY_WINDOWS_SUBSTITUTIONS = {
@@ -464,7 +428,6 @@ PLAIN_HEADED_SUBSTITUTIONS = {
if __name__ == "__main__": # pragma: no cover
-
from pip._vendor.rich.columns import Columns
from pip._vendor.rich.panel import Panel
diff --git a/contrib/python/pip/pip/_vendor/rich/cells.py b/contrib/python/pip/pip/_vendor/rich/cells.py
index 9354f9e314..f85f928f75 100644
--- a/contrib/python/pip/pip/_vendor/rich/cells.py
+++ b/contrib/python/pip/pip/_vendor/rich/cells.py
@@ -1,6 +1,8 @@
+from __future__ import annotations
+
import re
from functools import lru_cache
-from typing import Callable, List
+from typing import Callable
from ._cell_widths import CELL_WIDTHS
@@ -119,33 +121,44 @@ def set_cell_size(text: str, total: int) -> str:
start = pos
-# TODO: This is inefficient
-# TODO: This might not work with CWJ type characters
-def chop_cells(text: str, max_size: int, position: int = 0) -> List[str]:
- """Break text in to equal (cell) length strings, returning the characters in reverse
- order"""
+def chop_cells(
+ text: str,
+ width: int,
+) -> list[str]:
+ """Split text into lines such that each line fits within the available (cell) width.
+
+ Args:
+ text: The text to fold such that it fits in the given width.
+ width: The width available (number of cells).
+
+ Returns:
+ A list of strings such that each string in the list has cell width
+ less than or equal to the available width.
+ """
_get_character_cell_size = get_character_cell_size
- characters = [
- (character, _get_character_cell_size(character)) for character in text
- ]
- total_size = position
- lines: List[List[str]] = [[]]
- append = lines[-1].append
-
- for character, size in reversed(characters):
- if total_size + size > max_size:
- lines.append([character])
- append = lines[-1].append
- total_size = size
+ lines: list[list[str]] = [[]]
+
+ append_new_line = lines.append
+ append_to_last_line = lines[-1].append
+
+ total_width = 0
+
+ for character in text:
+ cell_width = _get_character_cell_size(character)
+ char_doesnt_fit = total_width + cell_width > width
+
+ if char_doesnt_fit:
+ append_new_line([character])
+ append_to_last_line = lines[-1].append
+ total_width = cell_width
else:
- total_size += size
- append(character)
+ append_to_last_line(character)
+ total_width += cell_width
return ["".join(line) for line in lines]
if __name__ == "__main__": # pragma: no cover
-
print(get_character_cell_size("😽"))
for line in chop_cells("""这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑。""", 8):
print(line)
diff --git a/contrib/python/pip/pip/_vendor/rich/color.py b/contrib/python/pip/pip/_vendor/rich/color.py
index dfe455937c..4270a278d5 100644
--- a/contrib/python/pip/pip/_vendor/rich/color.py
+++ b/contrib/python/pip/pip/_vendor/rich/color.py
@@ -592,7 +592,6 @@ def blend_rgb(
if __name__ == "__main__": # pragma: no cover
-
from .console import Console
from .table import Table
from .text import Text
diff --git a/contrib/python/pip/pip/_vendor/rich/console.py b/contrib/python/pip/pip/_vendor/rich/console.py
index e559cbb43c..a11c7c137f 100644
--- a/contrib/python/pip/pip/_vendor/rich/console.py
+++ b/contrib/python/pip/pip/_vendor/rich/console.py
@@ -278,6 +278,7 @@ class ConsoleRenderable(Protocol):
# A type that may be rendered by Console.
RenderableType = Union[ConsoleRenderable, RichCast, str]
+"""A string or any object that may be rendered by Rich."""
# The result of calling a __rich_console__ method.
RenderResult = Iterable[Union[RenderableType, Segment]]
@@ -1925,7 +1926,6 @@ class Console:
end (str, optional): String to write at end of print data. Defaults to "\\\\n".
style (Union[str, Style], optional): A style to apply to output. Defaults to None.
justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``.
- overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None.
emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to None.
markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to None.
highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to None.
diff --git a/contrib/python/pip/pip/_vendor/rich/containers.py b/contrib/python/pip/pip/_vendor/rich/containers.py
index e29cf36899..901ff8ba6e 100644
--- a/contrib/python/pip/pip/_vendor/rich/containers.py
+++ b/contrib/python/pip/pip/_vendor/rich/containers.py
@@ -1,13 +1,13 @@
from itertools import zip_longest
from typing import (
- Iterator,
+ TYPE_CHECKING,
Iterable,
+ Iterator,
List,
Optional,
+ TypeVar,
Union,
overload,
- TypeVar,
- TYPE_CHECKING,
)
if TYPE_CHECKING:
@@ -119,7 +119,7 @@ class Lines:
Args:
console (Console): Console instance.
- width (int): Number of characters per line.
+ width (int): Number of cells available per line.
justify (str, optional): Default justify method for text: "left", "center", "full" or "right". Defaults to "left".
overflow (str, optional): Default overflow for text: "crop", "fold", or "ellipsis". Defaults to "fold".
diff --git a/contrib/python/pip/pip/_vendor/rich/highlighter.py b/contrib/python/pip/pip/_vendor/rich/highlighter.py
index c2646794a9..27714b25b4 100644
--- a/contrib/python/pip/pip/_vendor/rich/highlighter.py
+++ b/contrib/python/pip/pip/_vendor/rich/highlighter.py
@@ -98,7 +98,7 @@ class ReprHighlighter(RegexHighlighter):
r"(?P<number>(?<!\w)\-?[0-9]+\.?[0-9]*(e[-+]?\d+?)?\b|0x[0-9a-fA-F]*)",
r"(?P<path>\B(/[-\w._+]+)*\/)(?P<filename>[-\w._+]*)?",
r"(?<![\\\w])(?P<str>b?'''.*?(?<!\\)'''|b?'.*?(?<!\\)'|b?\"\"\".*?(?<!\\)\"\"\"|b?\".*?(?<!\\)\")",
- r"(?P<url>(file|https|http|ws|wss)://[-0-9a-zA-Z$_+!`(),.?/;:&=%#]*)",
+ r"(?P<url>(file|https|http|ws|wss)://[-0-9a-zA-Z$_+!`(),.?/;:&=%#~]*)",
),
]
diff --git a/contrib/python/pip/pip/_vendor/rich/json.py b/contrib/python/pip/pip/_vendor/rich/json.py
index ea94493f21..4087c79bb3 100644
--- a/contrib/python/pip/pip/_vendor/rich/json.py
+++ b/contrib/python/pip/pip/_vendor/rich/json.py
@@ -103,7 +103,6 @@ class JSON:
if __name__ == "__main__":
-
import argparse
import sys
diff --git a/contrib/python/pip/pip/_vendor/rich/layout.py b/contrib/python/pip/pip/_vendor/rich/layout.py
index 849356ea9a..a6f1a31b29 100644
--- a/contrib/python/pip/pip/_vendor/rich/layout.py
+++ b/contrib/python/pip/pip/_vendor/rich/layout.py
@@ -227,7 +227,6 @@ class Layout:
from pip._vendor.rich.tree import Tree
def summary(layout: "Layout") -> Table:
-
icon = layout.splitter.get_tree_icon()
table = Table.grid(padding=(0, 1, 0, 0))
@@ -403,7 +402,7 @@ class Layout:
self._render_map = render_map
layout_lines: List[List[Segment]] = [[] for _ in range(height)]
_islice = islice
- for (region, lines) in render_map.values():
+ for region, lines in render_map.values():
_x, y, _layout_width, layout_height = region
for row, line in zip(
_islice(layout_lines, y, y + layout_height), lines
diff --git a/contrib/python/pip/pip/_vendor/rich/live.py b/contrib/python/pip/pip/_vendor/rich/live.py
index 3ebbbc4ccb..f0529a781c 100644
--- a/contrib/python/pip/pip/_vendor/rich/live.py
+++ b/contrib/python/pip/pip/_vendor/rich/live.py
@@ -362,7 +362,7 @@ if __name__ == "__main__": # pragma: no cover
table.add_column("Destination Currency")
table.add_column("Exchange Rate")
- for ((source, dest), exchange_rate) in exchange_rate_dict.items():
+ for (source, dest), exchange_rate in exchange_rate_dict.items():
table.add_row(
source,
dest,
diff --git a/contrib/python/pip/pip/_vendor/rich/live_render.py b/contrib/python/pip/pip/_vendor/rich/live_render.py
index b90fbf7f35..e20745df6b 100644
--- a/contrib/python/pip/pip/_vendor/rich/live_render.py
+++ b/contrib/python/pip/pip/_vendor/rich/live_render.py
@@ -82,7 +82,6 @@ class LiveRender:
def __rich_console__(
self, console: Console, options: ConsoleOptions
) -> RenderResult:
-
renderable = self.renderable
style = console.get_style(self.style)
lines = console.render_lines(renderable, options, style=style, pad=False)
diff --git a/contrib/python/pip/pip/_vendor/rich/markup.py b/contrib/python/pip/pip/_vendor/rich/markup.py
index fd80d8c112..f6171878f8 100644
--- a/contrib/python/pip/pip/_vendor/rich/markup.py
+++ b/contrib/python/pip/pip/_vendor/rich/markup.py
@@ -64,6 +64,9 @@ def escape(
return f"{backslashes}{backslashes}\\{text}"
markup = _escape(escape_backslashes, markup)
+ if markup.endswith("\\") and not markup.endswith("\\\\"):
+ return markup + "\\"
+
return markup
@@ -110,7 +113,10 @@ def render(
Args:
markup (str): A string containing console markup.
+ style: (Union[str, Style]): The style to use.
emoji (bool, optional): Also render emoji code. Defaults to True.
+ emoji_variant (str, optional): Optional emoji variant, either "text" or "emoji". Defaults to None.
+
Raises:
MarkupError: If there is a syntax error in the markup.
@@ -226,7 +232,6 @@ def render(
if __name__ == "__main__": # pragma: no cover
-
MARKUP = [
"[red]Hello World[/red]",
"[magenta]Hello [b]World[/b]",
diff --git a/contrib/python/pip/pip/_vendor/rich/panel.py b/contrib/python/pip/pip/_vendor/rich/panel.py
index d522d80b51..95f4c84cf0 100644
--- a/contrib/python/pip/pip/_vendor/rich/panel.py
+++ b/contrib/python/pip/pip/_vendor/rich/panel.py
@@ -82,7 +82,9 @@ class Panel(JupyterMixin):
style: StyleType = "none",
border_style: StyleType = "none",
width: Optional[int] = None,
+ height: Optional[int] = None,
padding: PaddingDimensions = (0, 1),
+ highlight: bool = False,
) -> "Panel":
"""An alternative constructor that sets expand=False."""
return cls(
@@ -96,7 +98,9 @@ class Panel(JupyterMixin):
style=style,
border_style=border_style,
width=width,
+ height=height,
padding=padding,
+ highlight=highlight,
expand=False,
)
diff --git a/contrib/python/pip/pip/_vendor/rich/pretty.py b/contrib/python/pip/pip/_vendor/rich/pretty.py
index 2bd9eb0073..9b9e3ba908 100644
--- a/contrib/python/pip/pip/_vendor/rich/pretty.py
+++ b/contrib/python/pip/pip/_vendor/rich/pretty.py
@@ -211,8 +211,11 @@ def install(
)
builtins._ = value # type: ignore[attr-defined]
- if "get_ipython" in globals():
+ try:
ip = get_ipython() # type: ignore[name-defined]
+ except NameError:
+ sys.displayhook = display_hook
+ else:
from IPython.core.formatters import BaseFormatter
class RichFormatter(BaseFormatter): # type: ignore[misc]
@@ -236,8 +239,6 @@ def install(
# replace plain text formatter with rich formatter
rich_formatter = RichFormatter()
ip.display_formatter.formatters["text/plain"] = rich_formatter
- else:
- sys.displayhook = display_hook
class Pretty(JupyterMixin):
@@ -708,9 +709,9 @@ def traverse(
last=root,
)
- def iter_attrs() -> Iterable[
- Tuple[str, Any, Optional[Callable[[Any], str]]]
- ]:
+ def iter_attrs() -> (
+ Iterable[Tuple[str, Any, Optional[Callable[[Any], str]]]]
+ ):
"""Iterate over attr fields and values."""
for attr in attr_fields:
if attr.repr:
@@ -985,7 +986,7 @@ if __name__ == "__main__": # pragma: no cover
from pip._vendor.rich import print
- # print(Pretty(data, indent_guides=True, max_string=20))
+ print(Pretty(data, indent_guides=True, max_string=20))
class Thing:
def __repr__(self) -> str:
diff --git a/contrib/python/pip/pip/_vendor/rich/progress.py b/contrib/python/pip/pip/_vendor/rich/progress.py
index 8b0a315f32..2420c24e64 100644
--- a/contrib/python/pip/pip/_vendor/rich/progress.py
+++ b/contrib/python/pip/pip/_vendor/rich/progress.py
@@ -681,7 +681,7 @@ class TimeElapsedColumn(ProgressColumn):
elapsed = task.finished_time if task.finished else task.elapsed
if elapsed is None:
return Text("-:--:--", style="progress.elapsed")
- delta = timedelta(seconds=int(elapsed))
+ delta = timedelta(seconds=max(0, int(elapsed)))
return Text(str(delta), style="progress.elapsed")
@@ -710,7 +710,6 @@ class TaskProgressColumn(TextColumn):
table_column: Optional[Column] = None,
show_speed: bool = False,
) -> None:
-
self.text_format_no_percentage = text_format_no_percentage
self.show_speed = show_speed
super().__init__(
@@ -1114,7 +1113,7 @@ class Progress(JupyterMixin):
progress = Progress(
SpinnerColumn(),
- *Progress.default_columns(),
+ *Progress.get_default_columns(),
"Elapsed:",
TimeElapsedColumn(),
)
@@ -1636,7 +1635,6 @@ class Progress(JupyterMixin):
if __name__ == "__main__": # pragma: no coverage
-
import random
import time
@@ -1689,7 +1687,6 @@ if __name__ == "__main__": # pragma: no coverage
console=console,
transient=False,
) as progress:
-
task1 = progress.add_task("[red]Downloading", total=1000)
task2 = progress.add_task("[green]Processing", total=1000)
task3 = progress.add_task("[yellow]Thinking", total=None)
diff --git a/contrib/python/pip/pip/_vendor/rich/progress_bar.py b/contrib/python/pip/pip/_vendor/rich/progress_bar.py
index 67361df2e4..a2bf326144 100644
--- a/contrib/python/pip/pip/_vendor/rich/progress_bar.py
+++ b/contrib/python/pip/pip/_vendor/rich/progress_bar.py
@@ -156,7 +156,6 @@ class ProgressBar(JupyterMixin):
def __rich_console__(
self, console: Console, options: ConsoleOptions
) -> RenderResult:
-
width = min(self.width or options.max_width, options.max_width)
ascii = options.legacy_windows or options.ascii_only
should_pulse = self.pulse or self.total is None
diff --git a/contrib/python/pip/pip/_vendor/rich/prompt.py b/contrib/python/pip/pip/_vendor/rich/prompt.py
index 2bd0a7724f..75ff048168 100644
--- a/contrib/python/pip/pip/_vendor/rich/prompt.py
+++ b/contrib/python/pip/pip/_vendor/rich/prompt.py
@@ -307,7 +307,7 @@ class IntPrompt(PromptBase[int]):
validate_error_message = "[prompt.invalid]Please enter a valid integer number"
-class FloatPrompt(PromptBase[int]):
+class FloatPrompt(PromptBase[float]):
"""A prompt that returns a float.
Example:
@@ -346,7 +346,6 @@ class Confirm(PromptBase[bool]):
if __name__ == "__main__": # pragma: no cover
-
from pip._vendor.rich import print
if Confirm.ask("Run [i]prompt[/i] tests?", default=True):
diff --git a/contrib/python/pip/pip/_vendor/rich/repr.py b/contrib/python/pip/pip/_vendor/rich/repr.py
index f284bcafa6..10efc427c3 100644
--- a/contrib/python/pip/pip/_vendor/rich/repr.py
+++ b/contrib/python/pip/pip/_vendor/rich/repr.py
@@ -76,7 +76,7 @@ def auto(
param.POSITIONAL_OR_KEYWORD,
param.KEYWORD_ONLY,
):
- if param.default == param.empty:
+ if param.default is param.empty:
yield getattr(self, param.name)
else:
yield param.name, getattr(self, param.name), param.default
diff --git a/contrib/python/pip/pip/_vendor/rich/segment.py b/contrib/python/pip/pip/_vendor/rich/segment.py
index e125798463..93edbbdeb7 100644
--- a/contrib/python/pip/pip/_vendor/rich/segment.py
+++ b/contrib/python/pip/pip/_vendor/rich/segment.py
@@ -109,7 +109,6 @@ class Segment(NamedTuple):
@classmethod
@lru_cache(1024 * 16)
def _split_cells(cls, segment: "Segment", cut: int) -> Tuple["Segment", "Segment"]:
-
text, style, control = segment
_Segment = Segment
diff --git a/contrib/python/pip/pip/_vendor/rich/status.py b/contrib/python/pip/pip/_vendor/rich/status.py
index 09eff405ec..65744838e3 100644
--- a/contrib/python/pip/pip/_vendor/rich/status.py
+++ b/contrib/python/pip/pip/_vendor/rich/status.py
@@ -107,7 +107,6 @@ class Status(JupyterMixin):
if __name__ == "__main__": # pragma: no cover
-
from time import sleep
from .console import Console
diff --git a/contrib/python/pip/pip/_vendor/rich/syntax.py b/contrib/python/pip/pip/_vendor/rich/syntax.py
index 5703376648..c26fd8784e 100644
--- a/contrib/python/pip/pip/_vendor/rich/syntax.py
+++ b/contrib/python/pip/pip/_vendor/rich/syntax.py
@@ -439,6 +439,16 @@ class Syntax(JupyterMixin):
except ClassNotFound:
return None
+ @property
+ def default_lexer(self) -> Lexer:
+ """A Pygments Lexer to use if one is not specified or invalid."""
+ return get_lexer_by_name(
+ "text",
+ stripnl=False,
+ ensurenl=True,
+ tabsize=self.tab_size,
+ )
+
def highlight(
self,
code: str,
@@ -467,7 +477,7 @@ class Syntax(JupyterMixin):
)
_get_theme_style = self._theme.get_style_for_token
- lexer = self.lexer
+ lexer = self.lexer or self.default_lexer
if lexer is None:
text.append(code)
diff --git a/contrib/python/pip/pip/_vendor/rich/table.py b/contrib/python/pip/pip/_vendor/rich/table.py
index 17409f2ee8..43c718ebf5 100644
--- a/contrib/python/pip/pip/_vendor/rich/table.py
+++ b/contrib/python/pip/pip/_vendor/rich/table.py
@@ -212,7 +212,6 @@ class Table(JupyterMixin):
caption_justify: "JustifyMethod" = "center",
highlight: bool = False,
) -> None:
-
self.columns: List[Column] = []
self.rows: List[Row] = []
self.title = title
@@ -471,7 +470,6 @@ class Table(JupyterMixin):
def __rich_console__(
self, console: "Console", options: "ConsoleOptions"
) -> "RenderResult":
-
if not self.columns:
yield Segment("\n")
return
@@ -685,7 +683,7 @@ class Table(JupyterMixin):
getattr(renderable, "vertical", None) or column.vertical,
)
else:
- for (style, renderable) in raw_cells:
+ for style, renderable in raw_cells:
yield _Cell(
style,
renderable,
diff --git a/contrib/python/pip/pip/_vendor/rich/text.py b/contrib/python/pip/pip/_vendor/rich/text.py
index 998cb87dab..209aa94348 100644
--- a/contrib/python/pip/pip/_vendor/rich/text.py
+++ b/contrib/python/pip/pip/_vendor/rich/text.py
@@ -38,6 +38,7 @@ DEFAULT_OVERFLOW: "OverflowMethod" = "fold"
_re_whitespace = re.compile(r"\s+$")
TextType = Union[str, "Text"]
+"""A plain string or a :class:`Text` instance."""
GetStyleCallable = Callable[[str], Optional[StyleType]]
@@ -97,6 +98,21 @@ class Span(NamedTuple):
return self
return Span(start, min(offset, end), style)
+ def extend(self, cells: int) -> "Span":
+ """Extend the span by the given number of cells.
+
+ Args:
+ cells (int): Additional space to add to end of span.
+
+ Returns:
+ Span: A span.
+ """
+ if cells:
+ start, end, style = self
+ return Span(start, end + cells, style)
+ else:
+ return self
+
class Text(JupyterMixin):
"""Text with color / style.
@@ -108,7 +124,7 @@ class Text(JupyterMixin):
overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None.
no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None.
end (str, optional): Character to end text with. Defaults to "\\\\n".
- tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8.
+ tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to None.
spans (List[Span], optional). A list of predefined style spans. Defaults to None.
"""
@@ -133,7 +149,7 @@ class Text(JupyterMixin):
overflow: Optional["OverflowMethod"] = None,
no_wrap: Optional[bool] = None,
end: str = "\n",
- tab_size: Optional[int] = 8,
+ tab_size: Optional[int] = None,
spans: Optional[List[Span]] = None,
) -> None:
sanitized_text = strip_control_codes(text)
@@ -255,7 +271,9 @@ class Text(JupyterMixin):
Args:
text (str): A string containing console markup.
+ style (Union[str, Style], optional): Base style for text. Defaults to "".
emoji (bool, optional): Also render emoji code. Defaults to True.
+ emoji_variant (str, optional): Optional emoji variant, either "text" or "emoji". Defaults to None.
justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None.
overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None.
end (str, optional): Character to end text with. Defaults to "\\\\n".
@@ -292,7 +310,7 @@ class Text(JupyterMixin):
overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None.
no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None.
end (str, optional): Character to end text with. Defaults to "\\\\n".
- tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8.
+ tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to None.
"""
from .ansi import AnsiDecoder
@@ -353,8 +371,9 @@ class Text(JupyterMixin):
style (Union[str, Style], optional): Base style for text. Defaults to "".
justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None.
overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None.
+ no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None.
end (str, optional): Character to end text with. Defaults to "\\\\n".
- tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8.
+ tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to None.
meta (Dict[str, Any], optional). Meta data to apply to text, or None for no meta data. Default to None
Returns:
@@ -408,7 +427,7 @@ class Text(JupyterMixin):
self._spans = spans[:]
def blank_copy(self, plain: str = "") -> "Text":
- """Return a new Text instance with copied meta data (but not the string or spans)."""
+ """Return a new Text instance with copied metadata (but not the string or spans)."""
copy_self = Text(
plain,
style=self.style,
@@ -489,7 +508,7 @@ class Text(JupyterMixin):
def apply_meta(
self, meta: Dict[str, Any], start: int = 0, end: Optional[int] = None
) -> None:
- """Apply meta data to the text, or a portion of the text.
+ """Apply metadata to the text, or a portion of the text.
Args:
meta (Dict[str, Any]): A dict of meta information.
@@ -549,6 +568,27 @@ class Text(JupyterMixin):
style += get_style(span_style, default="")
return style
+ def extend_style(self, spaces: int) -> None:
+ """Extend the Text given number of spaces where the spaces have the same style as the last character.
+
+ Args:
+ spaces (int): Number of spaces to add to the Text.
+ """
+ if spaces <= 0:
+ return
+ spans = self.spans
+ new_spaces = " " * spaces
+ if spans:
+ end_offset = len(self)
+ self._spans[:] = [
+ span.extend(spaces) if span.end >= end_offset else span
+ for span in spans
+ ]
+ self._text.append(new_spaces)
+ self._length += spaces
+ else:
+ self.plain += new_spaces
+
def highlight_regex(
self,
re_highlight: str,
@@ -597,9 +637,9 @@ class Text(JupyterMixin):
"""Highlight words with a style.
Args:
- words (Iterable[str]): Worlds to highlight.
+ words (Iterable[str]): Words to highlight.
style (Union[str, Style]): Style to apply.
- case_sensitive (bool, optional): Enable case sensitive matchings. Defaults to True.
+ case_sensitive (bool, optional): Enable case sensitive matching. Defaults to True.
Returns:
int: Number of words highlighted.
@@ -646,7 +686,7 @@ class Text(JupyterMixin):
def __rich_console__(
self, console: "Console", options: "ConsoleOptions"
) -> Iterable[Segment]:
- tab_size: int = console.tab_size or self.tab_size or 8
+ tab_size: int = console.tab_size if self.tab_size is None else self.tab_size
justify = self.justify or options.justify or DEFAULT_JUSTIFY
overflow = self.overflow or options.overflow or DEFAULT_OVERFLOW
@@ -781,27 +821,35 @@ class Text(JupyterMixin):
"""
if "\t" not in self.plain:
return
- pos = 0
if tab_size is None:
tab_size = self.tab_size
- assert tab_size is not None
- result = self.blank_copy()
- append = result.append
+ if tab_size is None:
+ tab_size = 8
+
+ new_text: List[Text] = []
+ append = new_text.append
- _style = self.style
for line in self.split("\n", include_separator=True):
- parts = line.split("\t", include_separator=True)
- for part in parts:
- if part.plain.endswith("\t"):
- part._text = [part.plain[:-1] + " "]
- append(part)
- pos += len(part)
- spaces = tab_size - ((pos - 1) % tab_size) - 1
- if spaces:
- append(" " * spaces, _style)
- pos += spaces
- else:
+ if "\t" not in line.plain:
+ append(line)
+ else:
+ cell_position = 0
+ parts = line.split("\t", include_separator=True)
+ for part in parts:
+ if part.plain.endswith("\t"):
+ part._text[-1] = part._text[-1][:-1] + " "
+ cell_position += part.cell_len
+ tab_remainder = cell_position % tab_size
+ if tab_remainder:
+ spaces = tab_size - tab_remainder
+ part.extend_style(spaces)
+ cell_position += spaces
+ else:
+ cell_position += part.cell_len
append(part)
+
+ result = Text("").join(new_text)
+
self._text = [result.plain]
self._length = len(self.plain)
self._spans[:] = result._spans
@@ -852,6 +900,7 @@ class Text(JupyterMixin):
Args:
count (int): Width of padding.
+ character (str): The character to pad with. Must be a string of length 1.
"""
assert len(character) == 1, "Character must be a string of length 1"
if count:
@@ -932,7 +981,7 @@ class Text(JupyterMixin):
self._text.append(sanitized_text)
offset = len(self)
text_length = len(sanitized_text)
- if style is not None:
+ if style:
self._spans.append(Span(offset, offset + text_length, style))
self._length += text_length
elif isinstance(text, Text):
@@ -942,7 +991,7 @@ class Text(JupyterMixin):
"style must not be set when appending Text instance"
)
text_length = self._length
- if text.style is not None:
+ if text.style:
self._spans.append(
_Span(text_length, text_length + len(text), text.style)
)
@@ -958,12 +1007,15 @@ class Text(JupyterMixin):
"""Append another Text instance. This method is more performant that Text.append, but
only works for Text.
+ Args:
+ text (Text): The Text instance to append to this instance.
+
Returns:
Text: Returns self for chaining.
"""
_Span = Span
text_length = self._length
- if text.style is not None:
+ if text.style:
self._spans.append(_Span(text_length, text_length + len(text), text.style))
self._text.append(text.plain)
self._spans.extend(
@@ -979,7 +1031,7 @@ class Text(JupyterMixin):
"""Append iterable of str and style. Style may be a Style instance or a str style definition.
Args:
- pairs (Iterable[Tuple[str, Optional[StyleType]]]): An iterable of tuples containing str content and style.
+ tokens (Iterable[Tuple[str, Optional[StyleType]]]): An iterable of tuples containing str content and style.
Returns:
Text: Returns self for chaining.
@@ -990,7 +1042,7 @@ class Text(JupyterMixin):
offset = len(self)
for content, style in tokens:
append_text(content)
- if style is not None:
+ if style:
append_span(_Span(offset, offset + len(content), style))
offset += len(content)
self._length = offset
@@ -1088,7 +1140,6 @@ class Text(JupyterMixin):
_Span = Span
for span_start, span_end, style in self._spans:
-
lower_bound = 0
upper_bound = line_count
start_line_no = (lower_bound + upper_bound) // 2
@@ -1158,8 +1209,7 @@ class Text(JupyterMixin):
Args:
console (Console): Console instance.
- width (int): Number of characters per line.
- emoji (bool, optional): Also render emoji code. Defaults to True.
+ width (int): Number of cells available per line.
justify (str, optional): Justify method: "default", "left", "center", "full", "right". Defaults to "default".
overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None.
tab_size (int, optional): Default tab size. Defaults to 8.
diff --git a/contrib/python/pip/pip/_vendor/rich/traceback.py b/contrib/python/pip/pip/_vendor/rich/traceback.py
index c4ffe1f99e..f223ad44bf 100644
--- a/contrib/python/pip/pip/_vendor/rich/traceback.py
+++ b/contrib/python/pip/pip/_vendor/rich/traceback.py
@@ -636,7 +636,6 @@ class Traceback:
excluded = False
for frame_index, frame in enumerate(stack.frames):
-
if exclude_frames and frame_index in exclude_frames:
excluded = True
continue
@@ -720,7 +719,6 @@ class Traceback:
if __name__ == "__main__": # pragma: no cover
-
from .console import Console
console = Console()
@@ -744,7 +742,6 @@ if __name__ == "__main__": # pragma: no cover
bar(a)
def error() -> None:
-
try:
try:
foo(0)
diff --git a/contrib/python/pip/pip/_vendor/rich/tree.py b/contrib/python/pip/pip/_vendor/rich/tree.py
index afe8da1a4a..64bc75d228 100644
--- a/contrib/python/pip/pip/_vendor/rich/tree.py
+++ b/contrib/python/pip/pip/_vendor/rich/tree.py
@@ -72,7 +72,6 @@ class Tree(JupyterMixin):
def __rich_console__(
self, console: "Console", options: "ConsoleOptions"
) -> "RenderResult":
-
stack: List[Iterator[Tuple[bool, Tree]]] = []
pop = stack.pop
push = stack.append
@@ -195,7 +194,6 @@ class Tree(JupyterMixin):
if __name__ == "__main__": # pragma: no cover
-
from pip._vendor.rich.console import Group
from pip._vendor.rich.markdown import Markdown
from pip._vendor.rich.panel import Panel
diff --git a/contrib/python/pip/pip/_vendor/six.py b/contrib/python/pip/pip/_vendor/six.py
deleted file mode 100644
index 4e15675d8b..0000000000
--- a/contrib/python/pip/pip/_vendor/six.py
+++ /dev/null
@@ -1,998 +0,0 @@
-# Copyright (c) 2010-2020 Benjamin Peterson
-#
-# 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.
-
-"""Utilities for writing code that runs on Python 2 and 3"""
-
-from __future__ import absolute_import
-
-import functools
-import itertools
-import operator
-import sys
-import types
-
-__author__ = "Benjamin Peterson <benjamin@python.org>"
-__version__ = "1.16.0"
-
-
-# Useful for very coarse version differentiation.
-PY2 = sys.version_info[0] == 2
-PY3 = sys.version_info[0] == 3
-PY34 = sys.version_info[0:2] >= (3, 4)
-
-if PY3:
- string_types = str,
- integer_types = int,
- class_types = type,
- text_type = str
- binary_type = bytes
-
- MAXSIZE = sys.maxsize
-else:
- string_types = basestring,
- integer_types = (int, long)
- class_types = (type, types.ClassType)
- text_type = unicode
- binary_type = str
-
- if sys.platform.startswith("java"):
- # Jython always uses 32 bits.
- MAXSIZE = int((1 << 31) - 1)
- else:
- # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
- class X(object):
-
- def __len__(self):
- return 1 << 31
- try:
- len(X())
- except OverflowError:
- # 32-bit
- MAXSIZE = int((1 << 31) - 1)
- else:
- # 64-bit
- MAXSIZE = int((1 << 63) - 1)
- del X
-
-if PY34:
- from importlib.util import spec_from_loader
-else:
- spec_from_loader = None
-
-
-def _add_doc(func, doc):
- """Add documentation to a function."""
- func.__doc__ = doc
-
-
-def _import_module(name):
- """Import module, returning the module after the last dot."""
- __import__(name)
- return sys.modules[name]
-
-
-class _LazyDescr(object):
-
- def __init__(self, name):
- self.name = name
-
- def __get__(self, obj, tp):
- result = self._resolve()
- setattr(obj, self.name, result) # Invokes __set__.
- try:
- # This is a bit ugly, but it avoids running this again by
- # removing this descriptor.
- delattr(obj.__class__, self.name)
- except AttributeError:
- pass
- return result
-
-
-class MovedModule(_LazyDescr):
-
- def __init__(self, name, old, new=None):
- super(MovedModule, self).__init__(name)
- if PY3:
- if new is None:
- new = name
- self.mod = new
- else:
- self.mod = old
-
- def _resolve(self):
- return _import_module(self.mod)
-
- def __getattr__(self, attr):
- _module = self._resolve()
- value = getattr(_module, attr)
- setattr(self, attr, value)
- return value
-
-
-class _LazyModule(types.ModuleType):
-
- def __init__(self, name):
- super(_LazyModule, self).__init__(name)
- self.__doc__ = self.__class__.__doc__
-
- def __dir__(self):
- attrs = ["__doc__", "__name__"]
- attrs += [attr.name for attr in self._moved_attributes]
- return attrs
-
- # Subclasses should override this
- _moved_attributes = []
-
-
-class MovedAttribute(_LazyDescr):
-
- def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
- super(MovedAttribute, self).__init__(name)
- if PY3:
- if new_mod is None:
- new_mod = name
- self.mod = new_mod
- if new_attr is None:
- if old_attr is None:
- new_attr = name
- else:
- new_attr = old_attr
- self.attr = new_attr
- else:
- self.mod = old_mod
- if old_attr is None:
- old_attr = name
- self.attr = old_attr
-
- def _resolve(self):
- module = _import_module(self.mod)
- return getattr(module, self.attr)
-
-
-class _SixMetaPathImporter(object):
-
- """
- A meta path importer to import six.moves and its submodules.
-
- This class implements a PEP302 finder and loader. It should be compatible
- with Python 2.5 and all existing versions of Python3
- """
-
- def __init__(self, six_module_name):
- self.name = six_module_name
- self.known_modules = {}
-
- def _add_module(self, mod, *fullnames):
- for fullname in fullnames:
- self.known_modules[self.name + "." + fullname] = mod
-
- def _get_module(self, fullname):
- return self.known_modules[self.name + "." + fullname]
-
- def find_module(self, fullname, path=None):
- if fullname in self.known_modules:
- return self
- return None
-
- def find_spec(self, fullname, path, target=None):
- if fullname in self.known_modules:
- return spec_from_loader(fullname, self)
- return None
-
- def __get_module(self, fullname):
- try:
- return self.known_modules[fullname]
- except KeyError:
- raise ImportError("This loader does not know module " + fullname)
-
- def load_module(self, fullname):
- try:
- # in case of a reload
- return sys.modules[fullname]
- except KeyError:
- pass
- mod = self.__get_module(fullname)
- if isinstance(mod, MovedModule):
- mod = mod._resolve()
- else:
- mod.__loader__ = self
- sys.modules[fullname] = mod
- return mod
-
- def is_package(self, fullname):
- """
- Return true, if the named module is a package.
-
- We need this method to get correct spec objects with
- Python 3.4 (see PEP451)
- """
- return hasattr(self.__get_module(fullname), "__path__")
-
- def get_code(self, fullname):
- """Return None
-
- Required, if is_package is implemented"""
- self.__get_module(fullname) # eventually raises ImportError
- return None
- get_source = get_code # same as get_code
-
- def create_module(self, spec):
- return self.load_module(spec.name)
-
- def exec_module(self, module):
- pass
-
-_importer = _SixMetaPathImporter(__name__)
-
-
-class _MovedItems(_LazyModule):
-
- """Lazy loading of moved objects"""
- __path__ = [] # mark as package
-
-
-_moved_attributes = [
- MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
- MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
- MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"),
- MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
- MovedAttribute("intern", "__builtin__", "sys"),
- MovedAttribute("map", "itertools", "builtins", "imap", "map"),
- MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
- MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
- MovedAttribute("getoutput", "commands", "subprocess"),
- MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
- MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"),
- MovedAttribute("reduce", "__builtin__", "functools"),
- MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
- MovedAttribute("StringIO", "StringIO", "io"),
- MovedAttribute("UserDict", "UserDict", "collections"),
- MovedAttribute("UserList", "UserList", "collections"),
- MovedAttribute("UserString", "UserString", "collections"),
- MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
- MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
- MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
- MovedModule("builtins", "__builtin__"),
- MovedModule("configparser", "ConfigParser"),
- MovedModule("collections_abc", "collections", "collections.abc" if sys.version_info >= (3, 3) else "collections"),
- MovedModule("copyreg", "copy_reg"),
- MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
- MovedModule("dbm_ndbm", "dbm", "dbm.ndbm"),
- MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread" if sys.version_info < (3, 9) else "_thread"),
- MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
- MovedModule("http_cookies", "Cookie", "http.cookies"),
- MovedModule("html_entities", "htmlentitydefs", "html.entities"),
- MovedModule("html_parser", "HTMLParser", "html.parser"),
- MovedModule("http_client", "httplib", "http.client"),
- MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
- MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"),
- MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
- MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
- MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
- MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
- MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
- MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
- MovedModule("cPickle", "cPickle", "pickle"),
- MovedModule("queue", "Queue"),
- MovedModule("reprlib", "repr"),
- MovedModule("socketserver", "SocketServer"),
- MovedModule("_thread", "thread", "_thread"),
- MovedModule("tkinter", "Tkinter"),
- MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
- MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
- MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
- MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
- MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
- MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
- MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
- MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
- MovedModule("tkinter_colorchooser", "tkColorChooser",
- "tkinter.colorchooser"),
- MovedModule("tkinter_commondialog", "tkCommonDialog",
- "tkinter.commondialog"),
- MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
- MovedModule("tkinter_font", "tkFont", "tkinter.font"),
- MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
- MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
- "tkinter.simpledialog"),
- MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"),
- MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"),
- MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"),
- MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
- MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
- MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
-]
-# Add windows specific modules.
-if sys.platform == "win32":
- _moved_attributes += [
- MovedModule("winreg", "_winreg"),
- ]
-
-for attr in _moved_attributes:
- setattr(_MovedItems, attr.name, attr)
- if isinstance(attr, MovedModule):
- _importer._add_module(attr, "moves." + attr.name)
-del attr
-
-_MovedItems._moved_attributes = _moved_attributes
-
-moves = _MovedItems(__name__ + ".moves")
-_importer._add_module(moves, "moves")
-
-
-class Module_six_moves_urllib_parse(_LazyModule):
-
- """Lazy loading of moved objects in six.moves.urllib_parse"""
-
-
-_urllib_parse_moved_attributes = [
- MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
- MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
- MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
- MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
- MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
- MovedAttribute("urljoin", "urlparse", "urllib.parse"),
- MovedAttribute("urlparse", "urlparse", "urllib.parse"),
- MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
- MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
- MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
- MovedAttribute("quote", "urllib", "urllib.parse"),
- MovedAttribute("quote_plus", "urllib", "urllib.parse"),
- MovedAttribute("unquote", "urllib", "urllib.parse"),
- MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
- MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"),
- MovedAttribute("urlencode", "urllib", "urllib.parse"),
- MovedAttribute("splitquery", "urllib", "urllib.parse"),
- MovedAttribute("splittag", "urllib", "urllib.parse"),
- MovedAttribute("splituser", "urllib", "urllib.parse"),
- MovedAttribute("splitvalue", "urllib", "urllib.parse"),
- MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
- MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
- MovedAttribute("uses_params", "urlparse", "urllib.parse"),
- MovedAttribute("uses_query", "urlparse", "urllib.parse"),
- MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
-]
-for attr in _urllib_parse_moved_attributes:
- setattr(Module_six_moves_urllib_parse, attr.name, attr)
-del attr
-
-Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes
-
-_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"),
- "moves.urllib_parse", "moves.urllib.parse")
-
-
-class Module_six_moves_urllib_error(_LazyModule):
-
- """Lazy loading of moved objects in six.moves.urllib_error"""
-
-
-_urllib_error_moved_attributes = [
- MovedAttribute("URLError", "urllib2", "urllib.error"),
- MovedAttribute("HTTPError", "urllib2", "urllib.error"),
- MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
-]
-for attr in _urllib_error_moved_attributes:
- setattr(Module_six_moves_urllib_error, attr.name, attr)
-del attr
-
-Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
-
-_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"),
- "moves.urllib_error", "moves.urllib.error")
-
-
-class Module_six_moves_urllib_request(_LazyModule):
-
- """Lazy loading of moved objects in six.moves.urllib_request"""
-
-
-_urllib_request_moved_attributes = [
- MovedAttribute("urlopen", "urllib2", "urllib.request"),
- MovedAttribute("install_opener", "urllib2", "urllib.request"),
- MovedAttribute("build_opener", "urllib2", "urllib.request"),
- MovedAttribute("pathname2url", "urllib", "urllib.request"),
- MovedAttribute("url2pathname", "urllib", "urllib.request"),
- MovedAttribute("getproxies", "urllib", "urllib.request"),
- MovedAttribute("Request", "urllib2", "urllib.request"),
- MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
- MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
- MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
- MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
- MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
- MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
- MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
- MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
- MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
- MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
- MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
- MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
- MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
- MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
- MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
- MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
- MovedAttribute("FileHandler", "urllib2", "urllib.request"),
- MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
- MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
- MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
- MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
- MovedAttribute("urlretrieve", "urllib", "urllib.request"),
- MovedAttribute("urlcleanup", "urllib", "urllib.request"),
- MovedAttribute("URLopener", "urllib", "urllib.request"),
- MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
- MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
- MovedAttribute("parse_http_list", "urllib2", "urllib.request"),
- MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"),
-]
-for attr in _urllib_request_moved_attributes:
- setattr(Module_six_moves_urllib_request, attr.name, attr)
-del attr
-
-Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
-
-_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"),
- "moves.urllib_request", "moves.urllib.request")
-
-
-class Module_six_moves_urllib_response(_LazyModule):
-
- """Lazy loading of moved objects in six.moves.urllib_response"""
-
-
-_urllib_response_moved_attributes = [
- MovedAttribute("addbase", "urllib", "urllib.response"),
- MovedAttribute("addclosehook", "urllib", "urllib.response"),
- MovedAttribute("addinfo", "urllib", "urllib.response"),
- MovedAttribute("addinfourl", "urllib", "urllib.response"),
-]
-for attr in _urllib_response_moved_attributes:
- setattr(Module_six_moves_urllib_response, attr.name, attr)
-del attr
-
-Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
-
-_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"),
- "moves.urllib_response", "moves.urllib.response")
-
-
-class Module_six_moves_urllib_robotparser(_LazyModule):
-
- """Lazy loading of moved objects in six.moves.urllib_robotparser"""
-
-
-_urllib_robotparser_moved_attributes = [
- MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
-]
-for attr in _urllib_robotparser_moved_attributes:
- setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
-del attr
-
-Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes
-
-_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"),
- "moves.urllib_robotparser", "moves.urllib.robotparser")
-
-
-class Module_six_moves_urllib(types.ModuleType):
-
- """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
- __path__ = [] # mark as package
- parse = _importer._get_module("moves.urllib_parse")
- error = _importer._get_module("moves.urllib_error")
- request = _importer._get_module("moves.urllib_request")
- response = _importer._get_module("moves.urllib_response")
- robotparser = _importer._get_module("moves.urllib_robotparser")
-
- def __dir__(self):
- return ['parse', 'error', 'request', 'response', 'robotparser']
-
-_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
- "moves.urllib")
-
-
-def add_move(move):
- """Add an item to six.moves."""
- setattr(_MovedItems, move.name, move)
-
-
-def remove_move(name):
- """Remove item from six.moves."""
- try:
- delattr(_MovedItems, name)
- except AttributeError:
- try:
- del moves.__dict__[name]
- except KeyError:
- raise AttributeError("no such move, %r" % (name,))
-
-
-if PY3:
- _meth_func = "__func__"
- _meth_self = "__self__"
-
- _func_closure = "__closure__"
- _func_code = "__code__"
- _func_defaults = "__defaults__"
- _func_globals = "__globals__"
-else:
- _meth_func = "im_func"
- _meth_self = "im_self"
-
- _func_closure = "func_closure"
- _func_code = "func_code"
- _func_defaults = "func_defaults"
- _func_globals = "func_globals"
-
-
-try:
- advance_iterator = next
-except NameError:
- def advance_iterator(it):
- return it.next()
-next = advance_iterator
-
-
-try:
- callable = callable
-except NameError:
- def callable(obj):
- return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
-
-
-if PY3:
- def get_unbound_function(unbound):
- return unbound
-
- create_bound_method = types.MethodType
-
- def create_unbound_method(func, cls):
- return func
-
- Iterator = object
-else:
- def get_unbound_function(unbound):
- return unbound.im_func
-
- def create_bound_method(func, obj):
- return types.MethodType(func, obj, obj.__class__)
-
- def create_unbound_method(func, cls):
- return types.MethodType(func, None, cls)
-
- class Iterator(object):
-
- def next(self):
- return type(self).__next__(self)
-
- callable = callable
-_add_doc(get_unbound_function,
- """Get the function out of a possibly unbound function""")
-
-
-get_method_function = operator.attrgetter(_meth_func)
-get_method_self = operator.attrgetter(_meth_self)
-get_function_closure = operator.attrgetter(_func_closure)
-get_function_code = operator.attrgetter(_func_code)
-get_function_defaults = operator.attrgetter(_func_defaults)
-get_function_globals = operator.attrgetter(_func_globals)
-
-
-if PY3:
- def iterkeys(d, **kw):
- return iter(d.keys(**kw))
-
- def itervalues(d, **kw):
- return iter(d.values(**kw))
-
- def iteritems(d, **kw):
- return iter(d.items(**kw))
-
- def iterlists(d, **kw):
- return iter(d.lists(**kw))
-
- viewkeys = operator.methodcaller("keys")
-
- viewvalues = operator.methodcaller("values")
-
- viewitems = operator.methodcaller("items")
-else:
- def iterkeys(d, **kw):
- return d.iterkeys(**kw)
-
- def itervalues(d, **kw):
- return d.itervalues(**kw)
-
- def iteritems(d, **kw):
- return d.iteritems(**kw)
-
- def iterlists(d, **kw):
- return d.iterlists(**kw)
-
- viewkeys = operator.methodcaller("viewkeys")
-
- viewvalues = operator.methodcaller("viewvalues")
-
- viewitems = operator.methodcaller("viewitems")
-
-_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
-_add_doc(itervalues, "Return an iterator over the values of a dictionary.")
-_add_doc(iteritems,
- "Return an iterator over the (key, value) pairs of a dictionary.")
-_add_doc(iterlists,
- "Return an iterator over the (key, [values]) pairs of a dictionary.")
-
-
-if PY3:
- def b(s):
- return s.encode("latin-1")
-
- def u(s):
- return s
- unichr = chr
- import struct
- int2byte = struct.Struct(">B").pack
- del struct
- byte2int = operator.itemgetter(0)
- indexbytes = operator.getitem
- iterbytes = iter
- import io
- StringIO = io.StringIO
- BytesIO = io.BytesIO
- del io
- _assertCountEqual = "assertCountEqual"
- if sys.version_info[1] <= 1:
- _assertRaisesRegex = "assertRaisesRegexp"
- _assertRegex = "assertRegexpMatches"
- _assertNotRegex = "assertNotRegexpMatches"
- else:
- _assertRaisesRegex = "assertRaisesRegex"
- _assertRegex = "assertRegex"
- _assertNotRegex = "assertNotRegex"
-else:
- def b(s):
- return s
- # Workaround for standalone backslash
-
- def u(s):
- return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
- unichr = unichr
- int2byte = chr
-
- def byte2int(bs):
- return ord(bs[0])
-
- def indexbytes(buf, i):
- return ord(buf[i])
- iterbytes = functools.partial(itertools.imap, ord)
- import StringIO
- StringIO = BytesIO = StringIO.StringIO
- _assertCountEqual = "assertItemsEqual"
- _assertRaisesRegex = "assertRaisesRegexp"
- _assertRegex = "assertRegexpMatches"
- _assertNotRegex = "assertNotRegexpMatches"
-_add_doc(b, """Byte literal""")
-_add_doc(u, """Text literal""")
-
-
-def assertCountEqual(self, *args, **kwargs):
- return getattr(self, _assertCountEqual)(*args, **kwargs)
-
-
-def assertRaisesRegex(self, *args, **kwargs):
- return getattr(self, _assertRaisesRegex)(*args, **kwargs)
-
-
-def assertRegex(self, *args, **kwargs):
- return getattr(self, _assertRegex)(*args, **kwargs)
-
-
-def assertNotRegex(self, *args, **kwargs):
- return getattr(self, _assertNotRegex)(*args, **kwargs)
-
-
-if PY3:
- exec_ = getattr(moves.builtins, "exec")
-
- def reraise(tp, value, tb=None):
- try:
- if value is None:
- value = tp()
- if value.__traceback__ is not tb:
- raise value.with_traceback(tb)
- raise value
- finally:
- value = None
- tb = None
-
-else:
- def exec_(_code_, _globs_=None, _locs_=None):
- """Execute code in a namespace."""
- if _globs_ is None:
- frame = sys._getframe(1)
- _globs_ = frame.f_globals
- if _locs_ is None:
- _locs_ = frame.f_locals
- del frame
- elif _locs_ is None:
- _locs_ = _globs_
- exec("""exec _code_ in _globs_, _locs_""")
-
- exec_("""def reraise(tp, value, tb=None):
- try:
- raise tp, value, tb
- finally:
- tb = None
-""")
-
-
-if sys.version_info[:2] > (3,):
- exec_("""def raise_from(value, from_value):
- try:
- raise value from from_value
- finally:
- value = None
-""")
-else:
- def raise_from(value, from_value):
- raise value
-
-
-print_ = getattr(moves.builtins, "print", None)
-if print_ is None:
- def print_(*args, **kwargs):
- """The new-style print function for Python 2.4 and 2.5."""
- fp = kwargs.pop("file", sys.stdout)
- if fp is None:
- return
-
- def write(data):
- if not isinstance(data, basestring):
- data = str(data)
- # If the file has an encoding, encode unicode with it.
- if (isinstance(fp, file) and
- isinstance(data, unicode) and
- fp.encoding is not None):
- errors = getattr(fp, "errors", None)
- if errors is None:
- errors = "strict"
- data = data.encode(fp.encoding, errors)
- fp.write(data)
- want_unicode = False
- sep = kwargs.pop("sep", None)
- if sep is not None:
- if isinstance(sep, unicode):
- want_unicode = True
- elif not isinstance(sep, str):
- raise TypeError("sep must be None or a string")
- end = kwargs.pop("end", None)
- if end is not None:
- if isinstance(end, unicode):
- want_unicode = True
- elif not isinstance(end, str):
- raise TypeError("end must be None or a string")
- if kwargs:
- raise TypeError("invalid keyword arguments to print()")
- if not want_unicode:
- for arg in args:
- if isinstance(arg, unicode):
- want_unicode = True
- break
- if want_unicode:
- newline = unicode("\n")
- space = unicode(" ")
- else:
- newline = "\n"
- space = " "
- if sep is None:
- sep = space
- if end is None:
- end = newline
- for i, arg in enumerate(args):
- if i:
- write(sep)
- write(arg)
- write(end)
-if sys.version_info[:2] < (3, 3):
- _print = print_
-
- def print_(*args, **kwargs):
- fp = kwargs.get("file", sys.stdout)
- flush = kwargs.pop("flush", False)
- _print(*args, **kwargs)
- if flush and fp is not None:
- fp.flush()
-
-_add_doc(reraise, """Reraise an exception.""")
-
-if sys.version_info[0:2] < (3, 4):
- # This does exactly the same what the :func:`py3:functools.update_wrapper`
- # function does on Python versions after 3.2. It sets the ``__wrapped__``
- # attribute on ``wrapper`` object and it doesn't raise an error if any of
- # the attributes mentioned in ``assigned`` and ``updated`` are missing on
- # ``wrapped`` object.
- def _update_wrapper(wrapper, wrapped,
- assigned=functools.WRAPPER_ASSIGNMENTS,
- updated=functools.WRAPPER_UPDATES):
- for attr in assigned:
- try:
- value = getattr(wrapped, attr)
- except AttributeError:
- continue
- else:
- setattr(wrapper, attr, value)
- for attr in updated:
- getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
- wrapper.__wrapped__ = wrapped
- return wrapper
- _update_wrapper.__doc__ = functools.update_wrapper.__doc__
-
- def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
- updated=functools.WRAPPER_UPDATES):
- return functools.partial(_update_wrapper, wrapped=wrapped,
- assigned=assigned, updated=updated)
- wraps.__doc__ = functools.wraps.__doc__
-
-else:
- wraps = functools.wraps
-
-
-def with_metaclass(meta, *bases):
- """Create a base class with a metaclass."""
- # This requires a bit of explanation: the basic idea is to make a dummy
- # metaclass for one level of class instantiation that replaces itself with
- # the actual metaclass.
- class metaclass(type):
-
- def __new__(cls, name, this_bases, d):
- if sys.version_info[:2] >= (3, 7):
- # This version introduced PEP 560 that requires a bit
- # of extra care (we mimic what is done by __build_class__).
- resolved_bases = types.resolve_bases(bases)
- if resolved_bases is not bases:
- d['__orig_bases__'] = bases
- else:
- resolved_bases = bases
- return meta(name, resolved_bases, d)
-
- @classmethod
- def __prepare__(cls, name, this_bases):
- return meta.__prepare__(name, bases)
- return type.__new__(metaclass, 'temporary_class', (), {})
-
-
-def add_metaclass(metaclass):
- """Class decorator for creating a class with a metaclass."""
- def wrapper(cls):
- orig_vars = cls.__dict__.copy()
- slots = orig_vars.get('__slots__')
- if slots is not None:
- if isinstance(slots, str):
- slots = [slots]
- for slots_var in slots:
- orig_vars.pop(slots_var)
- orig_vars.pop('__dict__', None)
- orig_vars.pop('__weakref__', None)
- if hasattr(cls, '__qualname__'):
- orig_vars['__qualname__'] = cls.__qualname__
- return metaclass(cls.__name__, cls.__bases__, orig_vars)
- return wrapper
-
-
-def ensure_binary(s, encoding='utf-8', errors='strict'):
- """Coerce **s** to six.binary_type.
-
- For Python 2:
- - `unicode` -> encoded to `str`
- - `str` -> `str`
-
- For Python 3:
- - `str` -> encoded to `bytes`
- - `bytes` -> `bytes`
- """
- if isinstance(s, binary_type):
- return s
- if isinstance(s, text_type):
- return s.encode(encoding, errors)
- raise TypeError("not expecting type '%s'" % type(s))
-
-
-def ensure_str(s, encoding='utf-8', errors='strict'):
- """Coerce *s* to `str`.
-
- For Python 2:
- - `unicode` -> encoded to `str`
- - `str` -> `str`
-
- For Python 3:
- - `str` -> `str`
- - `bytes` -> decoded to `str`
- """
- # Optimization: Fast return for the common case.
- if type(s) is str:
- return s
- if PY2 and isinstance(s, text_type):
- return s.encode(encoding, errors)
- elif PY3 and isinstance(s, binary_type):
- return s.decode(encoding, errors)
- elif not isinstance(s, (text_type, binary_type)):
- raise TypeError("not expecting type '%s'" % type(s))
- return s
-
-
-def ensure_text(s, encoding='utf-8', errors='strict'):
- """Coerce *s* to six.text_type.
-
- For Python 2:
- - `unicode` -> `unicode`
- - `str` -> `unicode`
-
- For Python 3:
- - `str` -> `str`
- - `bytes` -> decoded to `str`
- """
- if isinstance(s, binary_type):
- return s.decode(encoding, errors)
- elif isinstance(s, text_type):
- return s
- else:
- raise TypeError("not expecting type '%s'" % type(s))
-
-
-def python_2_unicode_compatible(klass):
- """
- A class decorator that defines __unicode__ and __str__ methods under Python 2.
- Under Python 3 it does nothing.
-
- To support Python 2 and 3 with a single code base, define a __str__ method
- returning text and apply this decorator to the class.
- """
- if PY2:
- if '__str__' not in klass.__dict__:
- raise ValueError("@python_2_unicode_compatible cannot be applied "
- "to %s because it doesn't define __str__()." %
- klass.__name__)
- klass.__unicode__ = klass.__str__
- klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
- return klass
-
-
-# Complete the moves implementation.
-# This code is at the end of this module to speed up module loading.
-# Turn this module into a package.
-__path__ = [] # required for PEP 302 and PEP 451
-__package__ = __name__ # see PEP 366 @ReservedAssignment
-if globals().get("__spec__") is not None:
- __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable
-# Remove other six meta path importers, since they cause problems. This can
-# happen if six is removed from sys.modules and then reloaded. (Setuptools does
-# this for some reason.)
-if sys.meta_path:
- for i, importer in enumerate(sys.meta_path):
- # Here's some real nastiness: Another "instance" of the six module might
- # be floating around. Therefore, we can't use isinstance() to check for
- # the six meta path importer, since the other six instance will have
- # inserted an importer with different class.
- if (type(importer).__name__ == "_SixMetaPathImporter" and
- importer.name == __name__):
- del sys.meta_path[i]
- break
- del i, importer
-# Finally, add the importer to the meta path import hook.
-sys.meta_path.append(_importer)
diff --git a/contrib/python/pip/pip/_vendor/tenacity/__init__.py b/contrib/python/pip/pip/_vendor/tenacity/__init__.py
index 4f1603adeb..c1b0310bdf 100644
--- a/contrib/python/pip/pip/_vendor/tenacity/__init__.py
+++ b/contrib/python/pip/pip/_vendor/tenacity/__init__.py
@@ -501,7 +501,7 @@ def retry(func: WrappedFn) -> WrappedFn:
@t.overload
def retry(
- sleep: t.Callable[[t.Union[int, float]], None] = sleep,
+ sleep: t.Callable[[t.Union[int, float]], t.Optional[t.Awaitable[None]]] = sleep,
stop: "StopBaseT" = stop_never,
wait: "WaitBaseT" = wait_none(),
retry: "RetryBaseT" = retry_if_exception_type(),
diff --git a/contrib/python/pip/pip/_vendor/truststore/__init__.py b/contrib/python/pip/pip/_vendor/truststore/__init__.py
index 59930f455b..86368145a7 100644
--- a/contrib/python/pip/pip/_vendor/truststore/__init__.py
+++ b/contrib/python/pip/pip/_vendor/truststore/__init__.py
@@ -10,4 +10,4 @@ from ._api import SSLContext, extract_from_ssl, inject_into_ssl # noqa: E402
del _api, _sys # type: ignore[name-defined] # noqa: F821
__all__ = ["SSLContext", "inject_into_ssl", "extract_from_ssl"]
-__version__ = "0.8.0"
+__version__ = "0.9.1"
diff --git a/contrib/python/pip/pip/_vendor/truststore/_api.py b/contrib/python/pip/pip/_vendor/truststore/_api.py
index 829aff7267..b1ea3b05c6 100644
--- a/contrib/python/pip/pip/_vendor/truststore/_api.py
+++ b/contrib/python/pip/pip/_vendor/truststore/_api.py
@@ -2,9 +2,10 @@ import os
import platform
import socket
import ssl
+import sys
import typing
-import _ssl # type: ignore[import]
+import _ssl # type: ignore[import-not-found]
from ._ssl_constants import (
_original_SSLContext,
@@ -49,7 +50,7 @@ def extract_from_ssl() -> None:
try:
import pip._vendor.urllib3.util.ssl_ as urllib3_ssl
- urllib3_ssl.SSLContext = _original_SSLContext
+ urllib3_ssl.SSLContext = _original_SSLContext # type: ignore[assignment]
except ImportError:
pass
@@ -171,16 +172,13 @@ class SSLContext(_truststore_SSLContext_super_class): # type: ignore[misc]
@typing.overload
def get_ca_certs(
self, binary_form: typing.Literal[False] = ...
- ) -> list[typing.Any]:
- ...
+ ) -> list[typing.Any]: ...
@typing.overload
- def get_ca_certs(self, binary_form: typing.Literal[True] = ...) -> list[bytes]:
- ...
+ def get_ca_certs(self, binary_form: typing.Literal[True] = ...) -> list[bytes]: ...
@typing.overload
- def get_ca_certs(self, binary_form: bool = ...) -> typing.Any:
- ...
+ def get_ca_certs(self, binary_form: bool = ...) -> typing.Any: ...
def get_ca_certs(self, binary_form: bool = False) -> list[typing.Any] | list[bytes]:
raise NotImplementedError()
@@ -276,6 +274,25 @@ class SSLContext(_truststore_SSLContext_super_class): # type: ignore[misc]
)
+# Python 3.13+ makes get_unverified_chain() a public API that only returns DER
+# encoded certificates. We detect whether we need to call public_bytes() for 3.10->3.12
+# Pre-3.13 returned None instead of an empty list from get_unverified_chain()
+if sys.version_info >= (3, 13):
+
+ def _get_unverified_chain_bytes(sslobj: ssl.SSLObject) -> list[bytes]:
+ unverified_chain = sslobj.get_unverified_chain() or () # type: ignore[attr-defined]
+ return [
+ cert if isinstance(cert, bytes) else cert.public_bytes(_ssl.ENCODING_DER)
+ for cert in unverified_chain
+ ]
+
+else:
+
+ def _get_unverified_chain_bytes(sslobj: ssl.SSLObject) -> list[bytes]:
+ unverified_chain = sslobj.get_unverified_chain() or () # type: ignore[attr-defined]
+ return [cert.public_bytes(_ssl.ENCODING_DER) for cert in unverified_chain]
+
+
def _verify_peercerts(
sock_or_sslobj: ssl.SSLSocket | ssl.SSLObject, server_hostname: str | None
) -> None:
@@ -290,13 +307,7 @@ def _verify_peercerts(
except AttributeError:
pass
- # SSLObject.get_unverified_chain() returns 'None'
- # if the peer sends no certificates. This is common
- # for the server-side scenario.
- unverified_chain: typing.Sequence[_ssl.Certificate] = (
- sslobj.get_unverified_chain() or () # type: ignore[attr-defined]
- )
- cert_bytes = [cert.public_bytes(_ssl.ENCODING_DER) for cert in unverified_chain]
+ cert_bytes = _get_unverified_chain_bytes(sslobj)
_verify_peercerts_impl(
sock_or_sslobj.context, cert_bytes, server_hostname=server_hostname
)
diff --git a/contrib/python/pip/pip/_vendor/truststore/_macos.py b/contrib/python/pip/pip/_vendor/truststore/_macos.py
index 7dc440bf36..b234ffec72 100644
--- a/contrib/python/pip/pip/_vendor/truststore/_macos.py
+++ b/contrib/python/pip/pip/_vendor/truststore/_macos.py
@@ -96,9 +96,6 @@ try:
Security.SecTrustSetAnchorCertificatesOnly.argtypes = [SecTrustRef, Boolean]
Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus
- Security.SecTrustEvaluate.argtypes = [SecTrustRef, POINTER(SecTrustResultType)]
- Security.SecTrustEvaluate.restype = OSStatus
-
Security.SecPolicyCreateRevocation.argtypes = [CFOptionFlags]
Security.SecPolicyCreateRevocation.restype = SecPolicyRef
@@ -259,6 +256,7 @@ def _handle_osstatus(result: OSStatus, _: typing.Any, args: typing.Any) -> typin
Security.SecTrustCreateWithCertificates.errcheck = _handle_osstatus # type: ignore[assignment]
Security.SecTrustSetAnchorCertificates.errcheck = _handle_osstatus # type: ignore[assignment]
+Security.SecTrustSetAnchorCertificatesOnly.errcheck = _handle_osstatus # type: ignore[assignment]
Security.SecTrustGetTrustResult.errcheck = _handle_osstatus # type: ignore[assignment]
@@ -417,21 +415,21 @@ def _verify_peercerts_impl(
CoreFoundation.CFRelease(certs)
# If there are additional trust anchors to load we need to transform
- # the list of DER-encoded certificates into a CFArray. Otherwise
- # pass 'None' to signal that we only want system / fetched certificates.
+ # the list of DER-encoded certificates into a CFArray.
ctx_ca_certs_der: list[bytes] | None = ssl_context.get_ca_certs(
binary_form=True
)
if ctx_ca_certs_der:
ctx_ca_certs = None
try:
- ctx_ca_certs = _der_certs_to_cf_cert_array(cert_chain)
+ ctx_ca_certs = _der_certs_to_cf_cert_array(ctx_ca_certs_der)
Security.SecTrustSetAnchorCertificates(trust, ctx_ca_certs)
finally:
if ctx_ca_certs:
CoreFoundation.CFRelease(ctx_ca_certs)
- else:
- Security.SecTrustSetAnchorCertificates(trust, None)
+
+ # We always want system certificates.
+ Security.SecTrustSetAnchorCertificatesOnly(trust, False)
cf_error = CoreFoundation.CFErrorRef()
sec_trust_eval_result = Security.SecTrustEvaluateWithError(
diff --git a/contrib/python/pip/pip/_vendor/truststore/_windows.py b/contrib/python/pip/pip/_vendor/truststore/_windows.py
index 3de4960a1b..3d00d467f9 100644
--- a/contrib/python/pip/pip/_vendor/truststore/_windows.py
+++ b/contrib/python/pip/pip/_vendor/truststore/_windows.py
@@ -325,6 +325,12 @@ def _verify_peercerts_impl(
server_hostname: str | None = None,
) -> None:
"""Verify the cert_chain from the server using Windows APIs."""
+
+ # If the peer didn't send any certificates then
+ # we can't do verification. Raise an error.
+ if not cert_chain:
+ raise ssl.SSLCertVerificationError("Peer sent no certificates to verify")
+
pCertContext = None
hIntermediateCertStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, None, 0, None)
try:
@@ -375,7 +381,7 @@ def _verify_peercerts_impl(
server_hostname,
chain_flags=chain_flags,
)
- except ssl.SSLCertVerificationError:
+ except ssl.SSLCertVerificationError as e:
# If that fails but custom CA certs have been added
# to the SSLContext using load_verify_locations,
# try verifying using a custom chain engine
@@ -384,15 +390,19 @@ def _verify_peercerts_impl(
binary_form=True
)
if custom_ca_certs:
- _verify_using_custom_ca_certs(
- ssl_context,
- custom_ca_certs,
- hIntermediateCertStore,
- pCertContext,
- pChainPara,
- server_hostname,
- chain_flags=chain_flags,
- )
+ try:
+ _verify_using_custom_ca_certs(
+ ssl_context,
+ custom_ca_certs,
+ hIntermediateCertStore,
+ pCertContext,
+ pChainPara,
+ server_hostname,
+ chain_flags=chain_flags,
+ )
+ # Raise the original error, not the new error.
+ except ssl.SSLCertVerificationError:
+ raise e from None
else:
raise
finally:
diff --git a/contrib/python/pip/pip/_vendor/typing_extensions.py b/contrib/python/pip/pip/_vendor/typing_extensions.py
index 4f93acffbd..d60315a6ad 100644
--- a/contrib/python/pip/pip/_vendor/typing_extensions.py
+++ b/contrib/python/pip/pip/_vendor/typing_extensions.py
@@ -60,6 +60,7 @@ __all__ = [
'clear_overloads',
'dataclass_transform',
'deprecated',
+ 'Doc',
'get_overloads',
'final',
'get_args',
@@ -82,9 +83,11 @@ __all__ = [
'TypeAlias',
'TypeAliasType',
'TypeGuard',
+ 'TypeIs',
'TYPE_CHECKING',
'Never',
'NoReturn',
+ 'ReadOnly',
'Required',
'NotRequired',
@@ -144,27 +147,6 @@ class _Sentinel:
_marker = _Sentinel()
-def _check_generic(cls, parameters, elen=_marker):
- """Check correct count for parameters of a generic cls (internal helper).
- This gives a nice error message in case of count mismatch.
- """
- if not elen:
- raise TypeError(f"{cls} is not a generic class")
- if elen is _marker:
- if not hasattr(cls, "__parameters__") or not cls.__parameters__:
- raise TypeError(f"{cls} is not a generic class")
- elen = len(cls.__parameters__)
- alen = len(parameters)
- if alen != elen:
- if hasattr(cls, "__parameters__"):
- parameters = [p for p in cls.__parameters__ if not _is_unpack(p)]
- num_tv_tuples = sum(isinstance(p, TypeVarTuple) for p in parameters)
- if (num_tv_tuples > 0) and (alen >= elen - num_tv_tuples):
- return
- raise TypeError(f"Too {'many' if alen > elen else 'few'} parameters for {cls};"
- f" actual {alen}, expected {elen}")
-
-
if sys.version_info >= (3, 10):
def _should_collect_from_parameters(t):
return isinstance(
@@ -178,27 +160,6 @@ else:
return isinstance(t, typing._GenericAlias) and not t._special
-def _collect_type_vars(types, typevar_types=None):
- """Collect all type variable contained in types in order of
- first appearance (lexicographic order). For example::
-
- _collect_type_vars((T, List[S, T])) == (T, S)
- """
- if typevar_types is None:
- typevar_types = typing.TypeVar
- tvars = []
- for t in types:
- if (
- isinstance(t, typevar_types) and
- t not in tvars and
- not _is_unpack(t)
- ):
- tvars.append(t)
- if _should_collect_from_parameters(t):
- tvars.extend([t for t in t.__parameters__ if t not in tvars])
- return tuple(tvars)
-
-
NoReturn = typing.NoReturn
# Some unconstrained type variables. These are used by the container types.
@@ -248,32 +209,7 @@ class _ExtensionsSpecialForm(typing._SpecialForm, _root=True):
return 'typing_extensions.' + self._name
-# On older versions of typing there is an internal class named "Final".
-# 3.8+
-if hasattr(typing, 'Final') and sys.version_info[:2] >= (3, 7):
- Final = typing.Final
-# 3.7
-else:
- class _FinalForm(_ExtensionsSpecialForm, _root=True):
- def __getitem__(self, parameters):
- item = typing._type_check(parameters,
- f'{self._name} accepts only a single type.')
- return typing._GenericAlias(self, (item,))
-
- Final = _FinalForm('Final',
- doc="""A special typing construct to indicate that a name
- cannot be re-assigned or overridden in a subclass.
- For example:
-
- MAX_SIZE: Final = 9000
- MAX_SIZE += 1 # Error reported by type checker
-
- class Connection:
- TIMEOUT: Final[int] = 10
- class FastConnector(Connection):
- TIMEOUT = 1 # Error reported by type checker
-
- There is no runtime checking of these properties.""")
+Final = typing.Final
if sys.version_info >= (3, 11):
final = typing.final
@@ -465,8 +401,6 @@ Type = typing.Type
# Various ABCs mimicking those in collections.abc.
# A few are simply re-exported for completeness.
-
-
Awaitable = typing.Awaitable
Coroutine = typing.Coroutine
AsyncIterable = typing.AsyncIterable
@@ -475,14 +409,7 @@ Deque = typing.Deque
ContextManager = typing.ContextManager
AsyncContextManager = typing.AsyncContextManager
DefaultDict = typing.DefaultDict
-
-# 3.7.2+
-if hasattr(typing, 'OrderedDict'):
- OrderedDict = typing.OrderedDict
-# 3.7.0-3.7.2
-else:
- OrderedDict = typing._alias(collections.OrderedDict, (KT, VT))
-
+OrderedDict = typing.OrderedDict
Counter = typing.Counter
ChainMap = typing.ChainMap
AsyncGenerator = typing.AsyncGenerator
@@ -505,15 +432,10 @@ _EXCLUDED_ATTRS = {
"_is_runtime_protocol", "__dict__", "__slots__", "__parameters__",
"__orig_bases__", "__module__", "_MutableMapping__marker", "__doc__",
"__subclasshook__", "__orig_class__", "__init__", "__new__",
- "__protocol_attrs__", "__callable_proto_members_only__",
+ "__protocol_attrs__", "__non_callable_proto_members__",
+ "__match_args__",
}
-if sys.version_info < (3, 8):
- _EXCLUDED_ATTRS |= {
- "_gorg", "__next_in_mro__", "__extra__", "__tree_hash__", "__args__",
- "__origin__"
- }
-
if sys.version_info >= (3, 9):
_EXCLUDED_ATTRS.add("__class_getitem__")
@@ -535,46 +457,6 @@ def _get_protocol_attrs(cls):
return attrs
-def _maybe_adjust_parameters(cls):
- """Helper function used in Protocol.__init_subclass__ and _TypedDictMeta.__new__.
-
- The contents of this function are very similar
- to logic found in typing.Generic.__init_subclass__
- on the CPython main branch.
- """
- tvars = []
- if '__orig_bases__' in cls.__dict__:
- tvars = _collect_type_vars(cls.__orig_bases__)
- # Look for Generic[T1, ..., Tn] or Protocol[T1, ..., Tn].
- # If found, tvars must be a subset of it.
- # If not found, tvars is it.
- # Also check for and reject plain Generic,
- # and reject multiple Generic[...] and/or Protocol[...].
- gvars = None
- for base in cls.__orig_bases__:
- if (isinstance(base, typing._GenericAlias) and
- base.__origin__ in (typing.Generic, Protocol)):
- # for error messages
- the_base = base.__origin__.__name__
- if gvars is not None:
- raise TypeError(
- "Cannot inherit from Generic[...]"
- " and/or Protocol[...] multiple types.")
- gvars = base.__parameters__
- if gvars is None:
- gvars = tvars
- else:
- tvarset = set(tvars)
- gvarset = set(gvars)
- if not tvarset <= gvarset:
- s_vars = ', '.join(str(t) for t in tvars if t not in gvarset)
- s_args = ', '.join(str(g) for g in gvars)
- raise TypeError(f"Some type variables ({s_vars}) are"
- f" not listed in {the_base}[{s_args}]")
- tvars = gvars
- cls.__parameters__ = tuple(tvars)
-
-
def _caller(depth=2):
try:
return sys._getframe(depth).f_globals.get('__name__', '__main__')
@@ -582,9 +464,9 @@ def _caller(depth=2):
return None
-# The performance of runtime-checkable protocols is significantly improved on Python 3.12,
-# so we backport the 3.12 version of Protocol to Python <=3.11
-if sys.version_info >= (3, 12):
+# `__match_args__` attribute was removed from protocol members in 3.13,
+# we want to backport this change to older Python versions.
+if sys.version_info >= (3, 13):
Protocol = typing.Protocol
else:
def _allow_reckless_class_checks(depth=3):
@@ -598,17 +480,26 @@ else:
if type(self)._is_protocol:
raise TypeError('Protocols cannot be instantiated')
- if sys.version_info >= (3, 8):
- # Inheriting from typing._ProtocolMeta isn't actually desirable,
- # but is necessary to allow typing.Protocol and typing_extensions.Protocol
- # to mix without getting TypeErrors about "metaclass conflict"
- _typing_Protocol = typing.Protocol
- _ProtocolMetaBase = type(_typing_Protocol)
- else:
- _typing_Protocol = _marker
- _ProtocolMetaBase = abc.ABCMeta
+ def _type_check_issubclass_arg_1(arg):
+ """Raise TypeError if `arg` is not an instance of `type`
+ in `issubclass(arg, <protocol>)`.
- class _ProtocolMeta(_ProtocolMetaBase):
+ In most cases, this is verified by type.__subclasscheck__.
+ Checking it again unnecessarily would slow down issubclass() checks,
+ so, we don't perform this check unless we absolutely have to.
+
+ For various error paths, however,
+ we want to ensure that *this* error message is shown to the user
+ where relevant, rather than a typing.py-specific error message.
+ """
+ if not isinstance(arg, type):
+ # Same error message as for issubclass(1, int).
+ raise TypeError('issubclass() arg 1 must be a class')
+
+ # Inheriting from typing._ProtocolMeta isn't actually desirable,
+ # but is necessary to allow typing.Protocol and typing_extensions.Protocol
+ # to mix without getting TypeErrors about "metaclass conflict"
+ class _ProtocolMeta(type(typing.Protocol)):
# This metaclass is somewhat unfortunate,
# but is necessary for several reasons...
#
@@ -618,10 +509,10 @@ else:
def __new__(mcls, name, bases, namespace, **kwargs):
if name == "Protocol" and len(bases) < 2:
pass
- elif {Protocol, _typing_Protocol} & set(bases):
+ elif {Protocol, typing.Protocol} & set(bases):
for base in bases:
if not (
- base in {object, typing.Generic, Protocol, _typing_Protocol}
+ base in {object, typing.Generic, Protocol, typing.Protocol}
or base.__name__ in _PROTO_ALLOWLIST.get(base.__module__, [])
or is_protocol(base)
):
@@ -635,11 +526,6 @@ else:
abc.ABCMeta.__init__(cls, *args, **kwargs)
if getattr(cls, "_is_protocol", False):
cls.__protocol_attrs__ = _get_protocol_attrs(cls)
- # PEP 544 prohibits using issubclass()
- # with protocols that have non-method members.
- cls.__callable_proto_members_only__ = all(
- callable(getattr(cls, attr, None)) for attr in cls.__protocol_attrs__
- )
def __subclasscheck__(cls, other):
if cls is Protocol:
@@ -648,21 +534,23 @@ else:
getattr(cls, '_is_protocol', False)
and not _allow_reckless_class_checks()
):
- if not isinstance(other, type):
- # Same error message as for issubclass(1, int).
- raise TypeError('issubclass() arg 1 must be a class')
- if (
- not cls.__callable_proto_members_only__
- and cls.__dict__.get("__subclasshook__") is _proto_hook
- ):
- raise TypeError(
- "Protocols with non-method members don't support issubclass()"
- )
if not getattr(cls, '_is_runtime_protocol', False):
+ _type_check_issubclass_arg_1(other)
raise TypeError(
"Instance and class checks can only be used with "
"@runtime_checkable protocols"
)
+ if (
+ # this attribute is set by @runtime_checkable:
+ cls.__non_callable_proto_members__
+ and cls.__dict__.get("__subclasshook__") is _proto_hook
+ ):
+ _type_check_issubclass_arg_1(other)
+ non_method_attrs = sorted(cls.__non_callable_proto_members__)
+ raise TypeError(
+ "Protocols with non-method members don't support issubclass()."
+ f" Non-method members: {str(non_method_attrs)[1:-1]}."
+ )
return abc.ABCMeta.__subclasscheck__(cls, other)
def __instancecheck__(cls, instance):
@@ -689,7 +577,8 @@ else:
val = inspect.getattr_static(instance, attr)
except AttributeError:
break
- if val is None and callable(getattr(cls, attr, None)):
+ # this attribute is set by @runtime_checkable:
+ if val is None and attr not in cls.__non_callable_proto_members__:
break
else:
return True
@@ -699,12 +588,10 @@ else:
def __eq__(cls, other):
# Hack so that typing.Generic.__class_getitem__
# treats typing_extensions.Protocol
- # as equivalent to typing.Protocol on Python 3.8+
+ # as equivalent to typing.Protocol
if abc.ABCMeta.__eq__(cls, other) is True:
return True
- return (
- cls is Protocol and other is getattr(typing, "Protocol", object())
- )
+ return cls is Protocol and other is typing.Protocol
# This has to be defined, or the abc-module cache
# complains about classes with this metaclass being unhashable,
@@ -737,146 +624,83 @@ else:
return NotImplemented
return True
- if sys.version_info >= (3, 8):
- class Protocol(typing.Generic, metaclass=_ProtocolMeta):
- __doc__ = typing.Protocol.__doc__
- __slots__ = ()
- _is_protocol = True
- _is_runtime_protocol = False
-
- def __init_subclass__(cls, *args, **kwargs):
- super().__init_subclass__(*args, **kwargs)
+ class Protocol(typing.Generic, metaclass=_ProtocolMeta):
+ __doc__ = typing.Protocol.__doc__
+ __slots__ = ()
+ _is_protocol = True
+ _is_runtime_protocol = False
- # Determine if this is a protocol or a concrete subclass.
- if not cls.__dict__.get('_is_protocol', False):
- cls._is_protocol = any(b is Protocol for b in cls.__bases__)
+ def __init_subclass__(cls, *args, **kwargs):
+ super().__init_subclass__(*args, **kwargs)
- # Set (or override) the protocol subclass hook.
- if '__subclasshook__' not in cls.__dict__:
- cls.__subclasshook__ = _proto_hook
+ # Determine if this is a protocol or a concrete subclass.
+ if not cls.__dict__.get('_is_protocol', False):
+ cls._is_protocol = any(b is Protocol for b in cls.__bases__)
- # Prohibit instantiation for protocol classes
- if cls._is_protocol and cls.__init__ is Protocol.__init__:
- cls.__init__ = _no_init
+ # Set (or override) the protocol subclass hook.
+ if '__subclasshook__' not in cls.__dict__:
+ cls.__subclasshook__ = _proto_hook
- else:
- class Protocol(metaclass=_ProtocolMeta):
- # There is quite a lot of overlapping code with typing.Generic.
- # Unfortunately it is hard to avoid this on Python <3.8,
- # as the typing module on Python 3.7 doesn't let us subclass typing.Generic!
- """Base class for protocol classes. Protocol classes are defined as::
+ # Prohibit instantiation for protocol classes
+ if cls._is_protocol and cls.__init__ is Protocol.__init__:
+ cls.__init__ = _no_init
- class Proto(Protocol):
- def meth(self) -> int:
- ...
- Such classes are primarily used with static type checkers that recognize
- structural subtyping (static duck-typing), for example::
+if sys.version_info >= (3, 13):
+ runtime_checkable = typing.runtime_checkable
+else:
+ def runtime_checkable(cls):
+ """Mark a protocol class as a runtime protocol.
- class C:
- def meth(self) -> int:
- return 0
+ Such protocol can be used with isinstance() and issubclass().
+ Raise TypeError if applied to a non-protocol class.
+ This allows a simple-minded structural check very similar to
+ one trick ponies in collections.abc such as Iterable.
- def func(x: Proto) -> int:
- return x.meth()
+ For example::
- func(C()) # Passes static type check
+ @runtime_checkable
+ class Closable(Protocol):
+ def close(self): ...
- See PEP 544 for details. Protocol classes decorated with
- @typing_extensions.runtime_checkable act
- as simple-minded runtime-checkable protocols that check
- only the presence of given attributes, ignoring their type signatures.
+ assert isinstance(open('/some/file'), Closable)
- Protocol classes can be generic, they are defined as::
+ Warning: this will check only the presence of the required methods,
+ not their type signatures!
+ """
+ if not issubclass(cls, typing.Generic) or not getattr(cls, '_is_protocol', False):
+ raise TypeError('@runtime_checkable can be only applied to protocol classes,'
+ ' got %r' % cls)
+ cls._is_runtime_protocol = True
- class GenProto(Protocol[T]):
- def meth(self) -> T:
- ...
- """
- __slots__ = ()
- _is_protocol = True
- _is_runtime_protocol = False
-
- def __new__(cls, *args, **kwds):
- if cls is Protocol:
- raise TypeError("Type Protocol cannot be instantiated; "
- "it can only be used as a base class")
- return super().__new__(cls)
-
- @typing._tp_cache
- def __class_getitem__(cls, params):
- if not isinstance(params, tuple):
- params = (params,)
- if not params and cls is not typing.Tuple:
+ # Only execute the following block if it's a typing_extensions.Protocol class.
+ # typing.Protocol classes don't need it.
+ if isinstance(cls, _ProtocolMeta):
+ # PEP 544 prohibits using issubclass()
+ # with protocols that have non-method members.
+ # See gh-113320 for why we compute this attribute here,
+ # rather than in `_ProtocolMeta.__init__`
+ cls.__non_callable_proto_members__ = set()
+ for attr in cls.__protocol_attrs__:
+ try:
+ is_callable = callable(getattr(cls, attr, None))
+ except Exception as e:
raise TypeError(
- f"Parameter list to {cls.__qualname__}[...] cannot be empty")
- msg = "Parameters to generic types must be types."
- params = tuple(typing._type_check(p, msg) for p in params)
- if cls is Protocol:
- # Generic can only be subscripted with unique type variables.
- if not all(isinstance(p, typing.TypeVar) for p in params):
- i = 0
- while isinstance(params[i], typing.TypeVar):
- i += 1
- raise TypeError(
- "Parameters to Protocol[...] must all be type variables."
- f" Parameter {i + 1} is {params[i]}")
- if len(set(params)) != len(params):
- raise TypeError(
- "Parameters to Protocol[...] must all be unique")
+ f"Failed to determine whether protocol member {attr!r} "
+ "is a method member"
+ ) from e
else:
- # Subscripting a regular Generic subclass.
- _check_generic(cls, params, len(cls.__parameters__))
- return typing._GenericAlias(cls, params)
-
- def __init_subclass__(cls, *args, **kwargs):
- if '__orig_bases__' in cls.__dict__:
- error = typing.Generic in cls.__orig_bases__
- else:
- error = typing.Generic in cls.__bases__
- if error:
- raise TypeError("Cannot inherit from plain Generic")
- _maybe_adjust_parameters(cls)
-
- # Determine if this is a protocol or a concrete subclass.
- if not cls.__dict__.get('_is_protocol', None):
- cls._is_protocol = any(b is Protocol for b in cls.__bases__)
-
- # Set (or override) the protocol subclass hook.
- if '__subclasshook__' not in cls.__dict__:
- cls.__subclasshook__ = _proto_hook
+ if not is_callable:
+ cls.__non_callable_proto_members__.add(attr)
- # Prohibit instantiation for protocol classes
- if cls._is_protocol and cls.__init__ is Protocol.__init__:
- cls.__init__ = _no_init
-
-
-if sys.version_info >= (3, 8):
- runtime_checkable = typing.runtime_checkable
-else:
- def runtime_checkable(cls):
- """Mark a protocol class as a runtime protocol, so that it
- can be used with isinstance() and issubclass(). Raise TypeError
- if applied to a non-protocol class.
-
- This allows a simple-minded structural check very similar to the
- one-offs in collections.abc such as Hashable.
- """
- if not (
- (isinstance(cls, _ProtocolMeta) or issubclass(cls, typing.Generic))
- and getattr(cls, "_is_protocol", False)
- ):
- raise TypeError('@runtime_checkable can be only applied to protocol classes,'
- f' got {cls!r}')
- cls._is_runtime_protocol = True
return cls
-# Exists for backwards compatibility.
+# The "runtime" alias exists for backwards compatibility.
runtime = runtime_checkable
-# Our version of runtime-checkable protocols is faster on Python 3.7-3.11
+# Our version of runtime-checkable protocols is faster on Python 3.8-3.11
if sys.version_info >= (3, 12):
SupportsInt = typing.SupportsInt
SupportsFloat = typing.SupportsFloat
@@ -968,7 +792,11 @@ def _ensure_subclassable(mro_entries):
return inner
-if sys.version_info >= (3, 13):
+# Update this to something like >=3.13.0b1 if and when
+# PEP 728 is implemented in CPython
+_PEP_728_IMPLEMENTED = False
+
+if _PEP_728_IMPLEMENTED:
# The standard library TypedDict in Python 3.8 does not store runtime information
# about which (if any) keys are optional. See https://bugs.python.org/issue38834
# The standard library TypedDict in Python 3.9.0/1 does not honour the "total"
@@ -979,6 +807,8 @@ if sys.version_info >= (3, 13):
# Aaaand on 3.12 we add __orig_bases__ to TypedDict
# to enable better runtime introspection.
# On 3.13 we deprecate some odd ways of creating TypedDicts.
+ # Also on 3.13, PEP 705 adds the ReadOnly[] qualifier.
+ # PEP 728 (still pending) makes more changes.
TypedDict = typing.TypedDict
_TypedDictMeta = typing._TypedDictMeta
is_typeddict = typing.is_typeddict
@@ -986,13 +816,29 @@ else:
# 3.10.0 and later
_TAKES_MODULE = "module" in inspect.signature(typing._type_check).parameters
- if sys.version_info >= (3, 8):
- _fake_name = "Protocol"
- else:
- _fake_name = "_Protocol"
+ def _get_typeddict_qualifiers(annotation_type):
+ while True:
+ annotation_origin = get_origin(annotation_type)
+ if annotation_origin is Annotated:
+ annotation_args = get_args(annotation_type)
+ if annotation_args:
+ annotation_type = annotation_args[0]
+ else:
+ break
+ elif annotation_origin is Required:
+ yield Required
+ annotation_type, = get_args(annotation_type)
+ elif annotation_origin is NotRequired:
+ yield NotRequired
+ annotation_type, = get_args(annotation_type)
+ elif annotation_origin is ReadOnly:
+ yield ReadOnly
+ annotation_type, = get_args(annotation_type)
+ else:
+ break
class _TypedDictMeta(type):
- def __new__(cls, name, bases, ns, total=True):
+ def __new__(cls, name, bases, ns, *, total=True, closed=False):
"""Create new typed dict class object.
This method is called when TypedDict is subclassed,
@@ -1011,10 +857,10 @@ else:
generic_base = ()
# typing.py generally doesn't let you inherit from plain Generic, unless
- # the name of the class happens to be "Protocol" (or "_Protocol" on 3.7).
- tp_dict = type.__new__(_TypedDictMeta, _fake_name, (*generic_base, dict), ns)
+ # the name of the class happens to be "Protocol"
+ tp_dict = type.__new__(_TypedDictMeta, "Protocol", (*generic_base, dict), ns)
tp_dict.__name__ = name
- if tp_dict.__qualname__ == _fake_name:
+ if tp_dict.__qualname__ == "Protocol":
tp_dict.__qualname__ = name
if not hasattr(tp_dict, '__orig_bases__'):
@@ -1035,35 +881,67 @@ else:
}
required_keys = set()
optional_keys = set()
+ readonly_keys = set()
+ mutable_keys = set()
+ extra_items_type = None
for base in bases:
- annotations.update(base.__dict__.get('__annotations__', {}))
- required_keys.update(base.__dict__.get('__required_keys__', ()))
- optional_keys.update(base.__dict__.get('__optional_keys__', ()))
+ base_dict = base.__dict__
+
+ annotations.update(base_dict.get('__annotations__', {}))
+ required_keys.update(base_dict.get('__required_keys__', ()))
+ optional_keys.update(base_dict.get('__optional_keys__', ()))
+ readonly_keys.update(base_dict.get('__readonly_keys__', ()))
+ mutable_keys.update(base_dict.get('__mutable_keys__', ()))
+ base_extra_items_type = base_dict.get('__extra_items__', None)
+ if base_extra_items_type is not None:
+ extra_items_type = base_extra_items_type
+
+ if closed and extra_items_type is None:
+ extra_items_type = Never
+ if closed and "__extra_items__" in own_annotations:
+ annotation_type = own_annotations.pop("__extra_items__")
+ qualifiers = set(_get_typeddict_qualifiers(annotation_type))
+ if Required in qualifiers:
+ raise TypeError(
+ "Special key __extra_items__ does not support "
+ "Required"
+ )
+ if NotRequired in qualifiers:
+ raise TypeError(
+ "Special key __extra_items__ does not support "
+ "NotRequired"
+ )
+ extra_items_type = annotation_type
annotations.update(own_annotations)
for annotation_key, annotation_type in own_annotations.items():
- annotation_origin = get_origin(annotation_type)
- if annotation_origin is Annotated:
- annotation_args = get_args(annotation_type)
- if annotation_args:
- annotation_type = annotation_args[0]
- annotation_origin = get_origin(annotation_type)
-
- if annotation_origin is Required:
+ qualifiers = set(_get_typeddict_qualifiers(annotation_type))
+
+ if Required in qualifiers:
required_keys.add(annotation_key)
- elif annotation_origin is NotRequired:
+ elif NotRequired in qualifiers:
optional_keys.add(annotation_key)
elif total:
required_keys.add(annotation_key)
else:
optional_keys.add(annotation_key)
+ if ReadOnly in qualifiers:
+ mutable_keys.discard(annotation_key)
+ readonly_keys.add(annotation_key)
+ else:
+ mutable_keys.add(annotation_key)
+ readonly_keys.discard(annotation_key)
tp_dict.__annotations__ = annotations
tp_dict.__required_keys__ = frozenset(required_keys)
tp_dict.__optional_keys__ = frozenset(optional_keys)
+ tp_dict.__readonly_keys__ = frozenset(readonly_keys)
+ tp_dict.__mutable_keys__ = frozenset(mutable_keys)
if not hasattr(tp_dict, '__total__'):
tp_dict.__total__ = total
+ tp_dict.__closed__ = closed
+ tp_dict.__extra_items__ = extra_items_type
return tp_dict
__call__ = dict # static method
@@ -1077,7 +955,7 @@ else:
_TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {})
@_ensure_subclassable(lambda bases: (_TypedDict,))
- def TypedDict(__typename, __fields=_marker, *, total=True, **kwargs):
+ def TypedDict(typename, fields=_marker, /, *, total=True, closed=False, **kwargs):
"""A simple typed namespace. At runtime it is equivalent to a plain dict.
TypedDict creates a dictionary type such that a type checker will expect all
@@ -1124,24 +1002,29 @@ else:
See PEP 655 for more details on Required and NotRequired.
"""
- if __fields is _marker or __fields is None:
- if __fields is _marker:
+ if fields is _marker or fields is None:
+ if fields is _marker:
deprecated_thing = "Failing to pass a value for the 'fields' parameter"
else:
deprecated_thing = "Passing `None` as the 'fields' parameter"
- example = f"`{__typename} = TypedDict({__typename!r}, {{}})`"
+ example = f"`{typename} = TypedDict({typename!r}, {{}})`"
deprecation_msg = (
f"{deprecated_thing} is deprecated and will be disallowed in "
"Python 3.15. To create a TypedDict class with 0 fields "
"using the functional syntax, pass an empty dictionary, e.g. "
) + example + "."
warnings.warn(deprecation_msg, DeprecationWarning, stacklevel=2)
- __fields = kwargs
+ if closed is not False and closed is not True:
+ kwargs["closed"] = closed
+ closed = False
+ fields = kwargs
elif kwargs:
raise TypeError("TypedDict takes either a dict or keyword arguments,"
" but not both")
if kwargs:
+ if sys.version_info >= (3, 13):
+ raise TypeError("TypedDict takes no keyword arguments")
warnings.warn(
"The kwargs-based syntax for TypedDict definitions is deprecated "
"in Python 3.11, will be removed in Python 3.13, and may not be "
@@ -1150,13 +1033,13 @@ else:
stacklevel=2,
)
- ns = {'__annotations__': dict(__fields)}
+ ns = {'__annotations__': dict(fields)}
module = _caller()
if module is not None:
# Setting correct module is necessary to make typed dict classes pickleable.
ns['__module__'] = module
- td = _TypedDictMeta(__typename, (), ns, total=total)
+ td = _TypedDictMeta(typename, (), ns, total=total, closed=closed)
td.__orig_bases__ = (TypedDict,)
return td
@@ -1186,7 +1069,7 @@ if hasattr(typing, "assert_type"):
assert_type = typing.assert_type
else:
- def assert_type(__val, __typ):
+ def assert_type(val, typ, /):
"""Assert (to the type checker) that the value is of the given type.
When the type checker encounters a call to assert_type(), it
@@ -1199,18 +1082,18 @@ else:
At runtime this returns the first argument unchanged and otherwise
does nothing.
"""
- return __val
+ return val
-if hasattr(typing, "Required"):
+if hasattr(typing, "ReadOnly"): # 3.13+
get_type_hints = typing.get_type_hints
-else:
+else: # <=3.13
# replaces _strip_annotations()
def _strip_extras(t):
"""Strips Annotated, Required and NotRequired from a given type."""
if isinstance(t, _AnnotatedAlias):
return _strip_extras(t.__origin__)
- if hasattr(t, "__origin__") and t.__origin__ in (Required, NotRequired):
+ if hasattr(t, "__origin__") and t.__origin__ in (Required, NotRequired, ReadOnly):
return _strip_extras(t.__args__[0])
if isinstance(t, typing._GenericAlias):
stripped_args = tuple(_strip_extras(a) for a in t.__args__)
@@ -1262,11 +1145,11 @@ else:
- If two dict arguments are passed, they specify globals and
locals, respectively.
"""
- if hasattr(typing, "Annotated"):
+ if hasattr(typing, "Annotated"): # 3.9+
hint = typing.get_type_hints(
obj, globalns=globalns, localns=localns, include_extras=True
)
- else:
+ else: # 3.8
hint = typing.get_type_hints(obj, globalns=globalns, localns=localns)
if include_extras:
return hint
@@ -1279,7 +1162,7 @@ if hasattr(typing, 'Annotated'):
# Not exported and not a public API, but needed for get_origin() and get_args()
# to work.
_AnnotatedAlias = typing._AnnotatedAlias
-# 3.7-3.8
+# 3.8
else:
class _AnnotatedAlias(typing._GenericAlias, _root=True):
"""Runtime representation of an annotated type.
@@ -1384,7 +1267,7 @@ else:
if sys.version_info[:2] >= (3, 10):
get_origin = typing.get_origin
get_args = typing.get_args
-# 3.7-3.9
+# 3.8-3.9
else:
try:
# 3.9+
@@ -1462,7 +1345,7 @@ elif sys.version_info[:2] >= (3, 9):
It's invalid when used anywhere except as in the example above.
"""
raise TypeError(f"{self} is not subscriptable")
-# 3.7-3.8
+# 3.8
else:
TypeAlias = _ExtensionsSpecialForm(
'TypeAlias',
@@ -1484,7 +1367,10 @@ def _set_default(type_param, default):
type_param.__default__ = tuple((typing._type_check(d, "Default must be a type")
for d in default))
elif default != _marker:
- type_param.__default__ = typing._type_check(default, "Default must be a type")
+ if isinstance(type_param, ParamSpec) and default is ...: # ... not valid <3.11
+ type_param.__default__ = default
+ else:
+ type_param.__default__ = typing._type_check(default, "Default must be a type")
else:
type_param.__default__ = None
@@ -1519,7 +1405,7 @@ class TypeVar(metaclass=_TypeVarLikeMeta):
covariant=False, contravariant=False,
default=_marker, infer_variance=False):
if hasattr(typing, "TypeAliasType"):
- # PEP 695 implemented, can pass infer_variance to typing.TypeVar
+ # PEP 695 implemented (3.12+), can pass infer_variance to typing.TypeVar
typevar = typing.TypeVar(name, *constraints, bound=bound,
covariant=covariant, contravariant=contravariant,
infer_variance=infer_variance)
@@ -1541,7 +1427,7 @@ class TypeVar(metaclass=_TypeVarLikeMeta):
if hasattr(typing, 'ParamSpecArgs'):
ParamSpecArgs = typing.ParamSpecArgs
ParamSpecKwargs = typing.ParamSpecKwargs
-# 3.7-3.9
+# 3.8-3.9
else:
class _Immutable:
"""Mixin to indicate that object should not be copied."""
@@ -1630,7 +1516,7 @@ if hasattr(typing, 'ParamSpec'):
def __init_subclass__(cls) -> None:
raise TypeError(f"type '{__name__}.ParamSpec' is not an acceptable base type")
-# 3.7-3.9
+# 3.8-3.9
else:
# Inherits from list as a workaround for Callable checks in Python < 3.9.2.
@@ -1735,7 +1621,7 @@ else:
pass
-# 3.7-3.9
+# 3.8-3.9
if not hasattr(typing, 'Concatenate'):
# Inherits from list as a workaround for Callable checks in Python < 3.9.2.
class _ConcatenateGenericAlias(list):
@@ -1770,7 +1656,7 @@ if not hasattr(typing, 'Concatenate'):
)
-# 3.7-3.9
+# 3.8-3.9
@typing._tp_cache
def _concatenate_getitem(self, parameters):
if parameters == ():
@@ -1804,7 +1690,7 @@ elif sys.version_info[:2] >= (3, 9):
See PEP 612 for detailed information.
"""
return _concatenate_getitem(self, parameters)
-# 3.7-8
+# 3.8
else:
class _ConcatenateForm(_ExtensionsSpecialForm, _root=True):
def __getitem__(self, parameters):
@@ -1874,7 +1760,7 @@ elif sys.version_info[:2] >= (3, 9):
"""
item = typing._type_check(parameters, f'{self} accepts only a single type.')
return typing._GenericAlias(self, (item,))
-# 3.7-3.8
+# 3.8
else:
class _TypeGuardForm(_ExtensionsSpecialForm, _root=True):
def __getitem__(self, parameters):
@@ -1927,6 +1813,98 @@ else:
PEP 647 (User-Defined Type Guards).
""")
+# 3.13+
+if hasattr(typing, 'TypeIs'):
+ TypeIs = typing.TypeIs
+# 3.9
+elif sys.version_info[:2] >= (3, 9):
+ @_ExtensionsSpecialForm
+ def TypeIs(self, parameters):
+ """Special typing form used to annotate the return type of a user-defined
+ type narrower function. ``TypeIs`` only accepts a single type argument.
+ At runtime, functions marked this way should return a boolean.
+
+ ``TypeIs`` aims to benefit *type narrowing* -- a technique used by static
+ type checkers to determine a more precise type of an expression within a
+ program's code flow. Usually type narrowing is done by analyzing
+ conditional code flow and applying the narrowing to a block of code. The
+ conditional expression here is sometimes referred to as a "type guard".
+
+ Sometimes it would be convenient to use a user-defined boolean function
+ as a type guard. Such a function should use ``TypeIs[...]`` as its
+ return type to alert static type checkers to this intention.
+
+ Using ``-> TypeIs`` tells the static type checker that for a given
+ function:
+
+ 1. The return value is a boolean.
+ 2. If the return value is ``True``, the type of its argument
+ is the intersection of the type inside ``TypeGuard`` and the argument's
+ previously known type.
+
+ For example::
+
+ def is_awaitable(val: object) -> TypeIs[Awaitable[Any]]:
+ return hasattr(val, '__await__')
+
+ def f(val: Union[int, Awaitable[int]]) -> int:
+ if is_awaitable(val):
+ assert_type(val, Awaitable[int])
+ else:
+ assert_type(val, int)
+
+ ``TypeIs`` also works with type variables. For more information, see
+ PEP 742 (Narrowing types with TypeIs).
+ """
+ item = typing._type_check(parameters, f'{self} accepts only a single type.')
+ return typing._GenericAlias(self, (item,))
+# 3.8
+else:
+ class _TypeIsForm(_ExtensionsSpecialForm, _root=True):
+ def __getitem__(self, parameters):
+ item = typing._type_check(parameters,
+ f'{self._name} accepts only a single type')
+ return typing._GenericAlias(self, (item,))
+
+ TypeIs = _TypeIsForm(
+ 'TypeIs',
+ doc="""Special typing form used to annotate the return type of a user-defined
+ type narrower function. ``TypeIs`` only accepts a single type argument.
+ At runtime, functions marked this way should return a boolean.
+
+ ``TypeIs`` aims to benefit *type narrowing* -- a technique used by static
+ type checkers to determine a more precise type of an expression within a
+ program's code flow. Usually type narrowing is done by analyzing
+ conditional code flow and applying the narrowing to a block of code. The
+ conditional expression here is sometimes referred to as a "type guard".
+
+ Sometimes it would be convenient to use a user-defined boolean function
+ as a type guard. Such a function should use ``TypeIs[...]`` as its
+ return type to alert static type checkers to this intention.
+
+ Using ``-> TypeIs`` tells the static type checker that for a given
+ function:
+
+ 1. The return value is a boolean.
+ 2. If the return value is ``True``, the type of its argument
+ is the intersection of the type inside ``TypeGuard`` and the argument's
+ previously known type.
+
+ For example::
+
+ def is_awaitable(val: object) -> TypeIs[Awaitable[Any]]:
+ return hasattr(val, '__await__')
+
+ def f(val: Union[int, Awaitable[int]]) -> int:
+ if is_awaitable(val):
+ assert_type(val, Awaitable[int])
+ else:
+ assert_type(val, int)
+
+ ``TypeIs`` also works with type variables. For more information, see
+ PEP 742 (Narrowing types with TypeIs).
+ """)
+
# Vendored from cpython typing._SpecialFrom
class _SpecialForm(typing._Final, _root=True):
@@ -1972,7 +1950,7 @@ class _SpecialForm(typing._Final, _root=True):
return self._getitem(self, parameters)
-if hasattr(typing, "LiteralString"):
+if hasattr(typing, "LiteralString"): # 3.11+
LiteralString = typing.LiteralString
else:
@_SpecialForm
@@ -1995,7 +1973,7 @@ else:
raise TypeError(f"{self} is not subscriptable")
-if hasattr(typing, "Self"):
+if hasattr(typing, "Self"): # 3.11+
Self = typing.Self
else:
@_SpecialForm
@@ -2016,7 +1994,7 @@ else:
raise TypeError(f"{self} is not subscriptable")
-if hasattr(typing, "Never"):
+if hasattr(typing, "Never"): # 3.11+
Never = typing.Never
else:
@_SpecialForm
@@ -2046,10 +2024,10 @@ else:
raise TypeError(f"{self} is not subscriptable")
-if hasattr(typing, 'Required'):
+if hasattr(typing, 'Required'): # 3.11+
Required = typing.Required
NotRequired = typing.NotRequired
-elif sys.version_info[:2] >= (3, 9):
+elif sys.version_info[:2] >= (3, 9): # 3.9-3.10
@_ExtensionsSpecialForm
def Required(self, parameters):
"""A special typing construct to mark a key of a total=False TypedDict
@@ -2087,7 +2065,7 @@ elif sys.version_info[:2] >= (3, 9):
item = typing._type_check(parameters, f'{self._name} accepts only a single type.')
return typing._GenericAlias(self, (item,))
-else:
+else: # 3.8
class _RequiredForm(_ExtensionsSpecialForm, _root=True):
def __getitem__(self, parameters):
item = typing._type_check(parameters,
@@ -2127,6 +2105,53 @@ else:
""")
+if hasattr(typing, 'ReadOnly'):
+ ReadOnly = typing.ReadOnly
+elif sys.version_info[:2] >= (3, 9): # 3.9-3.12
+ @_ExtensionsSpecialForm
+ def ReadOnly(self, parameters):
+ """A special typing construct to mark an item of a TypedDict as read-only.
+
+ For example:
+
+ class Movie(TypedDict):
+ title: ReadOnly[str]
+ year: int
+
+ def mutate_movie(m: Movie) -> None:
+ m["year"] = 1992 # allowed
+ m["title"] = "The Matrix" # typechecker error
+
+ There is no runtime checking for this property.
+ """
+ item = typing._type_check(parameters, f'{self._name} accepts only a single type.')
+ return typing._GenericAlias(self, (item,))
+
+else: # 3.8
+ class _ReadOnlyForm(_ExtensionsSpecialForm, _root=True):
+ def __getitem__(self, parameters):
+ item = typing._type_check(parameters,
+ f'{self._name} accepts only a single type.')
+ return typing._GenericAlias(self, (item,))
+
+ ReadOnly = _ReadOnlyForm(
+ 'ReadOnly',
+ doc="""A special typing construct to mark a key of a TypedDict as read-only.
+
+ For example:
+
+ class Movie(TypedDict):
+ title: ReadOnly[str]
+ year: int
+
+ def mutate_movie(m: Movie) -> None:
+ m["year"] = 1992 # allowed
+ m["title"] = "The Matrix" # typechecker error
+
+ There is no runtime checking for this propery.
+ """)
+
+
_UNPACK_DOC = """\
Type unpack operator.
@@ -2175,7 +2200,7 @@ if sys.version_info >= (3, 12): # PEP 692 changed the repr of Unpack[]
def _is_unpack(obj):
return get_origin(obj) is Unpack
-elif sys.version_info[:2] >= (3, 9):
+elif sys.version_info[:2] >= (3, 9): # 3.9+
class _UnpackSpecialForm(_ExtensionsSpecialForm, _root=True):
def __init__(self, getitem):
super().__init__(getitem)
@@ -2192,7 +2217,7 @@ elif sys.version_info[:2] >= (3, 9):
def _is_unpack(obj):
return isinstance(obj, _UnpackAlias)
-else:
+else: # 3.8
class _UnpackAlias(typing._GenericAlias, _root=True):
__class__ = typing.TypeVar
@@ -2225,7 +2250,7 @@ if hasattr(typing, "TypeVarTuple"): # 3.11+
def __init_subclass__(self, *args, **kwds):
raise TypeError("Cannot subclass special typing classes")
-else:
+else: # <=3.10
class TypeVarTuple(_DefaultMixin):
"""Type variable tuple.
@@ -2304,10 +2329,10 @@ else:
raise TypeError("Cannot subclass special typing classes")
-if hasattr(typing, "reveal_type"):
+if hasattr(typing, "reveal_type"): # 3.11+
reveal_type = typing.reveal_type
-else:
- def reveal_type(__obj: T) -> T:
+else: # <=3.10
+ def reveal_type(obj: T, /) -> T:
"""Reveal the inferred type of a variable.
When a static type checker encounters a call to ``reveal_type()``,
@@ -2323,14 +2348,14 @@ else:
argument and returns it unchanged.
"""
- print(f"Runtime type is {type(__obj).__name__!r}", file=sys.stderr)
- return __obj
+ print(f"Runtime type is {type(obj).__name__!r}", file=sys.stderr)
+ return obj
-if hasattr(typing, "assert_never"):
+if hasattr(typing, "assert_never"): # 3.11+
assert_never = typing.assert_never
-else:
- def assert_never(__arg: Never) -> Never:
+else: # <=3.10
+ def assert_never(arg: Never, /) -> Never:
"""Assert to the type checker that a line of code is unreachable.
Example::
@@ -2353,10 +2378,10 @@ else:
raise AssertionError("Expected code to be unreachable")
-if sys.version_info >= (3, 12):
+if sys.version_info >= (3, 12): # 3.12+
# dataclass_transform exists in 3.11 but lacks the frozen_default parameter
dataclass_transform = typing.dataclass_transform
-else:
+else: # <=3.11
def dataclass_transform(
*,
eq_default: bool = True,
@@ -2443,18 +2468,18 @@ else:
return decorator
-if hasattr(typing, "override"):
+if hasattr(typing, "override"): # 3.12+
override = typing.override
-else:
+else: # <=3.11
_F = typing.TypeVar("_F", bound=typing.Callable[..., typing.Any])
- def override(__arg: _F) -> _F:
+ def override(arg: _F, /) -> _F:
"""Indicate that a method is intended to override a method in a base class.
Usage:
class Base:
- def method(self) -> None: ...
+ def method(self) -> None:
pass
class Child(Base):
@@ -2475,28 +2500,26 @@ else:
"""
try:
- __arg.__override__ = True
+ arg.__override__ = True
except (AttributeError, TypeError):
# Skip the attribute silently if it is not writable.
# AttributeError happens if the object has __slots__ or a
# read-only property, TypeError if it's a builtin class.
pass
- return __arg
+ return arg
-if hasattr(typing, "deprecated"):
- deprecated = typing.deprecated
+if hasattr(warnings, "deprecated"):
+ deprecated = warnings.deprecated
else:
_T = typing.TypeVar("_T")
- def deprecated(
- __msg: str,
- *,
- category: typing.Optional[typing.Type[Warning]] = DeprecationWarning,
- stacklevel: int = 1,
- ) -> typing.Callable[[_T], _T]:
+ class deprecated:
"""Indicate that a class, function or overload is deprecated.
+ When this decorator is applied to an object, the type checker
+ will generate a diagnostic on usage of the deprecated object.
+
Usage:
@deprecated("Use B instead")
@@ -2513,64 +2536,113 @@ else:
@overload
def g(x: str) -> int: ...
- When this decorator is applied to an object, the type checker
- will generate a diagnostic on usage of the deprecated object.
-
- The warning specified by ``category`` will be emitted on use
- of deprecated objects. For functions, that happens on calls;
- for classes, on instantiation. If the ``category`` is ``None``,
- no warning is emitted. The ``stacklevel`` determines where the
+ The warning specified by *category* will be emitted at runtime
+ on use of deprecated objects. For functions, that happens on calls;
+ for classes, on instantiation and on creation of subclasses.
+ If the *category* is ``None``, no warning is emitted at runtime.
+ The *stacklevel* determines where the
warning is emitted. If it is ``1`` (the default), the warning
is emitted at the direct caller of the deprecated object; if it
is higher, it is emitted further up the stack.
+ Static type checker behavior is not affected by the *category*
+ and *stacklevel* arguments.
- The decorator sets the ``__deprecated__``
- attribute on the decorated object to the deprecation message
- passed to the decorator. If applied to an overload, the decorator
+ The deprecation message passed to the decorator is saved in the
+ ``__deprecated__`` attribute on the decorated object.
+ If applied to an overload, the decorator
must be after the ``@overload`` decorator for the attribute to
exist on the overload as returned by ``get_overloads()``.
See PEP 702 for details.
"""
- def decorator(__arg: _T) -> _T:
+ def __init__(
+ self,
+ message: str,
+ /,
+ *,
+ category: typing.Optional[typing.Type[Warning]] = DeprecationWarning,
+ stacklevel: int = 1,
+ ) -> None:
+ if not isinstance(message, str):
+ raise TypeError(
+ "Expected an object of type str for 'message', not "
+ f"{type(message).__name__!r}"
+ )
+ self.message = message
+ self.category = category
+ self.stacklevel = stacklevel
+
+ def __call__(self, arg: _T, /) -> _T:
+ # Make sure the inner functions created below don't
+ # retain a reference to self.
+ msg = self.message
+ category = self.category
+ stacklevel = self.stacklevel
if category is None:
- __arg.__deprecated__ = __msg
- return __arg
- elif isinstance(__arg, type):
- original_new = __arg.__new__
- has_init = __arg.__init__ is not object.__init__
+ arg.__deprecated__ = msg
+ return arg
+ elif isinstance(arg, type):
+ import functools
+ from types import MethodType
+
+ original_new = arg.__new__
@functools.wraps(original_new)
def __new__(cls, *args, **kwargs):
- warnings.warn(__msg, category=category, stacklevel=stacklevel + 1)
+ if cls is arg:
+ warnings.warn(msg, category=category, stacklevel=stacklevel + 1)
if original_new is not object.__new__:
return original_new(cls, *args, **kwargs)
# Mirrors a similar check in object.__new__.
- elif not has_init and (args or kwargs):
+ elif cls.__init__ is object.__init__ and (args or kwargs):
raise TypeError(f"{cls.__name__}() takes no arguments")
else:
return original_new(cls)
- __arg.__new__ = staticmethod(__new__)
- __arg.__deprecated__ = __new__.__deprecated__ = __msg
- return __arg
- elif callable(__arg):
- @functools.wraps(__arg)
+ arg.__new__ = staticmethod(__new__)
+
+ original_init_subclass = arg.__init_subclass__
+ # We need slightly different behavior if __init_subclass__
+ # is a bound method (likely if it was implemented in Python)
+ if isinstance(original_init_subclass, MethodType):
+ original_init_subclass = original_init_subclass.__func__
+
+ @functools.wraps(original_init_subclass)
+ def __init_subclass__(*args, **kwargs):
+ warnings.warn(msg, category=category, stacklevel=stacklevel + 1)
+ return original_init_subclass(*args, **kwargs)
+
+ arg.__init_subclass__ = classmethod(__init_subclass__)
+ # Or otherwise, which likely means it's a builtin such as
+ # object's implementation of __init_subclass__.
+ else:
+ @functools.wraps(original_init_subclass)
+ def __init_subclass__(*args, **kwargs):
+ warnings.warn(msg, category=category, stacklevel=stacklevel + 1)
+ return original_init_subclass(*args, **kwargs)
+
+ arg.__init_subclass__ = __init_subclass__
+
+ arg.__deprecated__ = __new__.__deprecated__ = msg
+ __init_subclass__.__deprecated__ = msg
+ return arg
+ elif callable(arg):
+ import functools
+
+ @functools.wraps(arg)
def wrapper(*args, **kwargs):
- warnings.warn(__msg, category=category, stacklevel=stacklevel + 1)
- return __arg(*args, **kwargs)
+ warnings.warn(msg, category=category, stacklevel=stacklevel + 1)
+ return arg(*args, **kwargs)
- __arg.__deprecated__ = wrapper.__deprecated__ = __msg
+ arg.__deprecated__ = wrapper.__deprecated__ = msg
return wrapper
else:
raise TypeError(
"@deprecated decorator with non-None category must be applied to "
- f"a class or callable, not {__arg!r}"
+ f"a class or callable, not {arg!r}"
)
- return decorator
-
# We have to do some monkey patching to deal with the dual nature of
# Unpack/TypeVarTuple:
@@ -2580,11 +2652,153 @@ else:
# counting generic parameters, so that when we subscript a generic,
# the runtime doesn't try to substitute the Unpack with the subscripted type.
if not hasattr(typing, "TypeVarTuple"):
+ def _check_generic(cls, parameters, elen=_marker):
+ """Check correct count for parameters of a generic cls (internal helper).
+
+ This gives a nice error message in case of count mismatch.
+ """
+ if not elen:
+ raise TypeError(f"{cls} is not a generic class")
+ if elen is _marker:
+ if not hasattr(cls, "__parameters__") or not cls.__parameters__:
+ raise TypeError(f"{cls} is not a generic class")
+ elen = len(cls.__parameters__)
+ alen = len(parameters)
+ if alen != elen:
+ expect_val = elen
+ if hasattr(cls, "__parameters__"):
+ parameters = [p for p in cls.__parameters__ if not _is_unpack(p)]
+ num_tv_tuples = sum(isinstance(p, TypeVarTuple) for p in parameters)
+ if (num_tv_tuples > 0) and (alen >= elen - num_tv_tuples):
+ return
+
+ # deal with TypeVarLike defaults
+ # required TypeVarLikes cannot appear after a defaulted one.
+ if alen < elen:
+ # since we validate TypeVarLike default in _collect_type_vars
+ # or _collect_parameters we can safely check parameters[alen]
+ if getattr(parameters[alen], '__default__', None) is not None:
+ return
+
+ num_default_tv = sum(getattr(p, '__default__', None)
+ is not None for p in parameters)
+
+ elen -= num_default_tv
+
+ expect_val = f"at least {elen}"
+
+ things = "arguments" if sys.version_info >= (3, 10) else "parameters"
+ raise TypeError(f"Too {'many' if alen > elen else 'few'} {things}"
+ f" for {cls}; actual {alen}, expected {expect_val}")
+else:
+ # Python 3.11+
+
+ def _check_generic(cls, parameters, elen):
+ """Check correct count for parameters of a generic cls (internal helper).
+
+ This gives a nice error message in case of count mismatch.
+ """
+ if not elen:
+ raise TypeError(f"{cls} is not a generic class")
+ alen = len(parameters)
+ if alen != elen:
+ expect_val = elen
+ if hasattr(cls, "__parameters__"):
+ parameters = [p for p in cls.__parameters__ if not _is_unpack(p)]
+
+ # deal with TypeVarLike defaults
+ # required TypeVarLikes cannot appear after a defaulted one.
+ if alen < elen:
+ # since we validate TypeVarLike default in _collect_type_vars
+ # or _collect_parameters we can safely check parameters[alen]
+ if getattr(parameters[alen], '__default__', None) is not None:
+ return
+
+ num_default_tv = sum(getattr(p, '__default__', None)
+ is not None for p in parameters)
+
+ elen -= num_default_tv
+
+ expect_val = f"at least {elen}"
+
+ raise TypeError(f"Too {'many' if alen > elen else 'few'} arguments"
+ f" for {cls}; actual {alen}, expected {expect_val}")
+
+typing._check_generic = _check_generic
+
+# Python 3.11+ _collect_type_vars was renamed to _collect_parameters
+if hasattr(typing, '_collect_type_vars'):
+ def _collect_type_vars(types, typevar_types=None):
+ """Collect all type variable contained in types in order of
+ first appearance (lexicographic order). For example::
+
+ _collect_type_vars((T, List[S, T])) == (T, S)
+ """
+ if typevar_types is None:
+ typevar_types = typing.TypeVar
+ tvars = []
+ # required TypeVarLike cannot appear after TypeVarLike with default
+ default_encountered = False
+ for t in types:
+ if (
+ isinstance(t, typevar_types) and
+ t not in tvars and
+ not _is_unpack(t)
+ ):
+ if getattr(t, '__default__', None) is not None:
+ default_encountered = True
+ elif default_encountered:
+ raise TypeError(f'Type parameter {t!r} without a default'
+ ' follows type parameter with a default')
+
+ tvars.append(t)
+ if _should_collect_from_parameters(t):
+ tvars.extend([t for t in t.__parameters__ if t not in tvars])
+ return tuple(tvars)
+
typing._collect_type_vars = _collect_type_vars
- typing._check_generic = _check_generic
+else:
+ def _collect_parameters(args):
+ """Collect all type variables and parameter specifications in args
+ in order of first appearance (lexicographic order).
+
+ For example::
+
+ assert _collect_parameters((T, Callable[P, T])) == (T, P)
+ """
+ parameters = []
+ # required TypeVarLike cannot appear after TypeVarLike with default
+ default_encountered = False
+ for t in args:
+ if isinstance(t, type):
+ # We don't want __parameters__ descriptor of a bare Python class.
+ pass
+ elif isinstance(t, tuple):
+ # `t` might be a tuple, when `ParamSpec` is substituted with
+ # `[T, int]`, or `[int, *Ts]`, etc.
+ for x in t:
+ for collected in _collect_parameters([x]):
+ if collected not in parameters:
+ parameters.append(collected)
+ elif hasattr(t, '__typing_subst__'):
+ if t not in parameters:
+ if getattr(t, '__default__', None) is not None:
+ default_encountered = True
+ elif default_encountered:
+ raise TypeError(f'Type parameter {t!r} without a default'
+ ' follows type parameter with a default')
+
+ parameters.append(t)
+ else:
+ for x in getattr(t, '__parameters__', ()):
+ if x not in parameters:
+ parameters.append(x)
+ return tuple(parameters)
-# Backport typing.NamedTuple as it exists in Python 3.12.
+ typing._collect_parameters = _collect_parameters
+
+# Backport typing.NamedTuple as it exists in Python 3.13.
# In 3.11, the ability to define generic `NamedTuple`s was supported.
# This was explicitly disallowed in 3.9-3.10, and only half-worked in <=3.8.
# On 3.12, we added __orig_bases__ to call-based NamedTuples
@@ -2639,11 +2853,35 @@ else:
class_getitem = typing.Generic.__class_getitem__.__func__
nm_tpl.__class_getitem__ = classmethod(class_getitem)
# update from user namespace without overriding special namedtuple attributes
- for key in ns:
+ for key, val in ns.items():
if key in _prohibited_namedtuple_fields:
raise AttributeError("Cannot overwrite NamedTuple attribute " + key)
- elif key not in _special_namedtuple_fields and key not in nm_tpl._fields:
- setattr(nm_tpl, key, ns[key])
+ elif key not in _special_namedtuple_fields:
+ if key not in nm_tpl._fields:
+ setattr(nm_tpl, key, ns[key])
+ try:
+ set_name = type(val).__set_name__
+ except AttributeError:
+ pass
+ else:
+ try:
+ set_name(val, nm_tpl, key)
+ except BaseException as e:
+ msg = (
+ f"Error calling __set_name__ on {type(val).__name__!r} "
+ f"instance {key!r} in {typename!r}"
+ )
+ # BaseException.add_note() existed on py311,
+ # but the __set_name__ machinery didn't start
+ # using add_note() until py312.
+ # Making sure exceptions are raised in the same way
+ # as in "normal" classes seems most important here.
+ if sys.version_info >= (3, 12):
+ e.add_note(msg)
+ raise
+ else:
+ raise RuntimeError(msg) from e
+
if typing.Generic in bases:
nm_tpl.__init_subclass__()
return nm_tpl
@@ -2655,7 +2893,7 @@ else:
return (_NamedTuple,)
@_ensure_subclassable(_namedtuple_mro_entries)
- def NamedTuple(__typename, __fields=_marker, **kwargs):
+ def NamedTuple(typename, fields=_marker, /, **kwargs):
"""Typed version of namedtuple.
Usage::
@@ -2675,7 +2913,7 @@ else:
Employee = NamedTuple('Employee', [('name', str), ('id', int)])
"""
- if __fields is _marker:
+ if fields is _marker:
if kwargs:
deprecated_thing = "Creating NamedTuple classes using keyword arguments"
deprecation_msg = (
@@ -2684,14 +2922,14 @@ else:
)
else:
deprecated_thing = "Failing to pass a value for the 'fields' parameter"
- example = f"`{__typename} = NamedTuple({__typename!r}, [])`"
+ example = f"`{typename} = NamedTuple({typename!r}, [])`"
deprecation_msg = (
"{name} is deprecated and will be disallowed in Python {remove}. "
"To create a NamedTuple class with 0 fields "
"using the functional syntax, "
"pass an empty list, e.g. "
) + example + "."
- elif __fields is None:
+ elif fields is None:
if kwargs:
raise TypeError(
"Cannot pass `None` as the 'fields' parameter "
@@ -2699,7 +2937,7 @@ else:
)
else:
deprecated_thing = "Passing `None` as the 'fields' parameter"
- example = f"`{__typename} = NamedTuple({__typename!r}, [])`"
+ example = f"`{typename} = NamedTuple({typename!r}, [])`"
deprecation_msg = (
"{name} is deprecated and will be disallowed in Python {remove}. "
"To create a NamedTuple class with 0 fields "
@@ -2709,27 +2947,17 @@ else:
elif kwargs:
raise TypeError("Either list of fields or keywords"
" can be provided to NamedTuple, not both")
- if __fields is _marker or __fields is None:
+ if fields is _marker or fields is None:
warnings.warn(
deprecation_msg.format(name=deprecated_thing, remove="3.15"),
DeprecationWarning,
stacklevel=2,
)
- __fields = kwargs.items()
- nt = _make_nmtuple(__typename, __fields, module=_caller())
+ fields = kwargs.items()
+ nt = _make_nmtuple(typename, fields, module=_caller())
nt.__orig_bases__ = (NamedTuple,)
return nt
- # On 3.8+, alter the signature so that it matches typing.NamedTuple.
- # The signature of typing.NamedTuple on >=3.8 is invalid syntax in Python 3.7,
- # so just leave the signature as it is on 3.7.
- if sys.version_info >= (3, 8):
- _new_signature = '(typename, fields=None, /, **kwargs)'
- if isinstance(NamedTuple, _types.FunctionType):
- NamedTuple.__text_signature__ = _new_signature
- else:
- NamedTuple.__call__.__text_signature__ = _new_signature
-
if hasattr(collections.abc, "Buffer"):
Buffer = collections.abc.Buffer
@@ -2764,7 +2992,7 @@ else:
if hasattr(_types, "get_original_bases"):
get_original_bases = _types.get_original_bases
else:
- def get_original_bases(__cls):
+ def get_original_bases(cls, /):
"""Return the class's "original" bases prior to modification by `__mro_entries__`.
Examples::
@@ -2786,14 +3014,11 @@ else:
assert get_original_bases(int) == (object,)
"""
try:
- return __cls.__orig_bases__
+ return cls.__dict__.get("__orig_bases__", cls.__bases__)
except AttributeError:
- try:
- return __cls.__bases__
- except AttributeError:
- raise TypeError(
- f'Expected an instance of type, not {type(__cls).__name__!r}'
- ) from None
+ raise TypeError(
+ f'Expected an instance of type, not {type(cls).__name__!r}'
+ ) from None
# NewType is a class on Python 3.10+, making it pickleable
@@ -2815,7 +3040,7 @@ else:
num = UserId(5) + 1 # type: int
"""
- def __call__(self, obj):
+ def __call__(self, obj, /):
return obj
def __init__(self, name, tp):
@@ -2920,13 +3145,13 @@ else:
# Setting this attribute closes the TypeAliasType from further modification
self.__name__ = name
- def __setattr__(self, __name: str, __value: object) -> None:
+ def __setattr__(self, name: str, value: object, /) -> None:
if hasattr(self, "__name__"):
- self._raise_attribute_error(__name)
- super().__setattr__(__name, __value)
+ self._raise_attribute_error(name)
+ super().__setattr__(name, value)
- def __delattr__(self, __name: str) -> Never:
- self._raise_attribute_error(__name)
+ def __delattr__(self, name: str, /) -> Never:
+ self._raise_attribute_error(name)
def _raise_attribute_error(self, name: str) -> Never:
# Match the Python 3.12 error messages exactly
@@ -2987,7 +3212,7 @@ if hasattr(typing, "is_protocol"):
is_protocol = typing.is_protocol
get_protocol_members = typing.get_protocol_members
else:
- def is_protocol(__tp: type) -> bool:
+ def is_protocol(tp: type, /) -> bool:
"""Return True if the given type is a Protocol.
Example::
@@ -3002,13 +3227,13 @@ else:
False
"""
return (
- isinstance(__tp, type)
- and getattr(__tp, '_is_protocol', False)
- and __tp is not Protocol
- and __tp is not getattr(typing, "Protocol", object())
+ isinstance(tp, type)
+ and getattr(tp, '_is_protocol', False)
+ and tp is not Protocol
+ and tp is not typing.Protocol
)
- def get_protocol_members(__tp: type) -> typing.FrozenSet[str]:
+ def get_protocol_members(tp: type, /) -> typing.FrozenSet[str]:
"""Return the set of members defined in a Protocol.
Example::
@@ -3022,11 +3247,46 @@ else:
Raise a TypeError for arguments that are not Protocols.
"""
- if not is_protocol(__tp):
- raise TypeError(f'{__tp!r} is not a Protocol')
- if hasattr(__tp, '__protocol_attrs__'):
- return frozenset(__tp.__protocol_attrs__)
- return frozenset(_get_protocol_attrs(__tp))
+ if not is_protocol(tp):
+ raise TypeError(f'{tp!r} is not a Protocol')
+ if hasattr(tp, '__protocol_attrs__'):
+ return frozenset(tp.__protocol_attrs__)
+ return frozenset(_get_protocol_attrs(tp))
+
+
+if hasattr(typing, "Doc"):
+ Doc = typing.Doc
+else:
+ class Doc:
+ """Define the documentation of a type annotation using ``Annotated``, to be
+ used in class attributes, function and method parameters, return values,
+ and variables.
+
+ The value should be a positional-only string literal to allow static tools
+ like editors and documentation generators to use it.
+
+ This complements docstrings.
+
+ The string value passed is available in the attribute ``documentation``.
+
+ Example::
+
+ >>> from typing_extensions import Annotated, Doc
+ >>> def hi(to: Annotated[str, Doc("Who to say hi to")]) -> None: ...
+ """
+ def __init__(self, documentation: str, /) -> None:
+ self.documentation = documentation
+
+ def __repr__(self) -> str:
+ return f"Doc({self.documentation!r})"
+
+ def __hash__(self) -> int:
+ return hash(self.documentation)
+
+ def __eq__(self, other: object) -> bool:
+ if not isinstance(other, Doc):
+ return NotImplemented
+ return self.documentation == other.documentation
# Aliases for items that have always been in typing.
diff --git a/contrib/python/pip/pip/_vendor/urllib3/_collections.py b/contrib/python/pip/pip/_vendor/urllib3/_collections.py
index da9857e986..bceb8451f0 100644
--- a/contrib/python/pip/pip/_vendor/urllib3/_collections.py
+++ b/contrib/python/pip/pip/_vendor/urllib3/_collections.py
@@ -268,6 +268,24 @@ class HTTPHeaderDict(MutableMapping):
else:
return vals[1:]
+ def _prepare_for_method_change(self):
+ """
+ Remove content-specific header fields before changing the request
+ method to GET or HEAD according to RFC 9110, Section 15.4.
+ """
+ content_specific_headers = [
+ "Content-Encoding",
+ "Content-Language",
+ "Content-Location",
+ "Content-Type",
+ "Content-Length",
+ "Digest",
+ "Last-Modified",
+ ]
+ for header in content_specific_headers:
+ self.discard(header)
+ return self
+
# Backwards compatibility for httplib
getheaders = getlist
getallmatchingheaders = getlist
diff --git a/contrib/python/pip/pip/_vendor/urllib3/_version.py b/contrib/python/pip/pip/_vendor/urllib3/_version.py
index cad75fb5df..85e725eaf4 100644
--- a/contrib/python/pip/pip/_vendor/urllib3/_version.py
+++ b/contrib/python/pip/pip/_vendor/urllib3/_version.py
@@ -1,2 +1,2 @@
# This file is protected via CODEOWNERS
-__version__ = "1.26.17"
+__version__ = "1.26.18"
diff --git a/contrib/python/pip/pip/_vendor/urllib3/connectionpool.py b/contrib/python/pip/pip/_vendor/urllib3/connectionpool.py
index 96844d9337..5a6adcbdc7 100644
--- a/contrib/python/pip/pip/_vendor/urllib3/connectionpool.py
+++ b/contrib/python/pip/pip/_vendor/urllib3/connectionpool.py
@@ -9,6 +9,7 @@ import warnings
from socket import error as SocketError
from socket import timeout as SocketTimeout
+from ._collections import HTTPHeaderDict
from .connection import (
BaseSSLError,
BrokenPipeError,
@@ -843,7 +844,11 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
redirect_location = redirect and response.get_redirect_location()
if redirect_location:
if response.status == 303:
+ # Change the method according to RFC 9110, Section 15.4.4.
method = "GET"
+ # And lose the body not to transfer anything sensitive.
+ body = None
+ headers = HTTPHeaderDict(headers)._prepare_for_method_change()
try:
retries = retries.increment(method, url, response=response, _pool=self)
diff --git a/contrib/python/pip/pip/_vendor/urllib3/contrib/securetransport.py b/contrib/python/pip/pip/_vendor/urllib3/contrib/securetransport.py
index 4a06bc69d5..722ee4e124 100644
--- a/contrib/python/pip/pip/_vendor/urllib3/contrib/securetransport.py
+++ b/contrib/python/pip/pip/_vendor/urllib3/contrib/securetransport.py
@@ -64,9 +64,8 @@ import struct
import threading
import weakref
-from pip._vendor import six
-
from .. import util
+from ..packages import six
from ..util.ssl_ import PROTOCOL_TLS_CLIENT
from ._securetransport.bindings import CoreFoundation, Security, SecurityConst
from ._securetransport.low_level import (
diff --git a/contrib/python/pip/pip/_vendor/urllib3/poolmanager.py b/contrib/python/pip/pip/_vendor/urllib3/poolmanager.py
index 14b10daf3a..fb51bf7d96 100644
--- a/contrib/python/pip/pip/_vendor/urllib3/poolmanager.py
+++ b/contrib/python/pip/pip/_vendor/urllib3/poolmanager.py
@@ -4,7 +4,7 @@ import collections
import functools
import logging
-from ._collections import RecentlyUsedContainer
+from ._collections import HTTPHeaderDict, RecentlyUsedContainer
from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool, port_by_scheme
from .exceptions import (
LocationValueError,
@@ -382,9 +382,12 @@ class PoolManager(RequestMethods):
# Support relative URLs for redirecting.
redirect_location = urljoin(url, redirect_location)
- # RFC 7231, Section 6.4.4
if response.status == 303:
+ # Change the method according to RFC 9110, Section 15.4.4.
method = "GET"
+ # And lose the body not to transfer anything sensitive.
+ kw["body"] = None
+ kw["headers"] = HTTPHeaderDict(kw["headers"])._prepare_for_method_change()
retries = kw.get("retries")
if not isinstance(retries, Retry):
diff --git a/contrib/python/pip/pip/_vendor/vendor.txt b/contrib/python/pip/pip/_vendor/vendor.txt
index 5554c38ecb..74eb58ae70 100644
--- a/contrib/python/pip/pip/_vendor/vendor.txt
+++ b/contrib/python/pip/pip/_vendor/vendor.txt
@@ -1,24 +1,19 @@
-CacheControl==0.13.1 # Make sure to update the license in pyproject.toml for this.
-colorama==0.4.6
+CacheControl==0.14.0
distlib==0.3.8
-distro==1.8.0
-msgpack==1.0.5
-packaging==21.3
-platformdirs==3.8.1
-pyparsing==3.1.0
+distro==1.9.0
+msgpack==1.0.8
+packaging==24.1
+platformdirs==4.2.1
pyproject-hooks==1.0.0
-requests==2.31.0
- certifi==2023.7.22
- chardet==5.1.0
- idna==3.4
- urllib3==1.26.17
-rich==13.4.2
- pygments==2.15.1
- typing_extensions==4.7.1
+requests==2.32.0
+ certifi==2024.2.2
+ idna==3.7
+ urllib3==1.26.18
+rich==13.7.1
+ pygments==2.17.2
+ typing_extensions==4.11.0
resolvelib==1.0.1
-setuptools==68.0.0
-six==1.16.0
-tenacity==8.2.2
+setuptools==69.5.1
+tenacity==8.2.3
tomli==2.0.1
-truststore==0.8.0
-webencodings==0.5.1
+truststore==0.9.1
diff --git a/contrib/python/pip/pip/_vendor/webencodings/__init__.py b/contrib/python/pip/pip/_vendor/webencodings/__init__.py
deleted file mode 100644
index d21d697c88..0000000000
--- a/contrib/python/pip/pip/_vendor/webencodings/__init__.py
+++ /dev/null
@@ -1,342 +0,0 @@
-# coding: utf-8
-"""
-
- webencodings
- ~~~~~~~~~~~~
-
- This is a Python implementation of the `WHATWG Encoding standard
- <http://encoding.spec.whatwg.org/>`. See README for details.
-
- :copyright: Copyright 2012 by Simon Sapin
- :license: BSD, see LICENSE for details.
-
-"""
-
-from __future__ import unicode_literals
-
-import codecs
-
-from .labels import LABELS
-
-
-VERSION = '0.5.1'
-
-
-# Some names in Encoding are not valid Python aliases. Remap these.
-PYTHON_NAMES = {
- 'iso-8859-8-i': 'iso-8859-8',
- 'x-mac-cyrillic': 'mac-cyrillic',
- 'macintosh': 'mac-roman',
- 'windows-874': 'cp874'}
-
-CACHE = {}
-
-
-def ascii_lower(string):
- r"""Transform (only) ASCII letters to lower case: A-Z is mapped to a-z.
-
- :param string: An Unicode string.
- :returns: A new Unicode string.
-
- This is used for `ASCII case-insensitive
- <http://encoding.spec.whatwg.org/#ascii-case-insensitive>`_
- matching of encoding labels.
- The same matching is also used, among other things,
- for `CSS keywords <http://dev.w3.org/csswg/css-values/#keywords>`_.
-
- This is different from the :meth:`~py:str.lower` method of Unicode strings
- which also affect non-ASCII characters,
- sometimes mapping them into the ASCII range:
-
- >>> keyword = u'Bac\N{KELVIN SIGN}ground'
- >>> assert keyword.lower() == u'background'
- >>> assert ascii_lower(keyword) != keyword.lower()
- >>> assert ascii_lower(keyword) == u'bac\N{KELVIN SIGN}ground'
-
- """
- # This turns out to be faster than unicode.translate()
- return string.encode('utf8').lower().decode('utf8')
-
-
-def lookup(label):
- """
- Look for an encoding by its label.
- This is the spec’s `get an encoding
- <http://encoding.spec.whatwg.org/#concept-encoding-get>`_ algorithm.
- Supported labels are listed there.
-
- :param label: A string.
- :returns:
- An :class:`Encoding` object, or :obj:`None` for an unknown label.
-
- """
- # Only strip ASCII whitespace: U+0009, U+000A, U+000C, U+000D, and U+0020.
- label = ascii_lower(label.strip('\t\n\f\r '))
- name = LABELS.get(label)
- if name is None:
- return None
- encoding = CACHE.get(name)
- if encoding is None:
- if name == 'x-user-defined':
- from .x_user_defined import codec_info
- else:
- python_name = PYTHON_NAMES.get(name, name)
- # Any python_name value that gets to here should be valid.
- codec_info = codecs.lookup(python_name)
- encoding = Encoding(name, codec_info)
- CACHE[name] = encoding
- return encoding
-
-
-def _get_encoding(encoding_or_label):
- """
- Accept either an encoding object or label.
-
- :param encoding: An :class:`Encoding` object or a label string.
- :returns: An :class:`Encoding` object.
- :raises: :exc:`~exceptions.LookupError` for an unknown label.
-
- """
- if hasattr(encoding_or_label, 'codec_info'):
- return encoding_or_label
-
- encoding = lookup(encoding_or_label)
- if encoding is None:
- raise LookupError('Unknown encoding label: %r' % encoding_or_label)
- return encoding
-
-
-class Encoding(object):
- """Reresents a character encoding such as UTF-8,
- that can be used for decoding or encoding.
-
- .. attribute:: name
-
- Canonical name of the encoding
-
- .. attribute:: codec_info
-
- The actual implementation of the encoding,
- a stdlib :class:`~codecs.CodecInfo` object.
- See :func:`codecs.register`.
-
- """
- def __init__(self, name, codec_info):
- self.name = name
- self.codec_info = codec_info
-
- def __repr__(self):
- return '<Encoding %s>' % self.name
-
-
-#: The UTF-8 encoding. Should be used for new content and formats.
-UTF8 = lookup('utf-8')
-
-_UTF16LE = lookup('utf-16le')
-_UTF16BE = lookup('utf-16be')
-
-
-def decode(input, fallback_encoding, errors='replace'):
- """
- Decode a single string.
-
- :param input: A byte string
- :param fallback_encoding:
- An :class:`Encoding` object or a label string.
- The encoding to use if :obj:`input` does note have a BOM.
- :param errors: Type of error handling. See :func:`codecs.register`.
- :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
- :return:
- A ``(output, encoding)`` tuple of an Unicode string
- and an :obj:`Encoding`.
-
- """
- # Fail early if `encoding` is an invalid label.
- fallback_encoding = _get_encoding(fallback_encoding)
- bom_encoding, input = _detect_bom(input)
- encoding = bom_encoding or fallback_encoding
- return encoding.codec_info.decode(input, errors)[0], encoding
-
-
-def _detect_bom(input):
- """Return (bom_encoding, input), with any BOM removed from the input."""
- if input.startswith(b'\xFF\xFE'):
- return _UTF16LE, input[2:]
- if input.startswith(b'\xFE\xFF'):
- return _UTF16BE, input[2:]
- if input.startswith(b'\xEF\xBB\xBF'):
- return UTF8, input[3:]
- return None, input
-
-
-def encode(input, encoding=UTF8, errors='strict'):
- """
- Encode a single string.
-
- :param input: An Unicode string.
- :param encoding: An :class:`Encoding` object or a label string.
- :param errors: Type of error handling. See :func:`codecs.register`.
- :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
- :return: A byte string.
-
- """
- return _get_encoding(encoding).codec_info.encode(input, errors)[0]
-
-
-def iter_decode(input, fallback_encoding, errors='replace'):
- """
- "Pull"-based decoder.
-
- :param input:
- An iterable of byte strings.
-
- The input is first consumed just enough to determine the encoding
- based on the precense of a BOM,
- then consumed on demand when the return value is.
- :param fallback_encoding:
- An :class:`Encoding` object or a label string.
- The encoding to use if :obj:`input` does note have a BOM.
- :param errors: Type of error handling. See :func:`codecs.register`.
- :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
- :returns:
- An ``(output, encoding)`` tuple.
- :obj:`output` is an iterable of Unicode strings,
- :obj:`encoding` is the :obj:`Encoding` that is being used.
-
- """
-
- decoder = IncrementalDecoder(fallback_encoding, errors)
- generator = _iter_decode_generator(input, decoder)
- encoding = next(generator)
- return generator, encoding
-
-
-def _iter_decode_generator(input, decoder):
- """Return a generator that first yields the :obj:`Encoding`,
- then yields output chukns as Unicode strings.
-
- """
- decode = decoder.decode
- input = iter(input)
- for chunck in input:
- output = decode(chunck)
- if output:
- assert decoder.encoding is not None
- yield decoder.encoding
- yield output
- break
- else:
- # Input exhausted without determining the encoding
- output = decode(b'', final=True)
- assert decoder.encoding is not None
- yield decoder.encoding
- if output:
- yield output
- return
-
- for chunck in input:
- output = decode(chunck)
- if output:
- yield output
- output = decode(b'', final=True)
- if output:
- yield output
-
-
-def iter_encode(input, encoding=UTF8, errors='strict'):
- """
- “Pull”-based encoder.
-
- :param input: An iterable of Unicode strings.
- :param encoding: An :class:`Encoding` object or a label string.
- :param errors: Type of error handling. See :func:`codecs.register`.
- :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
- :returns: An iterable of byte strings.
-
- """
- # Fail early if `encoding` is an invalid label.
- encode = IncrementalEncoder(encoding, errors).encode
- return _iter_encode_generator(input, encode)
-
-
-def _iter_encode_generator(input, encode):
- for chunck in input:
- output = encode(chunck)
- if output:
- yield output
- output = encode('', final=True)
- if output:
- yield output
-
-
-class IncrementalDecoder(object):
- """
- “Push”-based decoder.
-
- :param fallback_encoding:
- An :class:`Encoding` object or a label string.
- The encoding to use if :obj:`input` does note have a BOM.
- :param errors: Type of error handling. See :func:`codecs.register`.
- :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
-
- """
- def __init__(self, fallback_encoding, errors='replace'):
- # Fail early if `encoding` is an invalid label.
- self._fallback_encoding = _get_encoding(fallback_encoding)
- self._errors = errors
- self._buffer = b''
- self._decoder = None
- #: The actual :class:`Encoding` that is being used,
- #: or :obj:`None` if that is not determined yet.
- #: (Ie. if there is not enough input yet to determine
- #: if there is a BOM.)
- self.encoding = None # Not known yet.
-
- def decode(self, input, final=False):
- """Decode one chunk of the input.
-
- :param input: A byte string.
- :param final:
- Indicate that no more input is available.
- Must be :obj:`True` if this is the last call.
- :returns: An Unicode string.
-
- """
- decoder = self._decoder
- if decoder is not None:
- return decoder(input, final)
-
- input = self._buffer + input
- encoding, input = _detect_bom(input)
- if encoding is None:
- if len(input) < 3 and not final: # Not enough data yet.
- self._buffer = input
- return ''
- else: # No BOM
- encoding = self._fallback_encoding
- decoder = encoding.codec_info.incrementaldecoder(self._errors).decode
- self._decoder = decoder
- self.encoding = encoding
- return decoder(input, final)
-
-
-class IncrementalEncoder(object):
- """
- “Push”-based encoder.
-
- :param encoding: An :class:`Encoding` object or a label string.
- :param errors: Type of error handling. See :func:`codecs.register`.
- :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
-
- .. method:: encode(input, final=False)
-
- :param input: An Unicode string.
- :param final:
- Indicate that no more input is available.
- Must be :obj:`True` if this is the last call.
- :returns: A byte string.
-
- """
- def __init__(self, encoding=UTF8, errors='strict'):
- encoding = _get_encoding(encoding)
- self.encode = encoding.codec_info.incrementalencoder(errors).encode
diff --git a/contrib/python/pip/pip/_vendor/webencodings/labels.py b/contrib/python/pip/pip/_vendor/webencodings/labels.py
deleted file mode 100644
index 29cbf91ef7..0000000000
--- a/contrib/python/pip/pip/_vendor/webencodings/labels.py
+++ /dev/null
@@ -1,231 +0,0 @@
-"""
-
- webencodings.labels
- ~~~~~~~~~~~~~~~~~~~
-
- Map encoding labels to their name.
-
- :copyright: Copyright 2012 by Simon Sapin
- :license: BSD, see LICENSE for details.
-
-"""
-
-# XXX Do not edit!
-# This file is automatically generated by mklabels.py
-
-LABELS = {
- 'unicode-1-1-utf-8': 'utf-8',
- 'utf-8': 'utf-8',
- 'utf8': 'utf-8',
- '866': 'ibm866',
- 'cp866': 'ibm866',
- 'csibm866': 'ibm866',
- 'ibm866': 'ibm866',
- 'csisolatin2': 'iso-8859-2',
- 'iso-8859-2': 'iso-8859-2',
- 'iso-ir-101': 'iso-8859-2',
- 'iso8859-2': 'iso-8859-2',
- 'iso88592': 'iso-8859-2',
- 'iso_8859-2': 'iso-8859-2',
- 'iso_8859-2:1987': 'iso-8859-2',
- 'l2': 'iso-8859-2',
- 'latin2': 'iso-8859-2',
- 'csisolatin3': 'iso-8859-3',
- 'iso-8859-3': 'iso-8859-3',
- 'iso-ir-109': 'iso-8859-3',
- 'iso8859-3': 'iso-8859-3',
- 'iso88593': 'iso-8859-3',
- 'iso_8859-3': 'iso-8859-3',
- 'iso_8859-3:1988': 'iso-8859-3',
- 'l3': 'iso-8859-3',
- 'latin3': 'iso-8859-3',
- 'csisolatin4': 'iso-8859-4',
- 'iso-8859-4': 'iso-8859-4',
- 'iso-ir-110': 'iso-8859-4',
- 'iso8859-4': 'iso-8859-4',
- 'iso88594': 'iso-8859-4',
- 'iso_8859-4': 'iso-8859-4',
- 'iso_8859-4:1988': 'iso-8859-4',
- 'l4': 'iso-8859-4',
- 'latin4': 'iso-8859-4',
- 'csisolatincyrillic': 'iso-8859-5',
- 'cyrillic': 'iso-8859-5',
- 'iso-8859-5': 'iso-8859-5',
- 'iso-ir-144': 'iso-8859-5',
- 'iso8859-5': 'iso-8859-5',
- 'iso88595': 'iso-8859-5',
- 'iso_8859-5': 'iso-8859-5',
- 'iso_8859-5:1988': 'iso-8859-5',
- 'arabic': 'iso-8859-6',
- 'asmo-708': 'iso-8859-6',
- 'csiso88596e': 'iso-8859-6',
- 'csiso88596i': 'iso-8859-6',
- 'csisolatinarabic': 'iso-8859-6',
- 'ecma-114': 'iso-8859-6',
- 'iso-8859-6': 'iso-8859-6',
- 'iso-8859-6-e': 'iso-8859-6',
- 'iso-8859-6-i': 'iso-8859-6',
- 'iso-ir-127': 'iso-8859-6',
- 'iso8859-6': 'iso-8859-6',
- 'iso88596': 'iso-8859-6',
- 'iso_8859-6': 'iso-8859-6',
- 'iso_8859-6:1987': 'iso-8859-6',
- 'csisolatingreek': 'iso-8859-7',
- 'ecma-118': 'iso-8859-7',
- 'elot_928': 'iso-8859-7',
- 'greek': 'iso-8859-7',
- 'greek8': 'iso-8859-7',
- 'iso-8859-7': 'iso-8859-7',
- 'iso-ir-126': 'iso-8859-7',
- 'iso8859-7': 'iso-8859-7',
- 'iso88597': 'iso-8859-7',
- 'iso_8859-7': 'iso-8859-7',
- 'iso_8859-7:1987': 'iso-8859-7',
- 'sun_eu_greek': 'iso-8859-7',
- 'csiso88598e': 'iso-8859-8',
- 'csisolatinhebrew': 'iso-8859-8',
- 'hebrew': 'iso-8859-8',
- 'iso-8859-8': 'iso-8859-8',
- 'iso-8859-8-e': 'iso-8859-8',
- 'iso-ir-138': 'iso-8859-8',
- 'iso8859-8': 'iso-8859-8',
- 'iso88598': 'iso-8859-8',
- 'iso_8859-8': 'iso-8859-8',
- 'iso_8859-8:1988': 'iso-8859-8',
- 'visual': 'iso-8859-8',
- 'csiso88598i': 'iso-8859-8-i',
- 'iso-8859-8-i': 'iso-8859-8-i',
- 'logical': 'iso-8859-8-i',
- 'csisolatin6': 'iso-8859-10',
- 'iso-8859-10': 'iso-8859-10',
- 'iso-ir-157': 'iso-8859-10',
- 'iso8859-10': 'iso-8859-10',
- 'iso885910': 'iso-8859-10',
- 'l6': 'iso-8859-10',
- 'latin6': 'iso-8859-10',
- 'iso-8859-13': 'iso-8859-13',
- 'iso8859-13': 'iso-8859-13',
- 'iso885913': 'iso-8859-13',
- 'iso-8859-14': 'iso-8859-14',
- 'iso8859-14': 'iso-8859-14',
- 'iso885914': 'iso-8859-14',
- 'csisolatin9': 'iso-8859-15',
- 'iso-8859-15': 'iso-8859-15',
- 'iso8859-15': 'iso-8859-15',
- 'iso885915': 'iso-8859-15',
- 'iso_8859-15': 'iso-8859-15',
- 'l9': 'iso-8859-15',
- 'iso-8859-16': 'iso-8859-16',
- 'cskoi8r': 'koi8-r',
- 'koi': 'koi8-r',
- 'koi8': 'koi8-r',
- 'koi8-r': 'koi8-r',
- 'koi8_r': 'koi8-r',
- 'koi8-u': 'koi8-u',
- 'csmacintosh': 'macintosh',
- 'mac': 'macintosh',
- 'macintosh': 'macintosh',
- 'x-mac-roman': 'macintosh',
- 'dos-874': 'windows-874',
- 'iso-8859-11': 'windows-874',
- 'iso8859-11': 'windows-874',
- 'iso885911': 'windows-874',
- 'tis-620': 'windows-874',
- 'windows-874': 'windows-874',
- 'cp1250': 'windows-1250',
- 'windows-1250': 'windows-1250',
- 'x-cp1250': 'windows-1250',
- 'cp1251': 'windows-1251',
- 'windows-1251': 'windows-1251',
- 'x-cp1251': 'windows-1251',
- 'ansi_x3.4-1968': 'windows-1252',
- 'ascii': 'windows-1252',
- 'cp1252': 'windows-1252',
- 'cp819': 'windows-1252',
- 'csisolatin1': 'windows-1252',
- 'ibm819': 'windows-1252',
- 'iso-8859-1': 'windows-1252',
- 'iso-ir-100': 'windows-1252',
- 'iso8859-1': 'windows-1252',
- 'iso88591': 'windows-1252',
- 'iso_8859-1': 'windows-1252',
- 'iso_8859-1:1987': 'windows-1252',
- 'l1': 'windows-1252',
- 'latin1': 'windows-1252',
- 'us-ascii': 'windows-1252',
- 'windows-1252': 'windows-1252',
- 'x-cp1252': 'windows-1252',
- 'cp1253': 'windows-1253',
- 'windows-1253': 'windows-1253',
- 'x-cp1253': 'windows-1253',
- 'cp1254': 'windows-1254',
- 'csisolatin5': 'windows-1254',
- 'iso-8859-9': 'windows-1254',
- 'iso-ir-148': 'windows-1254',
- 'iso8859-9': 'windows-1254',
- 'iso88599': 'windows-1254',
- 'iso_8859-9': 'windows-1254',
- 'iso_8859-9:1989': 'windows-1254',
- 'l5': 'windows-1254',
- 'latin5': 'windows-1254',
- 'windows-1254': 'windows-1254',
- 'x-cp1254': 'windows-1254',
- 'cp1255': 'windows-1255',
- 'windows-1255': 'windows-1255',
- 'x-cp1255': 'windows-1255',
- 'cp1256': 'windows-1256',
- 'windows-1256': 'windows-1256',
- 'x-cp1256': 'windows-1256',
- 'cp1257': 'windows-1257',
- 'windows-1257': 'windows-1257',
- 'x-cp1257': 'windows-1257',
- 'cp1258': 'windows-1258',
- 'windows-1258': 'windows-1258',
- 'x-cp1258': 'windows-1258',
- 'x-mac-cyrillic': 'x-mac-cyrillic',
- 'x-mac-ukrainian': 'x-mac-cyrillic',
- 'chinese': 'gbk',
- 'csgb2312': 'gbk',
- 'csiso58gb231280': 'gbk',
- 'gb2312': 'gbk',
- 'gb_2312': 'gbk',
- 'gb_2312-80': 'gbk',
- 'gbk': 'gbk',
- 'iso-ir-58': 'gbk',
- 'x-gbk': 'gbk',
- 'gb18030': 'gb18030',
- 'hz-gb-2312': 'hz-gb-2312',
- 'big5': 'big5',
- 'big5-hkscs': 'big5',
- 'cn-big5': 'big5',
- 'csbig5': 'big5',
- 'x-x-big5': 'big5',
- 'cseucpkdfmtjapanese': 'euc-jp',
- 'euc-jp': 'euc-jp',
- 'x-euc-jp': 'euc-jp',
- 'csiso2022jp': 'iso-2022-jp',
- 'iso-2022-jp': 'iso-2022-jp',
- 'csshiftjis': 'shift_jis',
- 'ms_kanji': 'shift_jis',
- 'shift-jis': 'shift_jis',
- 'shift_jis': 'shift_jis',
- 'sjis': 'shift_jis',
- 'windows-31j': 'shift_jis',
- 'x-sjis': 'shift_jis',
- 'cseuckr': 'euc-kr',
- 'csksc56011987': 'euc-kr',
- 'euc-kr': 'euc-kr',
- 'iso-ir-149': 'euc-kr',
- 'korean': 'euc-kr',
- 'ks_c_5601-1987': 'euc-kr',
- 'ks_c_5601-1989': 'euc-kr',
- 'ksc5601': 'euc-kr',
- 'ksc_5601': 'euc-kr',
- 'windows-949': 'euc-kr',
- 'csiso2022kr': 'iso-2022-kr',
- 'iso-2022-kr': 'iso-2022-kr',
- 'utf-16be': 'utf-16be',
- 'utf-16': 'utf-16le',
- 'utf-16le': 'utf-16le',
- 'x-user-defined': 'x-user-defined',
-}
diff --git a/contrib/python/pip/pip/_vendor/webencodings/mklabels.py b/contrib/python/pip/pip/_vendor/webencodings/mklabels.py
deleted file mode 100644
index 295dc928ba..0000000000
--- a/contrib/python/pip/pip/_vendor/webencodings/mklabels.py
+++ /dev/null
@@ -1,59 +0,0 @@
-"""
-
- webencodings.mklabels
- ~~~~~~~~~~~~~~~~~~~~~
-
- Regenarate the webencodings.labels module.
-
- :copyright: Copyright 2012 by Simon Sapin
- :license: BSD, see LICENSE for details.
-
-"""
-
-import json
-try:
- from urllib import urlopen
-except ImportError:
- from urllib.request import urlopen
-
-
-def assert_lower(string):
- assert string == string.lower()
- return string
-
-
-def generate(url):
- parts = ['''\
-"""
-
- webencodings.labels
- ~~~~~~~~~~~~~~~~~~~
-
- Map encoding labels to their name.
-
- :copyright: Copyright 2012 by Simon Sapin
- :license: BSD, see LICENSE for details.
-
-"""
-
-# XXX Do not edit!
-# This file is automatically generated by mklabels.py
-
-LABELS = {
-''']
- labels = [
- (repr(assert_lower(label)).lstrip('u'),
- repr(encoding['name']).lstrip('u'))
- for category in json.loads(urlopen(url).read().decode('ascii'))
- for encoding in category['encodings']
- for label in encoding['labels']]
- max_len = max(len(label) for label, name in labels)
- parts.extend(
- ' %s:%s %s,\n' % (label, ' ' * (max_len - len(label)), name)
- for label, name in labels)
- parts.append('}')
- return ''.join(parts)
-
-
-if __name__ == '__main__':
- print(generate('http://encoding.spec.whatwg.org/encodings.json'))
diff --git a/contrib/python/pip/pip/_vendor/webencodings/x_user_defined.py b/contrib/python/pip/pip/_vendor/webencodings/x_user_defined.py
deleted file mode 100644
index d16e326024..0000000000
--- a/contrib/python/pip/pip/_vendor/webencodings/x_user_defined.py
+++ /dev/null
@@ -1,325 +0,0 @@
-# coding: utf-8
-"""
-
- webencodings.x_user_defined
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- An implementation of the x-user-defined encoding.
-
- :copyright: Copyright 2012 by Simon Sapin
- :license: BSD, see LICENSE for details.
-
-"""
-
-from __future__ import unicode_literals
-
-import codecs
-
-
-### Codec APIs
-
-class Codec(codecs.Codec):
-
- def encode(self, input, errors='strict'):
- return codecs.charmap_encode(input, errors, encoding_table)
-
- def decode(self, input, errors='strict'):
- return codecs.charmap_decode(input, errors, decoding_table)
-
-
-class IncrementalEncoder(codecs.IncrementalEncoder):
- def encode(self, input, final=False):
- return codecs.charmap_encode(input, self.errors, encoding_table)[0]
-
-
-class IncrementalDecoder(codecs.IncrementalDecoder):
- def decode(self, input, final=False):
- return codecs.charmap_decode(input, self.errors, decoding_table)[0]
-
-
-class StreamWriter(Codec, codecs.StreamWriter):
- pass
-
-
-class StreamReader(Codec, codecs.StreamReader):
- pass
-
-
-### encodings module API
-
-codec_info = codecs.CodecInfo(
- name='x-user-defined',
- encode=Codec().encode,
- decode=Codec().decode,
- incrementalencoder=IncrementalEncoder,
- incrementaldecoder=IncrementalDecoder,
- streamreader=StreamReader,
- streamwriter=StreamWriter,
-)
-
-
-### Decoding Table
-
-# Python 3:
-# for c in range(256): print(' %r' % chr(c if c < 128 else c + 0xF700))
-decoding_table = (
- '\x00'
- '\x01'
- '\x02'
- '\x03'
- '\x04'
- '\x05'
- '\x06'
- '\x07'
- '\x08'
- '\t'
- '\n'
- '\x0b'
- '\x0c'
- '\r'
- '\x0e'
- '\x0f'
- '\x10'
- '\x11'
- '\x12'
- '\x13'
- '\x14'
- '\x15'
- '\x16'
- '\x17'
- '\x18'
- '\x19'
- '\x1a'
- '\x1b'
- '\x1c'
- '\x1d'
- '\x1e'
- '\x1f'
- ' '
- '!'
- '"'
- '#'
- '$'
- '%'
- '&'
- "'"
- '('
- ')'
- '*'
- '+'
- ','
- '-'
- '.'
- '/'
- '0'
- '1'
- '2'
- '3'
- '4'
- '5'
- '6'
- '7'
- '8'
- '9'
- ':'
- ';'
- '<'
- '='
- '>'
- '?'
- '@'
- 'A'
- 'B'
- 'C'
- 'D'
- 'E'
- 'F'
- 'G'
- 'H'
- 'I'
- 'J'
- 'K'
- 'L'
- 'M'
- 'N'
- 'O'
- 'P'
- 'Q'
- 'R'
- 'S'
- 'T'
- 'U'
- 'V'
- 'W'
- 'X'
- 'Y'
- 'Z'
- '['
- '\\'
- ']'
- '^'
- '_'
- '`'
- 'a'
- 'b'
- 'c'
- 'd'
- 'e'
- 'f'
- 'g'
- 'h'
- 'i'
- 'j'
- 'k'
- 'l'
- 'm'
- 'n'
- 'o'
- 'p'
- 'q'
- 'r'
- 's'
- 't'
- 'u'
- 'v'
- 'w'
- 'x'
- 'y'
- 'z'
- '{'
- '|'
- '}'
- '~'
- '\x7f'
- '\uf780'
- '\uf781'
- '\uf782'
- '\uf783'
- '\uf784'
- '\uf785'
- '\uf786'
- '\uf787'
- '\uf788'
- '\uf789'
- '\uf78a'
- '\uf78b'
- '\uf78c'
- '\uf78d'
- '\uf78e'
- '\uf78f'
- '\uf790'
- '\uf791'
- '\uf792'
- '\uf793'
- '\uf794'
- '\uf795'
- '\uf796'
- '\uf797'
- '\uf798'
- '\uf799'
- '\uf79a'
- '\uf79b'
- '\uf79c'
- '\uf79d'
- '\uf79e'
- '\uf79f'
- '\uf7a0'
- '\uf7a1'
- '\uf7a2'
- '\uf7a3'
- '\uf7a4'
- '\uf7a5'
- '\uf7a6'
- '\uf7a7'
- '\uf7a8'
- '\uf7a9'
- '\uf7aa'
- '\uf7ab'
- '\uf7ac'
- '\uf7ad'
- '\uf7ae'
- '\uf7af'
- '\uf7b0'
- '\uf7b1'
- '\uf7b2'
- '\uf7b3'
- '\uf7b4'
- '\uf7b5'
- '\uf7b6'
- '\uf7b7'
- '\uf7b8'
- '\uf7b9'
- '\uf7ba'
- '\uf7bb'
- '\uf7bc'
- '\uf7bd'
- '\uf7be'
- '\uf7bf'
- '\uf7c0'
- '\uf7c1'
- '\uf7c2'
- '\uf7c3'
- '\uf7c4'
- '\uf7c5'
- '\uf7c6'
- '\uf7c7'
- '\uf7c8'
- '\uf7c9'
- '\uf7ca'
- '\uf7cb'
- '\uf7cc'
- '\uf7cd'
- '\uf7ce'
- '\uf7cf'
- '\uf7d0'
- '\uf7d1'
- '\uf7d2'
- '\uf7d3'
- '\uf7d4'
- '\uf7d5'
- '\uf7d6'
- '\uf7d7'
- '\uf7d8'
- '\uf7d9'
- '\uf7da'
- '\uf7db'
- '\uf7dc'
- '\uf7dd'
- '\uf7de'
- '\uf7df'
- '\uf7e0'
- '\uf7e1'
- '\uf7e2'
- '\uf7e3'
- '\uf7e4'
- '\uf7e5'
- '\uf7e6'
- '\uf7e7'
- '\uf7e8'
- '\uf7e9'
- '\uf7ea'
- '\uf7eb'
- '\uf7ec'
- '\uf7ed'
- '\uf7ee'
- '\uf7ef'
- '\uf7f0'
- '\uf7f1'
- '\uf7f2'
- '\uf7f3'
- '\uf7f4'
- '\uf7f5'
- '\uf7f6'
- '\uf7f7'
- '\uf7f8'
- '\uf7f9'
- '\uf7fa'
- '\uf7fb'
- '\uf7fc'
- '\uf7fd'
- '\uf7fe'
- '\uf7ff'
-)
-
-### Encoding table
-encoding_table = codecs.charmap_build(decoding_table)
diff --git a/contrib/python/pip/ya.make b/contrib/python/pip/ya.make
index c4fed6f97f..3f1511ba9c 100644
--- a/contrib/python/pip/ya.make
+++ b/contrib/python/pip/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(24.0)
+VERSION(24.1)
LICENSE(MIT)
@@ -26,6 +26,7 @@ PY_SRCS(
pip/_internal/cli/base_command.py
pip/_internal/cli/cmdoptions.py
pip/_internal/cli/command_context.py
+ pip/_internal/cli/index_command.py
pip/_internal/cli/main.py
pip/_internal/cli/main_parser.py
pip/_internal/cli/parser.py
@@ -149,7 +150,6 @@ PY_SRCS(
pip/_internal/utils/hashes.py
pip/_internal/utils/logging.py
pip/_internal/utils/misc.py
- pip/_internal/utils/models.py
pip/_internal/utils/packaging.py
pip/_internal/utils/setuptools_build.py
pip/_internal/utils/subprocess.py
@@ -181,60 +181,6 @@ PY_SRCS(
pip/_vendor/certifi/__init__.py
pip/_vendor/certifi/__main__.py
pip/_vendor/certifi/core.py
- pip/_vendor/chardet/__init__.py
- pip/_vendor/chardet/big5freq.py
- pip/_vendor/chardet/big5prober.py
- pip/_vendor/chardet/chardistribution.py
- pip/_vendor/chardet/charsetgroupprober.py
- pip/_vendor/chardet/charsetprober.py
- pip/_vendor/chardet/cli/__init__.py
- pip/_vendor/chardet/cli/chardetect.py
- pip/_vendor/chardet/codingstatemachine.py
- pip/_vendor/chardet/codingstatemachinedict.py
- pip/_vendor/chardet/cp949prober.py
- pip/_vendor/chardet/enums.py
- pip/_vendor/chardet/escprober.py
- pip/_vendor/chardet/escsm.py
- pip/_vendor/chardet/eucjpprober.py
- pip/_vendor/chardet/euckrfreq.py
- pip/_vendor/chardet/euckrprober.py
- pip/_vendor/chardet/euctwfreq.py
- pip/_vendor/chardet/euctwprober.py
- pip/_vendor/chardet/gb2312freq.py
- pip/_vendor/chardet/gb2312prober.py
- pip/_vendor/chardet/hebrewprober.py
- pip/_vendor/chardet/jisfreq.py
- pip/_vendor/chardet/johabfreq.py
- pip/_vendor/chardet/johabprober.py
- pip/_vendor/chardet/jpcntx.py
- pip/_vendor/chardet/langbulgarianmodel.py
- pip/_vendor/chardet/langgreekmodel.py
- pip/_vendor/chardet/langhebrewmodel.py
- pip/_vendor/chardet/langhungarianmodel.py
- pip/_vendor/chardet/langrussianmodel.py
- pip/_vendor/chardet/langthaimodel.py
- pip/_vendor/chardet/langturkishmodel.py
- pip/_vendor/chardet/latin1prober.py
- pip/_vendor/chardet/macromanprober.py
- pip/_vendor/chardet/mbcharsetprober.py
- pip/_vendor/chardet/mbcsgroupprober.py
- pip/_vendor/chardet/mbcssm.py
- pip/_vendor/chardet/metadata/__init__.py
- pip/_vendor/chardet/metadata/languages.py
- pip/_vendor/chardet/resultdict.py
- pip/_vendor/chardet/sbcharsetprober.py
- pip/_vendor/chardet/sbcsgroupprober.py
- pip/_vendor/chardet/sjisprober.py
- pip/_vendor/chardet/universaldetector.py
- pip/_vendor/chardet/utf1632prober.py
- pip/_vendor/chardet/utf8prober.py
- pip/_vendor/chardet/version.py
- pip/_vendor/colorama/__init__.py
- pip/_vendor/colorama/ansi.py
- pip/_vendor/colorama/ansitowin32.py
- pip/_vendor/colorama/initialise.py
- pip/_vendor/colorama/win32.py
- pip/_vendor/colorama/winterm.py
pip/_vendor/distlib/__init__.py
pip/_vendor/distlib/compat.py
pip/_vendor/distlib/database.py
@@ -263,12 +209,15 @@ PY_SRCS(
pip/_vendor/msgpack/exceptions.py
pip/_vendor/msgpack/ext.py
pip/_vendor/msgpack/fallback.py
- pip/_vendor/packaging/__about__.py
pip/_vendor/packaging/__init__.py
+ pip/_vendor/packaging/_elffile.py
pip/_vendor/packaging/_manylinux.py
pip/_vendor/packaging/_musllinux.py
+ pip/_vendor/packaging/_parser.py
pip/_vendor/packaging/_structures.py
+ pip/_vendor/packaging/_tokenizer.py
pip/_vendor/packaging/markers.py
+ pip/_vendor/packaging/metadata.py
pip/_vendor/packaging/requirements.py
pip/_vendor/packaging/specifiers.py
pip/_vendor/packaging/tags.py
@@ -315,20 +264,10 @@ PY_SRCS(
pip/_vendor/pygments/sphinxext.py
pip/_vendor/pygments/style.py
pip/_vendor/pygments/styles/__init__.py
+ pip/_vendor/pygments/styles/_mapping.py
pip/_vendor/pygments/token.py
pip/_vendor/pygments/unistring.py
pip/_vendor/pygments/util.py
- pip/_vendor/pyparsing/__init__.py
- pip/_vendor/pyparsing/actions.py
- pip/_vendor/pyparsing/common.py
- pip/_vendor/pyparsing/core.py
- pip/_vendor/pyparsing/diagram/__init__.py
- pip/_vendor/pyparsing/exceptions.py
- pip/_vendor/pyparsing/helpers.py
- pip/_vendor/pyparsing/results.py
- pip/_vendor/pyparsing/testing.py
- pip/_vendor/pyparsing/unicode.py
- pip/_vendor/pyparsing/util.py
pip/_vendor/pyproject_hooks/__init__.py
pip/_vendor/pyproject_hooks/_compat.py
pip/_vendor/pyproject_hooks/_impl.py
@@ -436,7 +375,6 @@ PY_SRCS(
pip/_vendor/rich/themes.py
pip/_vendor/rich/traceback.py
pip/_vendor/rich/tree.py
- pip/_vendor/six.py
pip/_vendor/tenacity/__init__.py
pip/_vendor/tenacity/_asyncio.py
pip/_vendor/tenacity/_utils.py
@@ -498,10 +436,6 @@ PY_SRCS(
pip/_vendor/urllib3/util/timeout.py
pip/_vendor/urllib3/util/url.py
pip/_vendor/urllib3/util/wait.py
- pip/_vendor/webencodings/__init__.py
- pip/_vendor/webencodings/labels.py
- pip/_vendor/webencodings/mklabels.py
- pip/_vendor/webencodings/x_user_defined.py
)
RESOURCE_FILES(
@@ -512,12 +446,10 @@ RESOURCE_FILES(
pip/_vendor/cachecontrol/py.typed
pip/_vendor/certifi/cacert.pem
pip/_vendor/certifi/py.typed
- pip/_vendor/chardet/py.typed
pip/_vendor/distro/py.typed
pip/_vendor/idna/py.typed
pip/_vendor/packaging/py.typed
pip/_vendor/platformdirs/py.typed
- pip/_vendor/pyparsing/py.typed
pip/_vendor/resolvelib/py.typed
pip/_vendor/rich/py.typed
pip/_vendor/tenacity/py.typed